Jai*_*cia 5 java websphere hibernate web-applications
我正在开发一个Web应用程序.通常在请求开始时(通过体系结构代码),打开Hibernate会话以处理数据库事务.在请求结束时,会话将关闭.这适用于我们的所有事务,除了在一个特定实例中,我想从请求中触发一个线程.该线程将调用DB事务.
从线程中,我调用"sessionFactory.openSession()",并在此会话中执行我的事务.问题出现在请求完成时,线程本身可能不一定完成.因此,当请求完成并且线程尝试执行另一个DB事务时,我得到一个Hibernate会话已关闭!错误.
无论如何,从我的线程,我可以打开一个"干净"的会话,与请求开始时打开的会话无关?
您可以创建一个线程服务,它扩展HibernateAccessor为一个独立的 Spring 服务,在 处定义spring.xml,并向其发送您想要处理的代码/数据。像这样的东西:
Session session = SessionFactoryUtils.getSession(
getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator());
SessionHolder sessionHolder = null;
try {
applyFlushMode(session, false);
sessionHolder = new SessionHolder(session);
TransactionSynchronizationManager.bindResource(getSessionFactory(), sessionHolder);
Transaction t = getSessionFactory().getCurrentSession().beginTransaction();
try {
//execute your code here
t.commit();
} catch (Exception e) {
t.rollback();
log.error("Error", e);
}
try {
flushIfNecessary(sessionHolder.getSession(), false);
}
catch (HibernateException ex) {
throw convertHibernateAccessException(ex);
}
} finally {
SessionFactoryUtils.closeSession(sessionHolder.getSession());
TransactionSynchronizationManager.unbindResource(getSessionFactory());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5020 次 |
| 最近记录: |