I have written a method insert() in which I am trying to use JDBC Batch for inserting half a million records into a MySQL database:
public void insert(int nameListId, String[] names) {
String sql = "INSERT INTO name_list_subscribers (name_list_id, name, date_added)"+" VALUES (?, ?, NOW())";
Connection conn = null;
PreparedStatement ps = null;
try{
conn = getConnection();
ps = conn.prepareStatement(sql);
for(String s : names ){
ps.setInt(1, nameListId);
ps.setString(2, s);
ps.addBatch();
}
ps.executeBatch();
}catch(SQLException e){
throw new RuntimeException(e);
}finally{
closeDbResources(ps, null, conn);
}
}
But whenever I try to run this method, I get the following error:
java.lang.OutOfMemoryError: Java heap space
com.mysql.jdbc.ServerPreparedStatement$BatchedBindValues.<init>(ServerPreparedStatement.java:72)
com.mysql.jdbc.ServerPreparedStatement.addBatch(ServerPreparedStatement.java:330)
org.apache.commons.dbcp.DelegatingPreparedStatement.addBatch(DelegatingPreparedStatement.java:171)
If I replace ps.addBatch() with ps.executeUpdate() and remove ps.executeBatch(), it works fine, though it takes some time. Please let me know if you know if using Batch is appropriate in this situation, and if it is, then why does it give OurOfMemoryError?
It is out of memory because it hold all the transaction in memory and only send it over to the database when you call executeBatch.
If you don't need it to be atomic and would like the get better performance, you can keep a counter and call executeBatch every n number of records.
public void insert(int nameListId, String[] names) {
String sql = "INSERT INTO name_list_subscribers (name_list_id, name, date_added)"+" VALUES (?, ?, NOW())";
Connection conn = null;
PreparedStatement ps = null;
try{
conn = getConnection();
ps = conn.prepareStatement(sql);
int icount = 0;
for(String s : names ){
ps.setInt(1, nameListId);
ps.setString(2, s);
ps.addBatch();
if(icount%1000 == 0){
ps.executeBatch();
ps.clearBatch();
}
icount++;
}
ps.executeBatch();
}catch(SQLException e){
throw new RuntimeException(e);
}finally{
closeDbResources(ps, null, conn);
}
}
分享到:
相关推荐
探索者需要插件,批量插入计算书,很实惠,很实用的的插件!!!
1. MongoDB批量Insert操作: MongoDB是一个NoSQL数据库,以JSON格式的文档存储数据。批量插入可以使用`insertMany()`方法,它接受一个文档数组作为参数。例如,在Java中,我们可以创建一个`Document`对象数组,然后...
在数据库操作中,批量插入(Batch Insert)是一种提高性能的有效方式,尤其是在处理大量数据时。本文将探讨Mybatis和JDBC在批量插入MySQL数据库时的性能差异,并提供相关的测试资源。 首先,JDBC(Java Database ...
同时,可以设置`Statement`的`batchSize`属性,指定在提交之前应累积多少条SQL语句。 此外,`PreparedStatement`通常比`Statement`更安全且性能更好,因为它允许预编译SQL语句,防止SQL注入攻击。如果数据来自不...
`hibernate.jdbc.batch_size`是Hibernate配置中的一个重要参数,用于控制批处理操作的大小。本文将深入探讨这个参数的意义、作用以及如何在实际应用中进行测试。 批量插入是提高数据库性能的有效手段,特别是在大量...
【quest-spring-jdbc-insert】项目是一个专注于Spring JDBC插入操作的示例库,它展示了如何在Java应用程序中使用Spring框架的JDBC模块进行数据插入。这个项目对于学习和理解Spring JDBC的基本用法,以及如何有效地...
此外,还可以通过分析Hibernate的性能指标来调整诸如`hibernate.jdbc.batch_size`等参数,以达到最佳性能平衡。 总之,通过上述几个方面的优化措施,可以显著提高基于Hibernate构建的应用程序的性能。在实际应用中...
context.BulkInsert(entitiesList, options => options.BatchSize = 1000); ``` 5. **注意事项**: - 批量插入可能不适用于那些需要事务控制的场景,因为一旦开始批量插入,所有操作将作为一个单元进行,如果...
6. **批处理(Batch Processing)**:对于需要执行大量相似SQL语句的情况,JDBC提供批处理功能,允许一次发送多个SQL语句,从而提高效率。 7. **JDBC URL**:每个数据库驱动都有一个特定的JDBC URL格式,用于标识要...
Java Database Connectivity(JDBC)是Java编程语言中用于与各种数据库进行交互的一组接口和类。JDBC2000和JDBC2005分别指的是在2000年和2005年时期的JDBC规范版本。这两个版本都是在Java数据库连接技术的发展历程中...
批处理(Batch Updates)则可以一次发送多个SQL语句,减少网络通信开销。 7. **查询结果集处理**: 结果集(ResultSet)对象是执行SQL查询后返回的结果,可以通过迭代遍历,获取每一行数据。同时,达梦JDBC驱动也...
在"mp-batch-insert.zip"这个压缩包中,很可能包含了一种改进的批量插入实现,可能是为了提高性能或优化数据库操作。通常,这样的实现可能包括以下方面: 1. **批处理(Batch Processing)**:批处理是数据库提供的...
String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "John Doe"); pstmt.setString(2, "john@example.com"); pstmt....
在实际应用中,"batchinsert"可能是一个包含示例代码的文件,展示了如何使用JDBC批量插入Blob字段的具体实现。通过研究和理解这些代码,你可以更好地掌握批量插入Blob数据的技巧,并根据自己的需求进行调整和优化。 ...
在IT领域,数据库操作是日常开发中的重要环节,特别是在处理大量数据时,高效的批量插入(Batch Insert)和更新(Batch Update)技术显得尤为关键。"BatchInsertAndUpdate Test"这个项目显然是针对这一需求进行的...
4. **批处理更新(Batch Update)**: - 批处理可以提高数据库操作的性能,避免频繁的网络通信。通过 `Statement` 对象的 `addBatch(String sql)` 方法添加SQL语句到批处理队列,然后通过 `executeBatch()` 执行...
将选项spring.jpa.properties.hibernate.jdbc.batch_size设置为所需的值。 将您的saveAll()方法与准备插入的实体列表一起使用。 运行此应用程序,然后查看日志: 2018-06-16 00:23:14.698 INFO 9128 --- [ main]...
- **DML操作**:INSERT、UPDATE和DELETE语句,用于修改数据库中的数据。 - **事务处理**:支持开始、提交和回滚事务,保证数据的一致性和完整性。 - **元数据获取**:获取表结构、列信息、索引等数据库元数据。 - **...
1. **创建(Create)**:在JDBC中,创建数据通常涉及到创建SQL的INSERT语句,用来向数据库表中插入新的记录。通过`PreparedStatement`接口的`executeUpdate()`方法执行这些语句。 2. **读取(Read)**:查询数据是...
在上述代码中,`batchInsert`方法接收一个用户列表,将每个用户的属性封装成Object数组,然后调用`batchUpdate`方法进行批量插入。注意,`batchUpdate`接受一个SQL语句和一个二维数组,数组的每一行代表一个参数组,...