2011-02-02 8 views
1

私たちはJBoss 4.2.3でSpring & Hibernateを使用しており、外部システムを呼び出していますが、これは処理要求の一部として時間がかかることがあります。長期的なデータベースロックを解消するために、外部呼び出しが返されるまでデータベースに書き込むことはありません。 しかし、Hibernateはトランザクションがないのが好きではありませんので、私たちが(新しいread-writeサブトランザクションで)書き込みを行うまで、Springによって開始される読み取り専用トランザクションを持っています。残念なことに、これは、外部コール中のリソース、プールから割り当てられた接続を保持していることを意味します。 残りの実行(前後)に1つの実行が必要なときに、進行中のトランザクションなしで外部呼び出しを行う方法はありますか? 実際にトランザクションが必要になるまで、実際のトランザクションを延期し、さらにHibernateを幸せに保つためのより良い方法がありますか?進行中のトランザクションなしで外部コールを行うにはどうすればよいですか?

+0

は待つために要求を持っています終了するための外部呼び出し?または、外部呼び出しとデータベース書き込みを非同期で実行できますか? – sourcedelica

+0

はい、外部呼び出しが必要かどうか、またその呼び出しの設定(URLなど)については、データベースを確認する必要があります。また、呼び出し元に返す前に、ローカルデータベースに書き込むための応答も必要です。 – Mirvnillith

答えて

0

外部システムをパーシスタンス層で呼び出す必要がありますか?あなたが永続性を失う前に、この種のことを外部にするのはもっと論理的です。

+0

呼び出し自体は永続化レイヤーからのものではありませんが、外部呼び出しの上にレイヤーを読み込む必要があり、それらのいくつかに遅延読み込みを使用する必要があります(Hibernateがトランザクション/セッションについて不安を感じるときです)。 – Mirvnillith

0

実際には、読み取りのトランザクションは必要ありません。ここで

は、read呼び出しがストレートDAOオブジェクトになりますが、書き込みコールが(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; 
      } 
     } 
    }); 
} 
関連する問題