web-dev-qa-db-ja.com

tomcat-dbcp vs commons-dbcp

これらの2つの接続プーリングライブラリには多くの混乱があるようです。私が知りたいのは、どちらが良いかです(もしあれば)?

ここに私が我慢したいいくつかのポイントがあります...誰かが確認してくださいませんか?

  1. Tomcat DBCP:Tomcat/libディレクトリに存在するデフォルトのTomcat-dbcp.jarを使用します。 web-inf/libにcommons-dbcp.jarまたはcommons-pool.jarライブラリが必要な必要はありません。 DBドライバーはTomcat/libに配置する必要があります。

  2. Tomcat DBCPデータソースクラスはorg.Apache.Tomcat.dbcp.dbcp.BasicDataSource。 Commons DBCPデータソースクラスはorg.Apache.commons.dbcp.BasicDataSource

  3. これら2つの唯一の違いは this blog にあります。情報が正しいかどうかわからない。

  4. Tomcatの公式ドキュメント は、ほとんどのクラスの名前が変更され、パッケージが変更されたことを明確に述べています。

質問は次のとおりです:どちらを使用し、どちらが良いか

68
rabbit

Tomcat DBCPは、Apache Commons DBCPの名前が変更されたバージョンであり、異なる内部パッケージ名プレフィックスも付いています。

ビルド時に、TomcatはCommons DBCPソースを取得し(バージョンはTomcatバージョンに依存します。たとえば、Tomcat 7.0.27はCommons DBCP 1.4を使用します)、パッケージ名の置換を行います(org.Apache.commons-> org.Apache.Tomcat.dbcp)そして、結果をTomcat-dbcp.jarとして構築します。

これは、内部Tomcat JDBCプールがCommons DBCPクラスの可能なアプリケーション使用と競合しないようにするために行われます。これにより、多くの潜在的なクラスローディングの問題が回避されます。

Edit:「dbcp」パッケージはデータソース管理に関するものです。純粋なプールの実装では、Commons DBCPはCommons Pool(パッケージorg.Apache.commons.pool)に依存しますが、Tomcatでは、プールの実装はTomcat独自の JDBCプール (パッケージorg.Apache.Tomcat.jdbc.pool )。

35

これらの2つの接続プーリングライブラリには多くの混乱があるようです。私が知りたいのは、どちらが良いですか(もしあれば)?

TL/DR:これらは同じです。どちらも使用しないでください。

Tomcat-dbcpは、Tomcatディストリビューションに含まれているApacheコモンズプールの元の再パッケージです。クラス衝突を避けるため、パッケージはorg.Apache.Tomcat.dbcp.dbcp。*に名前が変更されました。

Tomcat 7(2011年7月の7.0.19以降)では、「Tomcat JDBC接続プール」と呼ばれる古いApacheコモンズ実装の代替として、追加の接続プールがデフォルトのTomcatパッケージに(Tomcat-jdbc.jarの一部として)含まれていました。

https://Tomcat.Apache.org/Tomcat-7.0-doc/jdbc-pool.html

この記事では、2つの違いについて説明します。

http://vigilbose.blogspot.com/2009/03/Apache-commons-dbcp-and-Tomcat-jdbc.html

新しいTomcatプールが優れている理由の簡単な要約:

  • 積極的にサポート
  • はるかに小さく、理解しやすく、維持しやすい(ソースを見たい場合)
  • すべてのcommons-dbcp機能をサポート+「initSQL」、「validationInterval」、「jdbcInterceptors」などの非常に便利な機能を追加
14
Pavel

古いバージョンのApache Commons DBCP(バージョン1.2)には、高負荷条件下で厄介なスレッドセーフの問題があり、そのような使用法には適していません。 Tomcatの人々がこれらの問題を修正するためにTomcatを作り直したのは驚きではありません。

しかし、私の理解では、Commons DBCP 1.4はこれらの問題を修正します。個人的には確認できませんが、Tomcatバージョンが冗長になる可能性があります。

興味深いことに、SpringSourceは、Tomcat(tc-Server)の再パッケージ化されたバージョンのためにCommons DBCPも書き直しました。しかし、彼らはそれをオープンソース化していません。

11
skaffman

Tomcat 7は引き続きDBCPを使用します。主な理由は、Tomcatのドキュメントに隠されている可能性があります。

  • Apache Commons DBCPは、これらの放棄されたデータベース接続を追跡および回復するように構成できます。それらを回復できるだけでなく、これらのリソースを開いて決して閉じなかったコードのスタックトレースも生成します。

  • Tomcat jdbc-poolライブラリは、非常に同時的なシナリオではより高速かもしれませんが、一部のjdbcドライバーでメモリリークが発生する可能性がある(開発者が閉じるのを忘れていた)ステートメントを自動的に閉じて解放できません。

ただし、DBCPコードの問題の1つは、使用する委任モデルです。現在、最新バージョンはJDK1.6以前をサポートしています。 1.7をサポートするということは、クラスの少なくとも4分の1を変更することを意味し、これがJDBCプールライブラリが存在するようになった理由の1つでした。

注:さらに調査すると、JDBCプールには、StatementFinalizerインターセプターを使用して、接続が閉じられたときに開始ステートメントを閉じる方法があります。

6
austindz

ここに追加するだけです。興味深い動作に気づきましたが、期待されていますが、そのためのドキュメントは見つかりませんでした:

Tomcatの場合、Tomcatファクトリー(org.Apache.Tomcat.jdbc.pool.DataSourceFactoryまたは他のTomcatファクトリ)。それ以外の場合は、共通DBCPとして機能します。

Common DBCPとTomcat DBCPのデフォルト値には、特にtestOnBorrow(Common DBCPではtrue、Tomcat DBCPではfalse)の違いがあります。

4
arviarya

Commons-dbcpではなくTomcat JDBCプールを使用する利点のリストを次に示します。 http://people.Apache.org/~fhanik/jdbc-pool/jdbc-pool.html

4
Clint Eastwood