org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy

こんな DB アクセスにお悩みのあなた!

211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit
211 Query       SET autocommit=1
211 Query       SET autocommit=0
211 Query       commit


おやおや、DB アクセスの必要がないのに、見事に begin と commit が投げられまくっていますねー。


本日は、そんなあなたにオススメの商品の紹介です。


その名も、、、org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy!!!


トランザクションには入ってみたものの、結局DBアクセスをしなかったり、キャッシュがヒットして DB アクセスが必要なかった場合などに効果的です。OpenEntityManagerInViewFilter との相性も抜群です。


使い方は簡単!


コネクションの取得を lazy にしたいデータソースを LazyConnectionDataSourceProxy でラップするだけ。

  <!-- Actual DataSource -->
  <bean id="rawDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/test" />
    <property name="username" value="root" />
    <property name="password" value="" />    
  </bean>
  
  <!-- LazyConnectionDataSourceProxy -->
  <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <property name="targetDataSource" ref="rawDataSource"/>
  </bean>


これだけの設定で、実際に Statement が作成されるまでは、Connection が張られなくなります。


秘密は、Proxy。


LazyConnectionDataSourceProxy を使うと、最初に Statement を作成するまで、本物の JDBC Connection を取得しません。LazyConnectionDataSourceProxy からコネクションを取得しようとすると、proxy が返されることで実現されています。

ネイティブの JDBC Connection にキャストできないんじゃない?


なんて思っているあなた、心配ご無用です。そんなときのために、NativeJdbcExtractor と、そのサブクラスもセットでお付けします。


これで、Connection の proxy から、ネイティブなコネクションを取ることができます。


さぁ、お好きな Extractor を使って、楽しい DB アクセスライフを let's enjoy!



何なんだ、このノリは o...rz