public void batchUpdateXfen(String sql, List<XfenStats> list) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Connection con= session.connection();
PreparedStatement stmt = null;
int count=0;
try {
con.setAutoCommit(false);
stmt = con.prepareStatement(sql);
for(int i=0;i<list.size();i++){
count++;
stmt.setDouble(1,list.get(i).getSocre());
stmt.setString(2,list.get(i).getId());
stmt.addBatch();
if(count%500==0){
stmt.executeBatch();
con.commit();
stmt.clearBatch();
}
}
if(count%500!=0){
stmt.executeBatch();
con.commit();
stmt.clearBatch();
}
} catch (SQLException e) {
e.printStackTrace();
try {
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();}
}finally{try {if(stmt!=null){
stmt.close();}}
} catch (SQLException e) {e.printStackTrace();}}}
--
这里执行不报任何异常,但就是偶尔数据库里不更新数据。
找了很久也没发现问题。。。
是因为事务引起的吗? 配置文件里已经为hibernae 配了事物管理了。
开始session 是Session session = getHibernateTemplate().getSessionFactory().openSession();获取的。所以有时候不执行
后来改了,本地没问题。
但同事那还是有问题,。代码已经同步了。
在你的代码中,你使用了事务的方式来更新数据库。首先,你需要确保你的配置文件正确配置了事务管理器,并且正确开启了事务。其次,你的代码中使用了批处理的方式来执行更新操作。你可以在每500条数据后执行一次批处理,这样可以减少数据库的压力。
但是,如果你的代码中有异常发生,可能会导致事务回滚,从而导致数据没有被更新。为了避免这种情况,你应该在执行批处理之前关闭自动提交,然后在批处理执行完成后手动提交事务。
此外,你还需要注意在 finally 块中关闭数据库连接,这样可以确保数据库资源得到释放。
总的来说,你可以将你的代码修改为如下形式:
public void batchUpdateXfen(String sql, List<XfenStats> list) {
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
Connection con = session.connection();
PreparedStatement stmt = null;
int count = 0;
try {
con.setAutoCommit(false);
stmt = con.prepareStatement(sql);
for (int i = 0; i < list.size(); i++) {
count++;
stmt.setDouble(1, list.get(i).getSocre());
stmt.setString(2, list.get(i).getId());
stmt.addBatch();
if (count % 500 == 0) {
stmt.executeBatch();
con.commit();
stmt.clearBatch();
}
}
if (count % 500 != 0) {
stmt.executeBatch();
con.commit();
stmt.clearBatch();
}
} catch (SQLException e) {
e.printStackTrace();
try {
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
但是,这种方式存在一定的风险。如果你的数据量非常大,批处理操作可能会导致内存溢出或者数据库超时等问题。因此,你可以考虑使用其他方式来优化你的代码,比如使用 Hibernate 的 StatelessSession 或者使用 JDBC 的批处理方式来执行批量更新操作。