另一个LazyInitializationException(与Spring + GSON结合使用)

时间:2011-09-23 07:53:51

标签: spring hibernate gson lazy-initialization

我想我是另一个不了解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

0 个答案:

没有答案