- PR -

Spriingでコネクションプーリング

1
投稿者投稿内容
kei
会議室デビュー日: 2005/08/02
投稿数: 4
投稿日時: 2005-08-02 21:25
Spriingでコネクションプーリングを使用したいため、

[1] org.springframework.jdbc.datasource.DriverManagerDataSource
[2] org.apache.commons.dbcp.BasicDataSource
[3] com.mchange.v2.c3p0.ComboPooledDataSource

を試したのですが、

(ア) コネクションプーリング
(イ) トランザクション管理(コミット・ロールバック)

の2つを同時に満たせず、困っています。

---------------------
| | (ア) | (イ) |
|===================|
| [1] | × | ○ |
{ [2] | ○ | × 注|
{ [3] | ○ | × 注|
---------------------

(注)java.lang.Exception が発生した場合のみ、ロールバックしてほしいのに、
dataSource の autoCommit 設定に依存し、常に ロールバック or コミット してしまう


applicationContext.xml は、以下の通りなのですが、どなたかご教授頂けないでしょうか?

参考文献・URLなどがあれば、教えてください。

お手数かけますが、宜しくお願い致します。


※ [2] [3] の場合、
transactionManager に org.springframework.jdbc.datasource.DataSourceTransactionManager
を使っているのが間違いなのでしょうか?



【 applicationContext.xml 】

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<!-- ========================= RESOURCE ========================= -->
<!-- [1] -->
<!--
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
<property name="url"><value>jdbc:oracle:thin:@111.111.111.111:1521:sid</value></property>
<property name="username"><value>user</value></property>
<property name="password"><value>pass</value></property>
</bean>
-->

<!-- [2] -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
<property name="url"><value>jdbc:oracle:thin:@111.111.111.111:1521:sid</value></property>
<property name="username"><value>user</value></property>
<property name="password"><value>pass</value></property>
<property name="initialSize"><value>5</value></property>
<property name="maxActive"><value>20</value></property>
<property name="maxIdle"><value>10</value></property>
<property name="maxWait"><value>-1</value></property>
</bean>

<!-- [3] -->
<!--
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
<property name="url"><value>jdbc:oracle:thin:@111.111.111.111:1521:sid</value></property>
<property name="username"><value>user</value></property>
<property name="password"><value>pass</value></property>
<property name="autoCommitOnClose"><value>false</value></property>
<property name="initialPoolSize"><value>5</value></property>
</bean>
-->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"><ref local="dataSource"/></property>
</bean>

<bean id="debug" class="org.springframework.aop.interceptor.DebugInterceptor"/>

<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>/WEB-INF/classes/xxx/xxx/xxx/config/sqlMapConfig.xml</value>
</property>
</bean>



<!-- ========================= DAO ========================= -->
<bean id="xxxDao" class="xxx.xxx.xxx.dao.xxxDaoImpl">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="sqlMapClient"><ref local="sqlMapClient"/></property>
</bean>

<!-- ========================= BUSINESS ========================= -->
<bean id="xxxxBiz" class="xxx.xxx.xxx.business.impl.xxxxBizImpl">
<property name="xxxxDao"><ref local="xxxxDao" /></property>
</bean>

<!-- ========================= SERVICE ========================= -->
<bean id="serviceXxxxxTarget" class="xxx.xxx.xxx.service.impl.ServiceXxxxImpl" singleton="false">
<property name="xxxBiz"><ref local="xxxxBiz" /></property>
</bean>

<!-- ========================= TRANSACTION ========================= -->
<bean id="txProxyTemplate" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED, -java.lang.Exception</prop>
</props>
</property>
<property name="postInterceptors"><ref local="debug"/></property>
</bean>

<bean id="serviceXxxx" parent="txProxyTemplate">
<property name="target"><ref local="serviceXxxxTarget"/></property>
</bean>

<!-- ========================= ACTION ========================= -->
<bean id="actionXxxx" name="/ActionXxxx" class="xxx.xxx.xxx.action.ActionXxxx" singleton="false">
<property name="serviceXxxx"><ref local="serviceXxxxTarget" /></property>
</bean>

</beans>
kei
会議室デビュー日: 2005/08/02
投稿数: 4
投稿日時: 2005-08-02 21:28
タイトルに誤字がありました。失礼しました。

【誤】Spriingでコネクションプーリング
【正】Springでコネクションプーリング

宜しくお願い致します。
hiro
常連さん
会議室デビュー日: 2005/03/10
投稿数: 32
投稿日時: 2005-08-03 10:22
現在、Struts+Spring+Hibernateで開発しています。
iBATISを利用していないので詳細まではわかりませんが
気づいた点を1つ
applicationContext.xmlを読んで気づいたのですが
TransactionProxyFactoryBeanを定義している部分で
TransactionProxyFactoryBeanを織り込むtargetを指定していないようです。
<property name="target"><ref local="xxxx"/></property>
でどこがトランザクションを開始するポイントか示す必要があります。

トランザクションを開始するポイントが複数のクラスになる場合、
TransactionInterceptorとBeanNameAutoProxyCreatorの組み合わせでクラス名に"*"をつけて設定する方法もあります。


参考になるURLは存じませんが、本ならばこれが参考になると思います。
http://www.amazon.co.jp/exec/obidos/ASIN/4774123412/qid=1123031555/sr=1-3/ref=sr_1_10_3/250-1584664-3989814


kei
会議室デビュー日: 2005/08/02
投稿数: 4
投稿日時: 2005-08-03 10:55
hiro さん、回答ありがとうございます。

> TransactionProxyFactoryBeanを定義している部分で
> TransactionProxyFactoryBeanを織り込むtargetを指定していないようです。


記載しました 【 applicationContext.xml 】 では、

<!-- ========================= TRANSACTION ========================= -->
<bean id="txProxyTemplate" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
■■■ 中略 ■■■
</bean>

<bean id="serviceXxxx" parent="txProxyTemplate">
<property name="target"><ref local="serviceXxxxTarget"/></property>
</bean>


の様に、
"txProxyTemplate" の設定の後に
"serviceXxxx" で parent="txProxyTemplate" を指定することで、
"txProxyTemplate" の設定を継承し、今後増えていくサービスの設定を簡単にしているつもり(?)です。

また、
[1] org.springframework.jdbc.datasource.DriverManagerDataSource
の場合は、
(イ) トランザクション管理(コミット・ロールバック)
がうまくいっているので、この設定で大丈夫だと思っています。

間違っていたら、申し訳ありません。ご指摘ください。


書籍については、hiroさんご紹介の「Spring入門」と
「実践 Spring Framework」
http://www.amazon.co.jp/exec/obidos/ASIN/4822221431/ref=pd_sim_dp_3/250-2381312-2861047
は手元にあり、参考にしているのですが、
「コネクションプーリング」という観点では、ほとんど触れられていないため、困っています。(私が、読解できてないだけかもしれません…)

皆様、申し訳ありませんが、引き続き宜しくお願い致します。

【追伸】
「Springでコネクションプーリング」といった事例が、現時点では少ないのでしょうか?
hiro
常連さん
会議室デビュー日: 2005/03/10
投稿数: 32
投稿日時: 2005-08-03 13:51
TransactionProxyFactoryBeanとserviceXxxxは親子関係になっていたのですね。
読み飛ばしていました。(すみません)

親子関係ならば、TransactionProxyFactoryBeanを生成しないように abstract="true"
を入れてみてはどうでしょうか?


はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2005-08-04 20:07
引用:
keiさんの書き込み (2005-08-02 21:25) より:

(注)java.lang.Exception が発生した場合のみ、ロールバックしてほしいのに、
dataSource の autoCommit 設定に依存し、常に ロールバック or コミット してしまう



Spring Framework を使ったことが無いのですが、
DataSource の autoCommit を false に出来れば
問題が解決するでしょうか ?

であれば、Jakarta Commons DBCP の BasicDataSource には
defaultAutoCommit というプロパティがあるので、
これを false に設定してみてはいかがでしょう。
kei
会議室デビュー日: 2005/08/02
投稿数: 4
投稿日時: 2005-08-04 21:27
はしもとさん、回答ありがとうございます。

> DataSource の autoCommit を false に出来れば
> 問題が解決するでしょうか ?

autoCommit を false にしたのですが、
トランザクションが終了してもコミットされない…。
つまり、java.lang.Exception が発生せずに正常終了しているのに、
DB上は何も更新されません…。

逆に、autoCommit を true にすると、
java.lang.Exception が発生しても、必ずコミットされてしまいます。

hiroさんの abstract="true" の件は、現在テスト中です。(hiroさん、すみません)
1

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