如果没有正在进行的交易,我们如何进行外部通话?

时间:2011-02-02 13:31:28

标签: java hibernate spring jdbc jboss

我们正在使用Spring& JBoss 4.2.3中的Hibernate正在调用外部系统,这可能需要一段时间,作为处理请求的一部分。为了消除长期存在的数据库锁,我们不会在外部调用返回之后写入我们的数据库。 但是Hibernate不喜欢没有事务,所以我们有一个只读事务,由Spring启动,直到我们进行写操作(在一个新的读写子事务中)。不幸的是,这仍然意味着我们在外部呼叫期间保留资源,即从池中分配的连接。 当执行的其余部分(之前和之后)需要一个时,有没有办法在没有正在进行的事务的情况下进行外部调用? 有没有更好的方法来推迟实际的交易,直到我们确实需要它并仍然让Hibernate满意为止?

2 个答案:

答案 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;
            }
        }
    });
}