2011-01-17 6 views
62

これらの2つの接続プールライブラリには混乱があります。私が知りたいのは、どちらが良いのですか?tomcat-dbcpとcommons-dbcp

ここにいくつかご紹介したい点があります。誰かが確認してもらえますか?

  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. The official Tomcat documentationほとんどのクラスが名前が変更され、再パッケージされたことが明確に記載されています。

は、そこで質問です: いずれかを使用すると、どちらが良いですか?

+0

Tomcatのすべてのインストールでは、 'tomcat-dbcp.jar'は存在しませんでした。' commons-dbcp.jar'はTomcatのlibディレクトリの一部でした。つまり、誰かがASFのWebサイトからTomcatをダウンロードして先週実行しようとするまでです。だから間違いなく奇妙だ。 – mirabilos

答えて

11

Apache Commons DBCP(つまりバージョン1.2)の古いバージョンでは、負荷が高い状況ではスレッドセーフに関する問題があり、そのような用途には不適切です。 Tomcatの人々がこれらの問題を修正するためにそれを再加工したことは私には驚きではありません。

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

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

+4

DBCP 1.4は1.2より大きなパフォーマンス向上であり、私はアップグレードして以来、デッドロックやスレッドセーフの問題はもう発生していません。 – Chochos

+0

@チョコス:お勧めします。これはどんなアプリケーションですか? – skaffman

+0

200K +日常操作を実行するトランザクションスイッチ。短い1-5行のクエリ、たくさんの更新と挿入がたくさんあります。 – Chochos

31

Tomcat DBCPはApache Commons DBCPの名前が変更されたばかりで、内部パッケージ名も別のものです。

ビルド時にTomcatはCommons DBCPソースを取得します(Tomcat 7.0.27はCommons DBCP 1.4を使用します)。パッケージ名の置換(org.apache.commons->org.apache.tomcat.dbcp)を実行します。 tomcat-dbcp.jarとします。

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

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

+18

それは本当に本当ですか? [Tomcat DBCP docsの最初のセクション](http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#Introduction)は、2つの間にかなりの違いがあると主張しています。 – pimlottc

+2

私は私の答えを編集して、プールストーリーについての説明を追加しました。 –

+0

pomlottcのリンクが別のライブラリであるTomcat JDBC接続プール( 'org.apache.tomcat.jdbc.pool')を指しています –

6

Tomcat 7は引き続きDBCPを使用します。主な理由は、彼らのTomcatのドキュメントで非表示にすることができます。

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

  • TomcatのJDBCプールのライブラリー、多分速く非常に同時シナリオではなく閉じることはできませんし、いくつかのJDBCドライバで 可能性メモリリークが生じ(開発者が閉じるのを忘れました)自動的 リリース文。

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

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

3

ただ、ここに追加する: 私はそれが期待されているものの、興味深い行動に気づいたが、そのための任意のドキュメントを見つけることができませんでした:

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

Common DBCPとTomcat DBCPのデフォルト値の違いは、特にtestOnBorrow(共通DBCPではtrue、Tomcat DBCPではfalse)です。ここで

13

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

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

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

Tomcat 7では(2011年7月の7.0.19から)、デフォルトのTomcatパッケージに追加の接続プールが含まれていました。 tomcat-jdbc。なぜ新しい

http://vigilbose.blogspot.com/2009/03/apache-commons-dbcp-and-tomcat-jdbc.html

短い要約:この記事では、両者の違いをカバーしてい

https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

: "TomcatのJDBC接続プール" と呼ばれるApacheのコモンズの実装をSTALEに代わるものとして瓶)、 Tomcatプールがより良い:

  • (あなたがソースを見て気にしている場合)
  • 理解し、維持するために非常に、小さな簡単に
を「initSQL」、「validationInterval」、「jdbcInterceptors」のような超便利なものを追加し、より+すべてコモンズ-DBCP機能をサポートしています。
+0

すばらしい説明!! – Oliver

+0

できれば私は2つを投票するでしょう!そのブログのリンクをありがとう。 – Adarsha

+2

これは混乱しています: 'TL/DR:これらは同じです、どちらも使用しないでください'対 '新しいTomcatプールがより良い理由を要約します' –

関連する問題