DB2使用Hibernate攔截器實現髒讀(with ur),db2hibernate
工作需要,最近要讓開發的系統底層適應的資料庫增加對DB2的支援,雖然使用了DB2,但是就效能考慮,和業務需要。查詢不需要進行事務控制,也就是DB2的多種事務安全層級,在查詢時,不需要關注更新和插入。因此需要查詢支援髒讀。每條查詢的sql語句後面都要增加with ur選項。
在網上找了很久,很多人在問,但是沒有結果。最後,在google找到解決辦法,使用hibernate攔截器,進行攔截。下面是代碼:
import org.hibernate.EmptyInterceptor;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * hibernate配置DB2時,為了防止高事務安全層級對查詢造成影響,因此查詢需要單獨制定with ur。 * 此類是hibernate攔截器,用於給select的查詢末尾增加with ur選項,以防止查詢時鎖住資料庫庫。 * @author superxb * */public class DB2Interceptor extends EmptyInterceptor {private static final long serialVersionUID = 1L;private static final Logger logger = LoggerFactory.getLogger(DB2Interceptor.class);@Overridepublic String onPrepareStatement(String str) {// sql字串全部轉換成小寫String compstr = str.toLowerCase();// 所有的select語句,只要是不包含with ur的。在後面都加上with urif (compstr.matches("^select.*") && !compstr.matches(".*for update.*")) {if (!compstr.matches(".*with ur.*")) {str += " with ur ";logger.debug("Appending \"WITH UR\" to query.");}}return str;}}
攔截器建立好後,配置在hibernate的sessionFactory即可。配置參考如下:
<bean id="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource"><ref local="dataSource" /></property><!-- 專門針對DB2增加的攔截器,在所有的sql後面增加 whit ur控制事務層級 --><property name="entityInterceptor"><bean class="interceptor.DB2Interceptor" /></property>…………
如上配置之後。預設的,只要是select開頭的sql語句,其中未包含with ur的話,就會在末尾增加with ur,以確保事務安全層級,實現hibernate映射DB2資料庫時,能夠進行髒讀操作。
Java通過jdbc串連DB2可以使用with as( select
session.createQuery()裡邊要寫hql。
你寫那句是個sql,不好使。
session.createSQLQuery(),可以執行sql。
但你用hibernate了,還是考慮hql實現吧,你那個查詢又不是多複雜。
我也沒看明白你為啥要用子查詢。
hibernate中 flush方法的運用
你把session.beginTransaction() ;
這個注釋掉試試,你用了事務,沒有提交,資料庫是沒有資料,應該是可以理解的