在 Java 开发中,DAO(Data Access Object) 是业务层与数据库之间的桥梁。提高 DAO 的效率,通常从减少数据库访问、优化 SQL、合理使用框架与缓存、并发与连接管理几个方面入手。下面系统地总结常见且实用的优化手段。
避免一条一条地 insert / update。
// JDBC 批量
PreparedStatement ps = conn.prepareStatement(sql);
for (User u : users) {
ps.setString(1, u.getName());
ps.addBatch();
}
ps.executeBatch();
MyBatis 示例:
<insert id="batchInsert" parameterType="list">
insert into user(name) values
<foreach collection="list" item="u" separator=",">
(#{u.name})
</foreach>
</insert>
✅ 适用:导入数据、日志写入
-- 不推荐
SELECT * FROM user;
-- 推荐
SELECT id, name FROM user;
SELECT * FROM user LIMIT 10 OFFSET 20;
避免一次性加载百万数据到内存。
WHERE DATE(create_time) = '2023-01-01' -- 不走索引
错误示例:
List<User> users = userDao.findAll();
for (User u : users) {
u.setOrders(orderDao.findByUserId(u.getId()));
}
优化方式:
<collection>@EntityGraph / fetch joinresultMap 避免重复映射ExecutorType.BATCHSqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
interface UserDto {
String getName();
Integer getAge();
}
EntityManager 批量处理常见连接池:
spring:
datasource:
hikari:
maximum-pool-size: 20
✅ 避免频繁创建连接
使用 try-with-resources:
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
...
}
Cache<String, User> cache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
DAO 查询顺序:
Cache → DB → Cache
@Async
public CompletableFuture<Void> saveLog(Log log) {
logDao.insert(log);
return CompletableFuture.completedFuture(null);
}
适合:日志、统计、审计
常用方案:
❌ 一个 DAO 方法做太多事
✅ 单一职责 + 组合使用
@Transactional
public void process() {
// 长时间业务逻辑
}
✅ 事务只包数据库操作
✅ 少访问数据库
✅ 一次拿够数据
✅ SQL 简洁且走索引
✅ 合理使用缓存
✅ 连接池 + 批量 + 异步
如果你愿意,可以告诉我:
我可以给你针对性的优化方案或代码示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。