在hibernate中,有一級緩存session和二級緩存sessionFactory這些機制,一方面為編碼提供了便利,同時也會有一些副作用。比如有較大的數據量交互的話,緩存反而會降低效率。最近在做一個有關批量更新的程序,在調用session.update()之后,對象會保存在緩存中,如果數據量超過緩存的容量就會出錯。解決方法是:在hibernate中調用jdbc批量處理的API,使用原生的jdbc來進行批量操作。
但是這里又出現了新的問題,在hibernate4中,通過session是不能直接獲取到jdbc的connection。hibernate4中提供了一個session.dowork()的方法,用來處理原生的jdbc批量操作。work是一個接口,接口方法中的參數提供了jdbc的connection,只要需要用到jdbc,就用session.dowork();然后在這個方法中實現這個接口,我覺得這里的設計非常巧妙,可復用性較高。
public void setStatus(String arrMsgID[]) { //sql語句 String updateSql = "UPDATE tb_msgboard SET status ='1' WHERE msgID =?"; //通過session獲取事務 Transaction ts = hbmSession.beginTransaction(); hbmSession.doWork( //實現work接口,work接口中有一個execute方法,connection就是這個方法的參數,也就是在這里獲得jdbc的connection new Work(){ @Override public void execute(java.sql.Connection connection) throws SQLException { try { PreparedStatement stmt = connection.prepareStatement(updateSql); //這里進行批量操作 for (int i = 0; i < arrMsgID.length; i++) { stmt.setString(1, arrMsgID[i]); stmt.addBatch(); // 添加到批處理命令 } stmt.executeBatch(); ts.commit(); } catch (Exception e) { e.printStackTrace(); ts.rollback(); HibernateUtil.closeSession(hbmSession); } } }); HibernateUtil.closeSession(hbmSession); }