java程序执行10万条update语句,如何提高效率

时间:2021-09-21 14:44:21
当materialInformations的长度为十万时,如何提高这段代码的效率?
java程序执行10万条update语句,如何提高效率

26 个解决方案

#1


hibernate批量删除或更新优化, 有意想不到的结果,也许这个可以实现jdbc啊executeSQL

#2


使用jdbcTemplate.execute(String sql);

#3


批处理 executebatch

#4





引用 1 楼 kky2010_110 的回复:
hibernate批量删除或更新优化, 有意想不到的结果,也许这个可以实现jdbc啊executeSQL


本人在此之前没有接触过hibernate批量更新,经大神指点,马上查阅资料,发现资料中的批量更新,得先把数据一次性查询出来,可我的十万条数据不能做到一次性查询啊!能告诉具体怎么做吗?

#5


对于这种list的数据更新,我一般的做法是先拼凑多条sql语句数组,然后批量执行sql数组。
这种方法可以提高io速率,但浪费了内存。

#6


引用 5 楼 FirstHelloWorld 的回复:
对于这种list的数据更新,我一般的做法是先拼凑多条sql语句数组,然后批量执行sql数组。
这种方法可以提高io速率,但浪费了内存。


这种做法与一条一条的执行有什么不同吗?

#7


用PreparedStatement的executeBatch来做

#8


什么系统需要10W条数据更新?

#9


引用 6 楼 u013654971 的回复:
Quote: 引用 5 楼 FirstHelloWorld 的回复:

对于这种list的数据更新,我一般的做法是先拼凑多条sql语句数组,然后批量执行sql数组。
这种方法可以提高io速率,但浪费了内存。


这种做法与一条一条的执行有什么不同吗?


可以减少与数据库交互时数据传输的次数

#10


大数据处理 估计都分区。。

#11


http://blog.csdn.net/uohzoaix/article/details/7372427  这里有你需要的

#12


jdbc批处理非常适合你这种情况,并且效率极高,大致代码如下

conn = JdbcUtil.getConnection();
i++;
String sql1 = "insert into user(name,password,email,birthday)
  values('kkk','123','abc@sina.com','1978-08-08')";
String sql2 = "update user set password='123456' where id=3";
st = conn.createStatement();
st.addBatch(sql1);  //把SQL语句加入到批命令中
st.addBatch(sql2);  //把SQL语句加入到批命令中
if(i%10000==0)
     st.executeBatch();

#13


引用 3 楼 ylpan 的回复:
批处理 executebatch


正解

#14


引用 11 楼 cao_yunfei 的回复:
http://blog.csdn.net/uohzoaix/article/details/7372427  这里有你需要的


这里的批量更新操作where条件是固定的,比如更新年龄大于1的记录的年龄都加1,where 条件就是age>1;而我的where 条件是不一样的,我要实现的是一个类似将id为1的年龄更新为2,将id为2的年龄更新为5,将id为3的年龄更新为2.....,

#15


用MySQL存储过程

#16


想提高速度 就需要在内存中操作。

#17


关注一下,坐等最佳方案。 java程序执行10万条update语句,如何提高效率

#18


jdbc批量删除修改更新,比框架的快一些  或者说存储过程   在操作的时候
记得及时的释放资源!

#19


PreparedStatement  的 executeBatch 是应该的, Hibernate 本身也是依赖于 JDBC 的嘛。总之我们要避免不必要的修改和减少网络通信的次数还要“提示数据库我们批量执行不需要每次重新编译SQL语句”,像Oracle 自动对编译过的SQL 缓存的技术并不见得所有数据库都默认开启需要我们通过 JDBC PreparedStatement 明确地提示数据库这样去做。

如果本来就是批量处理的,或许可以用数据库提供的从文件导入的工具来做,当然这就不通用了,主要是给夜间批量导入导出数据准备的,每家厂商的做法不一样,还可能要求导入和导出的双方版本相同。

#20


oracle么?

#21


不能使用 存储过程吗?这样更快一点。

#22


最好的办法是 存储过程

#23


用存储过程吧

#24


引用 8 楼 littlebrain4solving 的回复:
什么系统需要10W条数据更新?
什么玩意儿

#25


楼主我遇到和你一样的问题了,请问你是怎么解决的。

