我想我是另一个不了解Hibernate会话的新手,可能是Spring的TransactionTemplate,不知道。这是我的故事。
我正在使用Hibernate 3.5.5-Final,Spring 3.0.4.RELEASE,试图只使用注释(对于Hibernate以及Spring MVC)。
我的第一次尝试是将@Transactional注释与正确设置的事务管理器结合使用。似乎最初工作,但从长远来看(约36小时)我开始一遍又一遍地接收“LazyInitializationExceptions”(从前几个小时运行良好的地方!)。
所以我使用Spring TransactionTemplate切换到手动事务。
基本上我在BaseService中有这样的受保护的东西
@Autowired
protected HibernateTransactionManager transactionManager;
protected void inTransaction(final Runnable runnable) {
TransactionTemplate transaction = new TransactionTemplate(transactionManager);
transaction.execute(new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(TransactionStatus status) {
try {
runnable.run();
return true;
} catch (Exception e) {
status.setRollbackOnly();
log.error("Exception in transaction.", e));
throw new RuntimeException("Exception in transaction.", e);
}
}
});
}
从服务的impls使用这个方法工作正常,我没有看到LazyInitializationException 10天(使用这个单独的应用程序24 * 7运行Tomcat 10天,没有重启)...但不是箍!它再次弹出: - /
LazyInitializationException来自“inTransaction”方法下的地方,并且没有涉及“inTransaction递归”,所以我很确定我应该在相同的Hibernate会话中处于相同的事务中。没有涉及“来自先前会话的数据”(就我的代码而言,服务层打开事务,从Hibernate收集所需的所有数据,处理它并返回一些结果==服务不记得其他顶级服务)< / p>
我没有描述我的应用程序(我甚至不知道如何在长时间运行中如何正确地执行此操作,例如10天),但我唯一的猜测是我在某处泄漏内存并且JVM达到堆限制。 。 在Spring或Hibernat中是否有一些“SoftReferences”?我不知道......
另一个有趣的事情是,当我尝试使用Google GSON序列化程序将结果序列化为JSON时,总会发生异常。我知道,它不使用getter ...我有自己的修补版本,使用getter而不是实际字段(所以我确保不要绕过Hibernate代理机制),你觉得它可能在这里起作用吗?
最后一件有趣的事情是,异常总是在单一服务方法(不是其他任何地方)中出现问题,这让我疯狂,因为这种方法尽可能简单愚蠢(没有极端数据库操作,只是加载数据并使用lazy-fetching将它们序列化为JSON),呵呵???
有人有什么建议我该怎么办?你有类似的经历吗?
谢谢, 的Jakub