0

私のアプリケーションスタックは、Apache tomcat7でホストされているSpringMVC、Hibernate、およびMySQLで構成されています。

トランザクションを管理するためにSpringをセットアップしましたが、Hibernateセッションファクトリは接続を取得するためにtomcatdbcp接続プールでバックアップされたデータソースを利用しています。

私のアプリケーションには、Web UI(ボタンのクリックなど)を介して開始される長時間実行タスクを実行するユースケースがあります。このタスクは、たとえば10分間実行された後、接続プールが接続を閉じた例外をスローし始めます。これは明らかに、接続が特定の時間後にプールに戻されない場合、接続が放棄済みとしてマークされ、後で削除される接続プール設定が原因です。タイムアウト設定をいじって、十分な値に増やすことで、これを解決できます。しかし、私はこのような他のいくつかのユースケースを持っているかもしれず、それらがどれくらいの期間実行されるか現在のところわからないかもしれません。

そこで、ここで別のアプローチを考えています。

このユースケースはあまり頻繁に開始されないため、接続プールを使用せずに別のデータソース定義を使用する場合があります。もちろん、Springで「abc」と「xyz」という異なる名前で2つのトランザクションマネージャーを設定し、@ Transactional(name =” abc”)と@Transactional(name =” xyz)”を使用することもできます。これらのトランザクションマネージャーは両方とも、それぞれのデータソースを使用します。1つは一般的なユースケースをサポートする接続プールを備え、もう1つは長時間実行されるトランザクションをサポートする接続プールを備えていません。これにより、タイムアウト構成の変更について心配する必要がなくなります。

これは一般的に受け入れられている解決策ですか、それともタイムアウト構成アプローチを採用する必要がありますか?

4

2 に答える 2

2

アプリケーションが開始できる接続の数を制限する別の方法がない場合、接続プールの使用を避けると問題が発生します。たとえば(クールの簡単な例)、ユーザーがボタンをクリックするたびにバッチプロセスを起動する場合は、このタスクを実行できる時間を制限するようにしてください。

もう1つの方法は、アプリケーションサーバー(jdbc / batchprocess)で新しいjdbcリソースを定義し、このリソースでより長いタイムアウトを構成することです。次に、動的データソースルーティングを使用して1つから別のものに変更します。

于 2012-09-06T10:46:06.833 に答える
1

独自の接続を提供して、Hibernateセッションを開くことができます。

sessionFactory.withOptions().connection( yourConnection ).openSession();
于 2012-09-06T12:15:28.167 に答える