这世界将没有我 2013-06-04 14:57 采纳率: 0%
浏览 1139

关于 JDBC批处理的问题【求助】

我直接帖代码吧

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();获取的。所以有时候不执行
后来改了,本地没问题。
但同事那还是有问题,。代码已经同步了。

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2022-12-26 18:00
    关注

    在你的代码中,你使用了事务的方式来更新数据库。首先,你需要确保你的配置文件正确配置了事务管理器,并且正确开启了事务。其次,你的代码中使用了批处理的方式来执行更新操作。你可以在每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 的批处理方式来执行批量更新操作。

    评论

报告相同问题?

悬赏问题

  • ¥15 怎么获取下面的: glove_word2id.json和 glove_numpy.npy 这两个文件
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug