まず、データポイントはほとんど提供していません。
次の問題が説明されます。複数の読み取り専用トランザクションを1つのJDBC接続で多重化することは可能ですか
データポイント:
[D1] Hibernate
でとAnnotation
とmanaged objects
世界、私はHibernateのトランザクションが開始された管理対象Beanで
@Transactional
public void createStuff(..){
// get entity manager and call persist and other operatation
}
@Transactional
public SomeDtoObject getStuff(..){
// get entity manager and call find and getter to polulate a object to return
}
のような一般的なパターンを見てきたものこのメソッドを呼び出すとコミットされます。
Hibernateのドキュメントは述べています(link):
マルチユーザーのクライアント/サーバアプリケーションで最も一般的なパターンは、セッションごとの要求です。
[D2]また、Postgresのドキュメント(link)上で述べたように、データベースへの接続は、接続プールのライブラリC3P0
を使用してプールされるべきであることをお勧めします
Pgは通常、同じ万件のトランザクションを完了します5回、10回、または20回を一度に行うよりも、一度に500回行う方が速いです。
[D3]また
JDBC
と私たちはそのトランザクション内で好きなように我々は一度取引とできるだけ多くのステートメントを実行することができ、単一の接続を考えます。
2つの異なるトランザクションメソッドを実行する2つの異なるスレッドが同じ接続を使用してはならず、もう1つのメソッドを呼び出す前に待機する必要があることをアプリケーション(C3P0)が確認できるようにします。
問題:私たちは、接続プールと一緒に注釈を使用して管理対象Beanのトランザクションパターンを使用している場合
は今休止状態とセッションごとの要求に(レッツは1つの接続でのみ言う)
も(コードは今二つの異なるスレッドがあると想像
@Transactional
public SomeDtoObject getStuff(..){
// get entity manager and call find and getter to polulate a object to return
SomeEntity se = entityManager.find(someentity, primaryKey);
//create Dtos
// access someEntity to all over this method to create SomeDtoObject that we have to return.
// also may access some file on system to fetch some data is order to populate someDtoObject.
// overall let say the method take 150 milli second to do all its work
}
のようなものであるとしましょう(...) T1
が呼び出され、接続プールからjdbc接続を取得します。
そして、T2
がentityManager.find
に達すると、C3P0
は接続が残っていないことをチェックし、T1
が約150ミリ秒かかる完了までT2
を保留にします。
getStuff(...)
が読み取り専用クエリを実行するとすれば、両方のスレッドが同じ接続を使用でき、スレッドがクエリを実行しないようにすることが理想的です。
上記のケースでは、その接続をアイドル状態にしておき、スレッドを待機させます。
MAIN QUESTION
私は特定の休止状態のトランザクションが読み取り専用であることを休止して、代わりに、接続プールからの新しい接続を求めての、すでに取得した接続を再利用することができ休止すると言うことができる方法はありますか?
少数のソリューションは/が示唆された:(説得力のない)
1あなたはそんなに心配している場合は、注釈を使用してトランザクションを使用していけない、HibernateのSessionを自分で使用する.....なしIそのパターンのように)
2ConnectionRelease
オプションを提供することができますafter_statement
に設定することができます。
最初 Hibernate C3P0接続プールプロバイダはafter_statementをサポートしていません。
第2これはオーバーヘッドになり、接続を再確立します。
プールに複数の接続があっただけで問題はありません。それをすることで、足に自分を撃ってしまうのは何ですか? –
上記の説明を目的としています...ポイントは、リソースが空いているときに使用することです...そして上記の問題は、プール内の10の接続も引き続き発生します – Bhuvan
いいえ、十分な接続があればプールに。私は本当にあなたが人工的な問題の解決策を探していると思います。 –