我们正在使用Spring& JBoss 4.2.3中的Hibernate正在调用外部系统,这可能需要一段时间,作为处理请求的一部分。为了消除长期存在的数据库锁,我们不会在外部调用返回之后写入我们的数据库。 但是Hibernate不喜欢没有事务,所以我们有一个只读事务,由Spring启动,直到我们进行写操作(在一个新的读写子事务中)。不幸的是,这仍然意味着我们在外部呼叫期间保留资源,即从池中分配的连接。 当执行的其余部分(之前和之后)需要一个时,有没有办法在没有正在进行的事务的情况下进行外部调用? 有没有更好的方法来推迟实际的交易,直到我们确实需要它并仍然让Hibernate满意为止?
答案 0 :(得分:0)
是否有必要在持久层中调用外部系统?在你达到持久性之前,在外面做这种事情似乎更合乎逻辑。
答案 1 :(得分:0)
您实际上不需要读取事务。
这是一个示例,其中read调用直接转到DAO对象,但是write调用是在事务中完成的(使用Spring的TransactionTemplate辅助对象):
public ContainerType getContainerType(Long id) {
return this.containerTypeDao.getContainerType(id);
}
public Long saveContainerType(final ContainerType containerType) {
return (Long) this.transactionTemplate.execute(new TransactionCallback() {
public Long doInTransaction(TransactionStatus status) {
try {
return containerTypeDao.saveContainerType(containerType);
}
catch (Exception e) {
status.setRollbackOnly();
return null;
}
}
});
}