- PR -

Spring、TransactionInterceptor使用時のコネクションプーリング

1
投稿者投稿内容
osiete
常連さん
会議室デビュー日: 2008/03/17
投稿数: 26
投稿日時: 2008-03-28 09:13
Tomcatからデータソースを取得しトランザクションの制御をSpringの
org.springframework.transaction.interceptor.TransactionInterceptorを使用して
いるのですが、複数のPCを使用してアクセスしても
データソースのアクティブ状態のコネクション数がつねに1になってしまいます。

SpringのTransactionInterceptor使用時にはデータソースをTomcatから取得しても
自動でコネクションプーリングにはならずTransactionInterceptorへの設定を行わなければ
コネクションが共有されてしまうのでしょうか?
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2008-03-28 11:19
引用:

osieteさんの書き込み (2008-03-28 09:13) より:
SpringのTransactionInterceptor使用時にはデータソースをTomcatから取得しても
自動でコネクションプーリングにはならずTransactionInterceptorへの設定を行わなければ
コネクションが共有されてしまうのでしょうか?


コネクションプーリングとは複数のリクエストで
コネクションを共有することを目的にした機構です。

あるリクエストがコネクションを使用している最中に、
さらに他のリクエストがコネクションを要求した時に
初めて二本目のコネクションが使用されることになります。

ブラウザからの手動アクセス程度では完全に同時に
二本の接続を必要とする状況にならないかもしれません。

また、プール側の初期接続数が1以上になっている場合は、
起動時にその本数まで自動的に接続して維持します。

Spring側の設定としては、<jee:jndi-lookup>などでTomcatのDataSourceを参照し、
org.springframework.jdbc.datasource.DataSourceTransactionManagerを使用する
TransactionInterceptorを構成していれば正しい設定になっているはずです。
osiete
常連さん
会議室デビュー日: 2008/03/17
投稿数: 26
投稿日時: 2008-03-28 17:25
あしゅさま回答ありがとうございます。

>あるリクエストがコネクションを使用している最中に、
>さらに他のリクエストがコネクションを要求した時に
>初めて二本目のコネクションが使用されることになります。

複数PCにて以下の様になります。

1.1台目で接続、ブレークポイントで停止 ← getNumActiveの結果が1
2.1台目停止中に2台目で接続 ← getNumActiveの結果が1


>また、プール側の初期接続数が1以上になっている場合は、
>起動時にその本数まで自動的に接続して維持します。

起動時の設定では特に値を設定していないのでデフォルト値だと思います。
tomcatのバージョンは5.5です。

>Spring側の設定としては、<jee:jndi-lookup>などでTomcatのDataSourceを参照し、
>org.springframework.jdbc.datasource.DataSourceTransactionManagerを使用する
>TransactionInterceptorを構成していれば正しい設定になっているはずです。


Guiceを使用しAOPでTransactionInterceptorを利用しているのでソース上で
以下の様に設定しビジネスロジックの前後に呼出される様に設定しています。

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/Test");

PlatformTransactionManager transactionManager = new DataSourceTransactionManager(ds);

Properties props = new Properties();
props.setProperty("*", "PROPAGATION_REQUIRED");

TransactionInterceptor transactionInterceptor = new TransactionInterceptor(transactionManager, props);
1

スキルアップ/キャリアアップ(JOB@IT)