web-dev-qa-db-ja.com

JDBCによる接続プーリングのオプション:DBCPとC3P0

Java/JDBCで利用可能な最良の接続プールライブラリは何ですか?

私は2つの主要な候補(フリー/オープンソース)を検討しています。

私はブログや他のフォーラムでそれらについて多くを読んだが、決定に達することができなかった。

これら2つに関連する代替案はありますか?

309
Dema

DBCPは時代遅れで製造グレードではありません。しばらく前に、私たちは2つを社内で分析し、2つに対して負荷と並行性を生み出すテストフィクスチャを作成して、実際の生活条件下での適合性を評価しました。

DBCPは一貫してテストアプリケーションに例外を生成し、C3P0が例外なく処理できる以上の性能レベルに達するのに苦労しました。

リンクがその下から取り出された場合、DBCPは接続を回復しませんでしたが、C3P0はまた、再開時にDB切断と透過的再接続を堅牢に処理しました。さらに悪いことに、DBCPは、基になるトランスポートが壊れたアプリケーションにConnectionオブジェクトを返していました。

それ以来、4つの主要な高負荷コンシューマWebアプリケーションでC3P0を使用してきましたが、これまで見たことがありません。

更新:棚に座って何年にもわたって、Apache Commonsの人々は休んでいます DBCPは休止中です そして今また、積極的に開発されたプロジェクトです。したがって、私の最初の投稿は古くなっている可能性があります。

そうは言っても、私はこの新しいアップグレードされたライブラリのパフォーマンスをまだ経験しておらず、最近のどのアプリケーションフレームワークでも事実上の事実であることをまだ聞いていません。

177
j pimmel

試してみることをお勧めします BoneCP - 無料で、オープンソースで、利用可能な他のものよりも高速です(ベンチマークのセクションを参照)。

免責事項:私は著者ですので、あなたは私が偏っていると言えるでしょう:-)

更新:2010年3月現在、まだ書き換えられた新しいApache DBCP( "Tomcat jdbc")プールよりも約35%高速です。ベンチマークセクションの動的ベンチマークリンクを参照してください。

更新#2:(Dec '13)4年ぶりにトップを迎えた今、はるかに速い競争相手がいる。 https://github.com/brettwooldridge/HikariCP

更新#3:( 'Sep '14)この時点でBoneCPは非推奨であると考えてください。 HikariCPに切り替えることをお勧めします)

アップデート#4:(15年4月) - ドメインjolbox.comを所有しなくなりましたが、新しい所有者は古いコンテンツを注意深く保管しています。

174
wwadge

接続がタイムアウトしたときにDBCPに問題があったので、c3p0を試しました。これを本番環境にリリースするつもりでしたが、その後パフォーマンステストを始めました。私はc3p0がひどいパフォーマンスをしていることがわかりました。私はそれが全くうまく機能するようにそれを構成することができませんでした。私はそれがDBCPの2倍遅いと感じました。

私はそれから Tomcat接続プール を試してみました。

これはc3p0の2倍の速さで、私がDBCPで抱えていた他の問題を修正しました。私は3つのプールの調査とテストに多くの時間を費やしました。あなたがTomcatにデプロイしているのであれば、私のアドバイスは新しいTomcat JDBCプールを使うことです。

16
user542651

DBCPでの自動再接続の問題について、次の2つの設定パラメータを使用したことがありますか。

validationQuery="Some Query"

testOnBorrow=true
14
Brandon Teo

DBCPを数年間使用しています。それは安定しており、DBサーバーの再起動後も生き残ります。正しく設定するだけです。それはほんの一握りのパラメータが指定されることを必要とするだけなので怠け者にならないでください。これが私達がそれを機能させるために明示的に設定したパラメーターをリストする私達のシステムプロダクションコードからのスニペットです:

