- - PR -
Spriingでコネクションプーリング
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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> | ||||
|
投稿日時: 2005-08-02 21:28
タイトルに誤字がありました。失礼しました。
【誤】Spriingでコネクションプーリング 【正】Springでコネクションプーリング 宜しくお願い致します。 | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 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でコネクションプーリング」といった事例が、現時点では少ないのでしょうか? | ||||
|
投稿日時: 2005-08-03 13:51
TransactionProxyFactoryBeanとserviceXxxxは親子関係になっていたのですね。
読み飛ばしていました。(すみません) 親子関係ならば、TransactionProxyFactoryBeanを生成しないように abstract="true" を入れてみてはどうでしょうか? | ||||
|
投稿日時: 2005-08-04 20:07
Spring Framework を使ったことが無いのですが、 DataSource の autoCommit を false に出来れば 問題が解決するでしょうか ? であれば、Jakarta Commons DBCP の BasicDataSource には defaultAutoCommit というプロパティがあるので、 これを false に設定してみてはいかがでしょう。 | ||||
|
投稿日時: 2005-08-04 21:27
はしもとさん、回答ありがとうございます。
> DataSource の autoCommit を false に出来れば > 問題が解決するでしょうか ? autoCommit を false にしたのですが、 トランザクションが終了してもコミットされない…。 つまり、java.lang.Exception が発生せずに正常終了しているのに、 DB上は何も更新されません…。 逆に、autoCommit を true にすると、 java.lang.Exception が発生しても、必ずコミットされてしまいます。 hiroさんの abstract="true" の件は、現在テスト中です。(hiroさん、すみません) |
1