hibernate4使用原生jdbc進行批處理


在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);
	}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM