有一个需求更新5W数据,求一个好的方案,java,mysql,redis
可以采用数据库批量更新,比如一次更新50条
package me.gacl.demo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import me.gacl.utils.JdbcUtils;
import org.junit.Test;
/**
@date: 2014-9-20 下午10:05:45
*
*/
public class JdbcBatchHandleByStatement {
@Test
public void testJdbcBatchHandleByStatement(){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection();
String sql1 = "insert into testbatch(id,name) values(1,'aaa')";
String sql2 = "insert into testbatch(id,name) values(2,'bbb')";
String sql3 = "insert into testbatch(id,name) values(3,'CCC')";
String sql4 = "insert into testbatch(id,name) values(4,'DDD')";
String sql5 = "update testbatch set name='gacl' where id=1";
String sql6 = "insert into testbatch(id,name) values(5,'FFF')";
String sql7 = "delete from testbatch where id=2";
st = conn.createStatement();
//添加要批量执行的SQL
st.addBatch(sql1);
st.addBatch(sql2);
st.addBatch(sql3);
st.addBatch(sql4);
st.addBatch(sql5);
st.addBatch(sql6);
st.addBatch(sql7);
//执行批处理SQL语句
st.executeBatch();
//清除批处理命令
st.clearBatch();
}catch (Exception e) {
e.printStackTrace();
}finally{
JdbcUtils.release(conn, st, rs);
}
}
}
可以根据实际需要,将5万条数据集合截取为10个集合,每个集合是5千数据,然后开启10个线程,每个线程链接一次数据库,sql批量更新对应的5千数据。
https://ask.csdn.net/questions/698319
这个是和你类似的场景,我当时给出的答案,你的模仿着写就行了,望采纳!
就使用jdbc原始的方法,在建立连接后,
第一步 创建statement,
第二步 设置不自动提交,开启事务,conn.setAutoCommit(false)
第三步 执行sql,直接5w条sql一次批量执行,jdbc完全支持,项目中测过30w的5万执行6次,每次一分钟左右
第四步 判断是否有异常,有异常事务回滚,没有异常执行成功。
第五步 提交conn.commit()