我想通过事务超时配置来让系统自动回滚长事务处理,解决长事务带来的系统性能问题,
系统框架:Struts1+spring1.2+hibernate3,
运行环境:win2003+websphere6+sqlserver2000。我在applicationContext.xml里配置事务超时的地方:
<prop key="update*">PROPAGATION_REQUIRED,timeout_5,ISOLATION_READ_COMMITTED</prop>我先在应用系统中查出要修改的记录,然后我在sqlserver的查询分析器中,用
begin transaction
update roletype='11' where roletypecode='CEO'
--rollback transaction
按主键把应用系统中要修改的那条记录锁住然后在应用系统中修改这条数据,正常的结果应该是,超过5秒后会返回超时异常。我测试的结果是在dao中用JdbcTemplate的excute执行数据库操作时,spring的事务超时配置起作用,但用hibernate方式操作数据库,spring的事务超时配置不起作用,难道是还有什么地方需要配置吗?请各位高手解答。以下是相关代码:dao实现类:
public class BaseDAO extends HibernateDaoSupport implements DAO
{ private Session session; private DataSource dataSource; //dataSource用于直接jdbc查询。 public Serializable create(Object obj)
{
return getHibernateTemplate().save(obj);
} public void update(Object obj)
{
getHibernateTemplate().saveOrUpdate(obj);
} public void delete(Object obj)
{
getHibernateTemplate().delete(obj);
} public Object load(Class entityClass, Serializable id)
{
Object obj = null;
try
{
obj = getHibernateTemplate().load(entityClass, id);
}
catch (Exception e)
{
}
return obj;
} public Object get(String className, Serializable id)
{
Object obj = null;
try
{
obj = getHibernateTemplate().get(className, id);
}
catch (Exception e)
{
}
return obj;
} public Object get(Class entityClass, Serializable id)
{
Object obj = null;
try
{
obj = getHibernateTemplate().get(entityClass, id);
}
catch (Exception e)
{
}
return obj;
}
public void evict(Object entity)
{
getHibernateTemplate().evict(entity);
}
public List query(String hsql)
{
return getHibernateTemplate().find(hsql);
} public List queryWithJDBC(String sql)
{
JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
return jTemplate.queryForList(sql);
} public List queryWithJDBC(String sql,Class elementType)
{
JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
return jTemplate.queryForList(sql,elementType);
} /**
*用于执行select count(*)方法
*/
public int queryForInt(String sql)
{
JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
return jTemplate.queryForInt(sql);
} /**
*用于执行方法
*/
public void excute(String sql)
{
JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
jTemplate.execute(sql);
} public DataSource getDataSource()
{
return dataSource;
} public void setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
} public Criteria createCriteria(Class entity)
{
session = getSession(true);
return session.createCriteria(entity);
} public void closeSession()
{
closeSessionIfNecessary(session);
} public HibernateTemplate getHTemplate()
{
return getHibernateTemplate();
}
public void refresh(Object obj){
getHibernateTemplate().refresh(obj);
} public void flush(){
getHibernateTemplate().flush();
}
}用以上DAO类中的create,update,delete方法操作数据库,事务超时就不起作用
系统框架:Struts1+spring1.2+hibernate3,
运行环境:win2003+websphere6+sqlserver2000。我在applicationContext.xml里配置事务超时的地方:
<prop key="update*">PROPAGATION_REQUIRED,timeout_5,ISOLATION_READ_COMMITTED</prop>我先在应用系统中查出要修改的记录,然后我在sqlserver的查询分析器中,用
begin transaction
update roletype='11' where roletypecode='CEO'
--rollback transaction
按主键把应用系统中要修改的那条记录锁住然后在应用系统中修改这条数据,正常的结果应该是,超过5秒后会返回超时异常。我测试的结果是在dao中用JdbcTemplate的excute执行数据库操作时,spring的事务超时配置起作用,但用hibernate方式操作数据库,spring的事务超时配置不起作用,难道是还有什么地方需要配置吗?请各位高手解答。以下是相关代码:dao实现类:
public class BaseDAO extends HibernateDaoSupport implements DAO
{ private Session session; private DataSource dataSource; //dataSource用于直接jdbc查询。 public Serializable create(Object obj)
{
return getHibernateTemplate().save(obj);
} public void update(Object obj)
{
getHibernateTemplate().saveOrUpdate(obj);
} public void delete(Object obj)
{
getHibernateTemplate().delete(obj);
} public Object load(Class entityClass, Serializable id)
{
Object obj = null;
try
{
obj = getHibernateTemplate().load(entityClass, id);
}
catch (Exception e)
{
}
return obj;
} public Object get(String className, Serializable id)
{
Object obj = null;
try
{
obj = getHibernateTemplate().get(className, id);
}
catch (Exception e)
{
}
return obj;
} public Object get(Class entityClass, Serializable id)
{
Object obj = null;
try
{
obj = getHibernateTemplate().get(entityClass, id);
}
catch (Exception e)
{
}
return obj;
}
public void evict(Object entity)
{
getHibernateTemplate().evict(entity);
}
public List query(String hsql)
{
return getHibernateTemplate().find(hsql);
} public List queryWithJDBC(String sql)
{
JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
return jTemplate.queryForList(sql);
} public List queryWithJDBC(String sql,Class elementType)
{
JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
return jTemplate.queryForList(sql,elementType);
} /**
*用于执行select count(*)方法
*/
public int queryForInt(String sql)
{
JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
return jTemplate.queryForInt(sql);
} /**
*用于执行方法
*/
public void excute(String sql)
{
JdbcTemplate jTemplate = new JdbcTemplate(getDataSource());
jTemplate.execute(sql);
} public DataSource getDataSource()
{
return dataSource;
} public void setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
} public Criteria createCriteria(Class entity)
{
session = getSession(true);
return session.createCriteria(entity);
} public void closeSession()
{
closeSessionIfNecessary(session);
} public HibernateTemplate getHTemplate()
{
return getHibernateTemplate();
}
public void refresh(Object obj){
getHibernateTemplate().refresh(obj);
} public void flush(){
getHibernateTemplate().flush();
}
}用以上DAO类中的create,update,delete方法操作数据库,事务超时就不起作用
解决方案 »
- 如何在tag的处理类中使用其他tag?
- MyEclipse起server报错
- 学JSP要用到哪个编译软件?
- 急急急急~!!!!!请高手帮忙.
- Tomcat Administration 的密码和用户名是什么?求高手解答疑惑 Please Help
- 在javascript怎样判断按了键盘的上、下、左、右键
- jdbc连接mysql数据库的问题,求大虾帮忙!!!
- 局域网中JSP服务访问
- jsp的环境是什么?
- ie8 combotree多值回显异常
- 急啊!!关于HTTP Status 503 - This application is not currently available
- FileSystemObject如何在本地访问时除去警告/减少警告次数
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="resourceRef">
<value>true</value>
</property>
<property name="jndiEnvironment">
<props>
<prop key="java.naming.factory.initial">
com.ibm.websphere.naming.WsnInitialContextFactory
</prop>
</props>
</property>
<property name="jndiName">
<value>UPSDataSource</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="configLocation">
<value>ups.hibernate.cfg.xml</value>
</property>
</bean>
<!--数据库的事务管理器
-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- 数据库的事务拦截的方法名配置
-->
<bean id="txAttributes" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props>
<!-- normal -->
<prop key="set*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
<prop key="insert*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
<prop key="update*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
<prop key="delete*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
<prop key="save*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
</props>
</property>
</bean>
<!-- 数据库的事务拦截器配置
-->
<bean id="txInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="transactionAttributeSource">
<ref bean="txAttributes" />
</property>
</bean>
<!-- 数据库的事务代理配置
-->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<value>txInterceptor</value>
</list>
</property>
<property name="beanNames">
<list>
<value>systemSet</value>
<value>applyManage</value>
</list>
</property>
</bean>