DriverAdapterCPDS driverAdapterCPDS = new DriverAdapterCPDS();
driverAdapterCPDS.setUrl(dataSourceProperties.getProperty("url"));
driverAdapterCPDS.setUser(dataSourceProperties.getProperty("username"));
driverAdapterCPDS.setPassword(dataSourceProperties.getProperty("password"));
driverAdapterCPDS.setDriver(dataSourceProperties.getProperty("driverClass"));

driverAdapterCPDS.setMaxActive(Integer.valueOf(dataSourceProperties.getProperty("maxActive")));
driverAdapterCPDS.setMaxIdle(Integer.valueOf(dataSourceProperties.getProperty("maxIdle")));
driverAdapterCPDS.setPoolPreparedStatements(Boolean.valueOf(dataSourceProperties.getProperty("poolPreparedStatements")));

SharedPoolDataSource poolDataSource = new SharedPoolDataSource();
poolDataSource.setConnectionPoolDataSource(driverAdapterCPDS);
poolDataSource.setMaxWait(Integer.valueOf(dataSourceProperties.getProperty("maxWait")));
poolDataSource.setDefaultTransactionIsolation(Integer.valueOf(dataSourceProperties.getProperty("defaultTransactionIsolation")));
poolDataSource.setDefaultReadOnly(Boolean.valueOf(dataSourceProperties.getProperty("defaultReadOnly")));
poolDataSource.setTestOnBorrow(Boolean.valueOf(dataSourceProperties.getProperty("testOnBorrow")));
poolDataSource.setValidationQuery("SELECT 0");
12
oᴉɹǝɥɔ

もう一つの選択肢は HikariCP です。

これが比較です ベンチマーク

11
Kunal

ここにDBCPがC3P0かProxoolよりかなり高いパフォーマンスがあることを示すある記事があります。私自身の経験でもc3p0はプリペアドステートメントプーリングのようないくつかの良い機能を持っていてDBCPよりも設定可能ですが、DBCPは私が使ったどんな環境でも明らかに速いです。

Dbcpとc3p0の違いは?何もない! (堺開発者ブログ) http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html

ブログ記事のコメントにあるJavaTechの記事「Connection Pool Showdown」も参照してください。

8
user187702

残念ながら、それらはすべて時代遅れです。 DBCPは少し最近更新されました、他の2つは多くの未解決のバグで、2 - 3歳です。

7
mjb

正しく設定されていれば、Dbcpは製造準備完了です。

たとえば、1日に350000人の訪問者があり、200接続のプールがある商業用Webサイトで使用されています。

正しく設定すれば、タイムアウトは非常にうまく処理されます。

バージョン2が進行中であり、それは多くのプロダクション問題が取り組まれているのでそれを信頼できるものにする背景を持っています。

私達は私達のバッチサーバー解決のためにそれを使い、それはデータベースの何百万もの行で働く何百ものバッチを走らせています。

Tomcat jdbcプールによって実行されたパフォーマンステストはそれがcp30より良いパフォーマンスを持っていることを示しています。

7
UBIK LOAD PACK

もう一つの選択肢、Proxoolは この記事 に述べられています。

Hibernateがデフォルトの接続プール実装にc3p0をバンドルしている理由を見つけることができるかもしれません。

7
toolkit

DBCPで1日半を無駄にしました。私は最新のDBCPリリースを使っていますが、 j pimmel がしたのと全く同じ問題にぶつかりました。 DBCPはお勧めできません。特に、DBがなくなったときに接続をプールから削除すること、DBが戻ってきたときに再接続できないこと、および接続オブジェクトを動的にプールに追加できないことが原因です。ポストJDBCconnect入出力ソケット)

私は今C3P0に切り替えています。私は以前のプロジェクトでそれを使用していました、そしてそれはチャームのように働いて、そして実行しました。

4
Larry H

マルチスレッドプロジェクトを使用している場合は、c3p0が適しています。私たちのプロジェクトでは、DBCPを使って同時に複数のスレッドの実行を使用していましたが、もっと多くのスレッドの実行を使用すると、接続がタイムアウトしました。だから我々はc3p0の設定を行った。