#26


引用 3 楼 ylpan 的回复:
批处理 executebatch

赞同

#1


hibernate批量删除或更新优化, 有意想不到的结果,也许这个可以实现jdbc啊executeSQL

#2


使用jdbcTemplate.execute(String sql);

#3


批处理 executebatch

#4





引用 1 楼 kky2010_110 的回复:
hibernate批量删除或更新优化, 有意想不到的结果,也许这个可以实现jdbc啊executeSQL


本人在此之前没有接触过hibernate批量更新,经大神指点,马上查阅资料,发现资料中的批量更新,得先把数据一次性查询出来,可我的十万条数据不能做到一次性查询啊!能告诉具体怎么做吗?

#5


对于这种list的数据更新,我一般的做法是先拼凑多条sql语句数组,然后批量执行sql数组。
这种方法可以提高io速率,但浪费了内存。

#6


引用 5 楼 FirstHelloWorld 的回复:
对于这种list的数据更新,我一般的做法是先拼凑多条sql语句数组,然后批量执行sql数组。
这种方法可以提高io速率,但浪费了内存。


这种做法与一条一条的执行有什么不同吗?

#7


用PreparedStatement的executeBatch来做

#8


什么系统需要10W条数据更新?

#9


引用 6 楼 u013654971 的回复:
Quote: 引用 5 楼 FirstHelloWorld 的回复:

对于这种list的数据更新,我一般的做法是先拼凑多条sql语句数组,然后批量执行sql数组。
这种方法可以提高io速率,但浪费了内存。


这种做法与一条一条的执行有什么不同吗?


可以减少与数据库交互时数据传输的次数

#10


大数据处理 估计都分区。。

#11


http://blog.csdn.net/uohzoaix/article/details/7372427  这里有你需要的

#12


jdbc批处理非常适合你这种情况,并且效率极高,大致代码如下

conn = JdbcUtil.getConnection();
i++;
String sql1 = "insert into user(name,password,email,birthday)
  values('kkk','123','abc@sina.com','1978-08-08')";
String sql2 = "update user set password='123456' where id=3";
st = conn.createStatement();
st.addBatch(sql1);  //把SQL语句加入到批命令中
st.addBatch(sql2);  //把SQL语句加入到批命令中
if(i%10000==0)
     st.executeBatch();

#13


引用 3 楼 ylpan 的回复:
批处理 executebatch


正解

#14


引用 11 楼 cao_yunfei 的回复:
http://blog.csdn.net/uohzoaix/article/details/7372427  这里有你需要的


这里的批量更新操作where条件是固定的,比如更新年龄大于1的记录的年龄都加1,where 条件就是age>1;而我的where 条件是不一样的,我要实现的是一个类似将id为1的年龄更新为2,将id为2的年龄更新为5,将id为3的年龄更新为2.....,

#15


用MySQL存储过程

#16


想提高速度 就需要在内存中操作。

#17


关注一下,坐等最佳方案。 java程序执行10万条update语句,如何提高效率

#18


jdbc批量删除修改更新,比框架的快一些  或者说存储过程   在操作的时候
记得及时的释放资源!

#19


PreparedStatement  的 executeBatch 是应该的, Hibernate 本身也是依赖于 JDBC 的嘛。总之我们要避免不必要的修改和减少网络通信的次数还要“提示数据库我们批量执行不需要每次重新编译SQL语句”,像Oracle 自动对编译过的SQL 缓存的技术并不见得所有数据库都默认开启需要我们通过 JDBC PreparedStatement 明确地提示数据库这样去做。

如果本来就是批量处理的,或许可以用数据库提供的从文件导入的工具来做,当然这就不通用了,主要是给夜间批量导入导出数据准备的,每家厂商的做法不一样,还可能要求导入和导出的双方版本相同。

#20


oracle么?

#21


不能使用 存储过程吗?这样更快一点。

#22


最好的办法是 存储过程

#23


用存储过程吧

#24


引用 8 楼 littlebrain4solving 的回复:
什么系统需要10W条数据更新?
什么玩意儿

#25


楼主我遇到和你一样的问题了,请问你是怎么解决的。

#26


引用 3 楼 ylpan 的回复:
批处理 executebatch

赞同