これらの2つの接続プーリングライブラリには多くの混乱があるようです。私が知りたいのは、どちらが良いかです(もしあれば)?
ここに私が我慢したいいくつかのポイントがあります...誰かが確認してくださいませんか?
Tomcat DBCP:Tomcat/libディレクトリに存在するデフォルトのTomcat-dbcp.jarを使用します。 web-inf/libにcommons-dbcp.jarまたはcommons-pool.jarライブラリが必要な必要はありません。 DBドライバーはTomcat/libに配置する必要があります。
Tomcat DBCPデータソースクラスはorg.Apache.Tomcat.dbcp.dbcp.BasicDataSource
。 Commons DBCPデータソースクラスはorg.Apache.commons.dbcp.BasicDataSource
。
これら2つの唯一の違いは this blog にあります。情報が正しいかどうかわからない。
Tomcatの公式ドキュメント は、ほとんどのクラスの名前が変更され、パッケージが変更されたことを明確に述べています。
質問は次のとおりです:どちらを使用し、どちらが良いか?
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
)。
これらの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プールが優れている理由の簡単な要約:
古いバージョンのApache Commons DBCP(バージョン1.2)には、高負荷条件下で厄介なスレッドセーフの問題があり、そのような使用法には適していません。 Tomcatの人々がこれらの問題を修正するためにTomcatを作り直したのは驚きではありません。
しかし、私の理解では、Commons DBCP 1.4はこれらの問題を修正します。個人的には確認できませんが、Tomcatバージョンが冗長になる可能性があります。
興味深いことに、SpringSourceは、Tomcat(tc-Server)の再パッケージ化されたバージョンのためにCommons DBCPも書き直しました。しかし、彼らはそれをオープンソース化していません。
Tomcat 7は引き続きDBCPを使用します。主な理由は、Tomcatのドキュメントに隠されている可能性があります。
Apache Commons DBCPは、これらの放棄されたデータベース接続を追跡および回復するように構成できます。それらを回復できるだけでなく、これらのリソースを開いて決して閉じなかったコードのスタックトレースも生成します。
Tomcat jdbc-poolライブラリは、非常に同時的なシナリオではより高速かもしれませんが、一部のjdbcドライバーでメモリリークが発生する可能性がある(開発者が閉じるのを忘れていた)ステートメントを自動的に閉じて解放できません。
ただし、DBCPコードの問題の1つは、使用する委任モデルです。現在、最新バージョンはJDK1.6以前をサポートしています。 1.7をサポートするということは、クラスの少なくとも4分の1を変更することを意味し、これがJDBCプールライブラリが存在するようになった理由の1つでした。
注:さらに調査すると、JDBCプールには、StatementFinalizer
インターセプターを使用して、接続が閉じられたときに開始ステートメントを閉じる方法があります。
ここに追加するだけです。興味深い動作に気づきましたが、期待されていますが、そのためのドキュメントは見つかりませんでした:
Tomcatの場合、Tomcatファクトリー(org.Apache.Tomcat.jdbc.pool.DataSourceFactory
または他のTomcatファクトリ)。それ以外の場合は、共通DBCPとして機能します。
Common DBCPとTomcat DBCPのデフォルト値には、特にtestOnBorrow
(Common DBCPではtrue
、Tomcat DBCPではfalse
)の違いがあります。
Commons-dbcpではなくTomcat JDBCプールを使用する利点のリストを次に示します。 http://people.Apache.org/~fhanik/jdbc-pool/jdbc-pool.html