71

これら 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 つの唯一の違いは、このブログにあります。情報が正しいかどうかはわかりません。

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

問題は、どちらを使用し、どちらが優れているかです。

4

6 に答える 6

37

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

ビルド時に、TomcatはCommons DBCPソースをフェッチし(バージョンはTomcatのバージョンに依存します。たとえば、Tomcat7.0.27はCommonsDBCP 1.4を使用します)、パッケージ名の置換(org.apache.commons-> org.apache.tomcat.dbcp)を実行し、結果をとしてビルドしtomcat-dbcp.jarます。

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

編集:「dbcp」パッケージはデータソース管理に関するものです。純粋なプールの実装の場合、CommonsDBCPはCommonsPool(パッケージorg.apache.commons.pool)に依存しますが、Tomcatでは、プールの実装はTomcat独自のJDBCプール(パッケージorg.apache.tomcat.jdbc.pool)に置き換えられます。

于 2012-04-25T16:02:44.460 に答える
14

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

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

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

Tomcat 7 (2011 年 7 月の 7.0.19 以降) では、「Tomcat JDBC 接続プール」と呼ばれる、古い Apache Commons 実装の代替として、追加の接続プールがデフォルトの 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」などの非常に便利な機能を追加
于 2015-03-25T06:38:43.960 に答える
11

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

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

興味深いことに、SpringSourceは、再パッケージ化されたバージョンのTomcat(tc-Server)用にCommons DBCPを書き直し、それによってパフォーマンスが大幅に向上すると主張しています。しかし、彼らはそれをオープンソース化していません。

于 2011-01-17T10:55:21.893 に答える
6

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

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

  • Tomcat jdbc-pool ライブラリ。高度な同時実行シナリオではおそらく高速ですが、ステートメントを自動的に閉じて解放することはできません (開発者が閉じるのを忘れているため)。その結果、一部の jdbc ドライバーでメモリ リークが発生する可能性があります。

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

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

于 2012-11-24T12:42:59.623 に答える
4

commons-dbcpではなくTomcatJDBCプールを使用する利点のリストは次のとおりです。http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

于 2013-03-13T14:35:22.423 に答える
4

ここに追加するだけです:興味深い動作に気付きましたが、予想どおりですが、そのドキュメントは見つかりませんでした:

Tomcat の場合、Tomcat ファクトリ (または他の Tomcat ファクトリ) を定義する必要がありますorg.apache.tomcat.jdbc.pool.DataSourceFactory。そうしないと、Common DBCP として機能します。

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

于 2013-02-15T18:31:01.513 に答える