使用批量插入(Batch Insert)是J2EE DAO高效保存数据库的核心技巧。在JDBC中,通过PreparedStatement的addBatch()和executeBatch()方法,可以将多条INSERT语句批量提交,一次性执行,大幅减少数据库往返次数。示例代码:
public void batchSave(List
String sql = "INSERT INTO table (col1, col2) VALUES (?, ?)";r/> try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
for (Entity e : entities) {
pstmt.setString(1, e.getCol1());
pstmt.setString(2, e.getCol2());
pstmt.addBatch();
}
pstmt.executeBatch();
}
} 这能将性能提升10倍以上。
开发者热议:连接池优化
开发者在论坛热议,J2EE项目中DAO保存数据时,必须用连接池如HikariCP或C3P0,避免每次new Connection()。配置数据源:
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db" />
<property name="username" value="root" />
<property name="maximumPoolSize" value="20" />
</bean> 这样DAO层注入DataSource,就能复用连接,节省时间。
性能优化:事务批量提交
最佳实践是用@Transactional注解包裹DAO的save方法,并设置事务隔离级别。Spring中:
@Service
public class UserDao {
@Transactional(rollbackFor = Exception.class)
public void saveUsers(List<User> users) {
// 批量save逻辑
}
} 开启事务后,批量操作只提交一次commit,减少锁争用,性能翻倍。开发者测试显示,单条insert是0.1s,批量后0.01s。
DAO设计模式:ORM vs 纯JDBC
热议中,有人坚持纯JDBC DAO,因为MyBatis或Hibernate的ORM有额外开销。纯JDBC DAO示例:
public class SimpleDao {
public int save(Object obj) {
String sql = "INSERT INTO ...";r/> // executeUpdate
return generatedKey;
}
} 但多数开发者推荐MyBatis的批量insert,配置mapper.xml的foreach标签:
<insert id="batchInsert">
<foreach collection="list" item="item" separator=",">
(#{item.id}, #{item.name})
</foreach>
</insert> 简单高效。
索引与SQL优化实战
保存前确保主键和频繁查询字段有索引。开发者分享:DAO中用EXPLAIN分析SQL,避免全表扫描。优化技巧:用UPSERT(INSERT ... ON DUPLICATE KEY UPDATE),一次语句搞定插入或更新:
INSERT INTO table (id, name) VALUES (1, 'test') ON DUPLICATE KEY UPDATE name='test'; 这在高并发保存场景下,性能最佳。
缓存与异步保存
高级技巧:DAO不直接save,用Redis缓存队列,异步线程批量持久化数据库。代码框架:
public void saveAsync(Entity e) {
redisTemplate.opsForList().leftPush("saveQueue", JSON.toJSONString(e));
}
// 定时任务消费队列批量save 开发者反馈,QPS从1000升到5000。
FAQ
Q: J2EE DAO批量保存多少条数据合适?
A: 一般500-1000条一批,根据内存和数据库配置调整,避免OOM。
Q: 如何处理批量保存失败?
A: 用try-catch捕获BatchUpdateException,分析失败索引,部分回滚。
Q: Spring Boot中DAO怎么配置批量?
A: 在application.yml设置spring.jpa.properties.hibernate.jdbc.batch_size=100。
Q: MyBatis批量insert支持哪些数据库?
A: 支持MySQL、Oracle、PostgreSQL等主流数据库。