4
nns

接続プールを導入する必要があり、目の前に4つの選択肢がありました。

  • DBCP2
  • C3P0
  • Tomcat JDBC
  • ひかりCP

私達は私達の基準に基づいていくつかのテストと比較を行い、HikariCPに行くことにしました。私たちがHikariCPを選んだ理由を説明する この記事の を読んでください。

3
Jeevan Patil

使いやすい良い選択肢は DBPool です。

「時間ベースの有効期限、ステートメントのキャッシュ、接続検証、およびプールマネージャを使用した簡単な設定をサポートする、Javaベースのデータベース接続プーリングユーティリティ。」

http://www.snaq.net/Java/DBPool/

3
Soundlink

それからC3P0を最良の方法で実装するために この答えをチェックする

C3P0

エンタープライズアプリケーションには、C3P0が最善のアプローチです。 C3P0は、jdbc3 specおよびjdbc2 std拡張で説明されているように、ConnectionおよびStatement Poolingを実装するDataSourceを含む、JNDIバインド可能なDataSourceを持つ従来の(DriverManagerベースの)JDBCドライバを強化するための使いやすいライブラリです。リンクがその下から取り出された場合、DBCPは接続を回復しませんでしたが、C3P0はまた、再開時にDB切断と透過的再接続を堅牢に処理しました。

そのため、c3p0や他の接続プールにもステートメントキャッシュが用意されているのです。これにより、アプリケーションコードでこれらすべての処理を回避できます。ステートメントは通常、限られたLRUプールに保持されるため、一般的なステートメントはPreparedStatementインスタンスを再利用します。

さらに悪いことに、DBCPは、基になるトランスポートが壊れたアプリケーションにConnectionオブジェクトを返していました。 c3p0の一般的な使用例は、Apache Tomcatに含まれている標準のDBCP接続プールを置き換えることです。多くの場合、プログラマは接続がDBCP接続プールで正しくリサイクルされず、この場合はc3p0が貴重な代替品であるという状況に遭遇します。

現在のアップデートでC3P0はいくつかの素晴らしい機能を備えています。それらは以下の通りです。

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setMinPoolSize();
dataSource.setMaxPoolSize();
dataSource.setMaxIdleTime();
dataSource.setMaxStatements();
dataSource.setMaxStatementsPerConnection();
dataSource.setMaxIdleTimeExcessConnections();

ここで、maxとminpoolsizeは、接続の境界を定義します。これは、このアプリケーションで使用される最小接続と最大接続を定義します。 MaxIdleTime()は、アイドル接続をいつ解放するかを定義します。

DBCP

この方法も優れていますが、接続タイムアウトや接続再リースなどの欠点がいくつかあります。私たちがマルチスレッドプロジェクトを使っているとき、C3P0は良いです。私たちのプロジェクトでは、DBCPを使用して同時に複数のスレッド実行を使用していましたが、さらにスレッド実行を使用すると接続タイムアウトになりました。だから我々はc3p0の設定で行きました。 DBCPはお勧めできません。特に、DBがなくなったときに接続をプールから削除すること、DBが戻ってきたときに再接続できないこと、および接続オブジェクトを動的にプールに追加できないことが原因です。ポストJDBCconnect入出力ソケット)

ありがとう:)

1

私のおすすめは

ひかり>ドルイド> UCP> c3p0> DBCP

それは私がテストしたものに基づいています - 20190202、私のローカルテスト環境(docker/poolで4GBのmac/mysql、minSize = 1、maxSize = 8)で、光は1024スレッドx 1024回接続するのに役立ちます、各スレッドの平均時間c3p0は256スレッドx 1024回しか処理できず、各スレッドの平均時間はすでに2100万秒です。 (512スレッドが失敗しました)。

0
Kyle Zhang