DB2使用Hibernate拦截器实现脏读(with ur)

工作需要,最近要让开发的系统底层适应的数据库增加对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);

	@Override
	public String onPrepareStatement(String str) {

		// sql字符串全部转换成小写
		String compstr = str.toLowerCase();

		// 所有的select语句,只要是不包含with ur的。在后面都加上with ur
		if (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数据库时,能够进行脏读操作。

时间: 2024-08-03 13:17:34

DB2使用Hibernate拦截器实现脏读(with ur)的相关文章

笔记:Hibernate 拦截器和事件

Hibernate 在执行持久化的过程中,应用程序通常无法参与其中,通过事件框架,Hibernate 允许应用程序能响应特定的内部事件,从而允许实现某些通用的功能,或者对 Hibernate 进行扩展. 拦截器,通过 Interceptor 接口,可以从 Session 中回调应用程序的特定方法,这种机制可以让应用程序在持久化对象被保存.更新.删除或加载之前,检查并修改其属性,可以继承 EmptyInterceptor 类来重写拦截器业务,要使用拦截器需要如下几步: 继承 Interceptor

Hibernate拦截器(Interceptor)与事件监听器(Listener)

拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理. 监听器(Listener):其实功能与拦截器是相似的,但它实现原理不同,它是为每一个事件注册一个或多个监听器,一旦事件发生,则事件源通知所有监听该事件的监听器,然后监听器处理通知(观察者模式). 拦截器 Hibernate为我们提供了实现拦截器的接口org.hibernate.Interceptor,它里面提供了许多拦截事件.通常不需要实

Hibernate学习---第十三节:hibernate过滤器和拦截器的实现

一.hibernate 过滤器 1.在持久化映射文件中配置过滤器,代码如下: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-

Hibernate的拦截器和监听器

最近项目需要,用到了Hibernate的拦截器和监听器,有些小小心得,和大家分享下. 首先说说这两个东西.拦截器(Intercept):顾名思义,拦截操作,也就是在Hibernate做出动作之前会调用的方法.如果你有需要在Hibernate操作数据库之前想要做的操作,就需要用到这个东西了. 监听器(Listener):监听,就是监视Hibernate的一举一动,如果我们要获取Hibernate各种操作PO的前前后后的信息,那就要用到他了. 这里有的朋友可能就有疑问了,从上面的描述来看,这个监听器

调查管理系统 -(6)自定义Struts2的拦截器&amp;自定义UserAware接口&amp;Action中模型赋值问题&amp;Hibernate懒加载问题

1.对于一些功能,如我的调查或新建调查等,只有用户登录后才能进行操作,因此必须对用户是否登录进行判断.当用户登录后才能使用相应的功能,如果没有登录则需为用户导航到登录页面让其进行登录.这个功能可以通过自定义Struts2的拦截器来完成. 2.当用户登录之后,由于是将用户的信息保存在session中的.这样当一些Action中需要用到当前登录的用户的信息时需要手动的从session中获取,不太方便,因此我们声明了一个UserAware接口(即用户关注,类似于Struts2中的SessionAwar

hibernate 中的拦截器EmptyInterceptor接口功能

Interceptor接口提供了从会话(session)回调(callback)应用程序(application)的机制, 这种回调机制可以允许应用程序在持久化对象被保存.更新.删除或是加载之前,检查并(或)修改其 属性.一个可能的用途,就是用来跟踪审核(auditing)信息.例如:下面的这个拦截器,会在一个实现了 Auditable接口的对象被创建时自动地设置createTimestamp属性,并在实现了 Auditable接口的对象被更新时,同步更新lastUpdateTimestamp属

【struts2+hibernate+spring项目实战】用户登录校验(struts拦截器)

一.概述 项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高.但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB引用的空指针异常,造成数据错误,程序崩溃.因此需要一种机制保障每次发送请求执行Action中的方法之前校验用户是否处于登录状态.针对上述分析,可以选用两种实现方式.AOPAOP思想可以在任意方法执行前进行拦截,完成原始方法执行前的操作Struts2拦截器Struts2拦截器可以再Struts2的任意

过滤器、监听器、拦截器的区别

1.过滤器 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request.Response)统一设置编码,简化操作:同时还可进行逻辑判断,如用户是否已经登陆.有没有权限访问该页面等等工作.它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用

SpringMVC案例3----spring3.0项目拦截器、ajax、文件上传应用

依然是项目结构图和所需jar包图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fontsize/400/fil