web-dev-qa-db-ja.com

接続プールまたはデータソース? JNDIにはどちらを入れるべきですか?

JNDIレベルまたはwebappレベルでプールに接続する必要がある方が理にかなっていますか?たとえば、次のように単純にjavax.sql.DataSourceで作成できます。

<Context antiJARLocking="true">
  <Resource name="jdbc/myDataSource" 
    auth="Container"
    type="javax.sql.DataSource" 
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost/myDataSource" user="user" password="password" />
</Context>

次に、Springでプールを次のように構成します。

<bean id="myDataSource" class="com.mchange.v2.c3p0.DataSources"
  factory-method="pooledDataSource">
  <constructor-arg>
    <jee:jndi-lookup jndi-name="Java:comp/env/jdbc/myDataSource" />
  </constructor-arg>
</bean>

または、JNDI自体でプールを直接構成することもできます。

<Resource name="jdbc/myDataSource" 
  auth="Container"
  factory="org.Apache.naming.factory.BeanFactory"
  type="com.mchange.v2.c3p0.ComboPooledDataSource" 
  driverClassName="com.mysql.jdbc.Driver"
  jdbcUrl="jdbc:mysql://localhost/myDataSource" 
  user="user" password="password"
  minPoolSize="3" 
  maxPoolSize="15" 
  maxIdleTime="5000"
  idleConnectionTestPeriod="300" 
  acquireIncrement="3" />

この春を去る:

<jee:jndi-lookup id="myDataSource" jndi-name="Java:comp/env/jdbc/myDataSource" />

どちらの場合も、myDataSource Spring Beanはc3p0接続プールデータソースになりますが、どちらが優れていますか? JNDIにプールがあるのが最も理にかなっていると思いますが、その欠点は、c3p0 libをサーブレットコンテナレベルにプッシュする必要があることです。これにより、既存のサーブレットが現在別のバージョンを使用している場合に競合が発生する可能性があります。ただし、これをJNDIに入れると、アプリケーションはプーリングについてまったく心配する必要がなくなります。みんなどう思いますか?

13
Lucas

JNDIから取得したデータソースはすでにプールされているため、プールする必要はありません:)

コンテナマネージャープールとの唯一の違いはアプリケーションプールとは、最初のケースでは、標準インターフェース(JBossコンソールなど)を使用してプールのワークロードを監視できることです。次に、アプリケーションサーバーの管理者が、必要に応じてプールサイズを増やすかどうかの決定を管理します。また、アプリケーションを別のDBサーバーに切り替えることもできます(MySQLからOracleへの計画的な移行など)。欠点は、単体テスト用にJNDIテストデータソースをセットアップするために少し多くの労力が必要になることです( ここ を参照)。

2番目のケースでは、はい、DBCPまたはc3p0のいずれかとJDBCドライバーをアプリケーションと一緒にパッケージ化する必要があります。この場合、Tomcatで実行されているすべてのアプリケーションのすべてのプールに関する統計を収集するのはそれほど簡単ではありません。また、新しいJDBCドライバー(MySQL4からMySQL5)への移行は、すべてのアプリケーションに対して一度に実行できるわけではありません。また、.propertyファイルを使用している場合でも、接続プロパティはアプリケーションに関連付けられています(そのため、変更するには、プロジェクトの再アセンブルと再デプロイが必要です)。おそらく、アプリケーションが1つだけで、DBが1つだけで、管理オーバーヘッドがないため、これらすべては必要ありません。

このテーマに関するその他のトピック:

24
dma_k