2016-03-27 15 views
0

私はkarafのpax-jdbcのプール接続に問題があります。私は blueprint.xmlから私のプロジェクトにMysql DataSource(DS)を注入しようとしています。 、テストのためには、私はkarafコマンドクラス にDSを注入し、その接続を使用してクエリを実行しkarafコマンドを構築しています。それはOKですが、 プールが限界に達していたので、私は、 DSの新しいインスタンスが作成された各実行とMySQLへの新しい接続を開くことができませんプールの接続のために、コマンドに多くの時間を実行するときに問題があること。karaf + pax-jdbc接続プールが上限に達しました

githubにhttps://github.com/christmo/karaf-pax-jdbcというコードをアップロードしました。このプロジェクトでエラーが見つかった場合は、 をプルリクエストできます。テストのために

あなたが行うことができ、このプロジェクト:

1. Download karaf 4.0.4 or apache-karaf-4.1.0-SNAPSHOT 
2. Copy the file karaf-pax-jdbc/etc/org.ops4j.datasource-my-ds.cfg to ${karaf}/etc, this file have the mysql 
    configuration change with your mysql configuration data. 
4. Start mysql database engine 
3. Start karaf -> cd ${karaf}/bin/; ./karaf 
4. Add the repo of this project with this karaf command: feature:repo-add mvn:pax/features/1.0-SNAPSHOT/xml/features 
5. Install the feature created for this project: feature:install mysql-test 
6. Execute the command for test this problem: mysql-connection, this command only execute "Select 1" in mysql 

あなたは9回、このコマンド「のmysql-接続」を実行すると、それはkarafのプロンプトを凍結すると、あなたが 実行を中断した場合、あなたがこれを取得することができます例外:

ます。java.sql.SQLException:com.twim.OrmCommand.executeで を org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:146)での接続、一般的なエラーを取得できません(OrmCommand.java:53)at 0 org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.executeでorg.apache.karaf.shell.impl.action.command.ActionCommand.execute(ActionCommand.java:83) (SecuredCommand。 java:67) at org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:87) at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure .java:480) at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406) at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108) org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182) org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)at(ConsoleSessionImpl.java:270) at java。 java.utilので java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2014) で java.lang.InterruptedException:lang.Thread.run(Thread.java:745は)によって引き起こされます。 org.apache.commons.poでconcurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583)で(AbstractQueuedSynchronizer.java:2048) org.apache.commons.dbcp2.PoolingDataSourceでol2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442) でorg.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) 。あなたのコードに問題がラインSystem.out.println("--DS--: " + ds.getConnection());である

答えて

2

のgetConnection(PoolingDataSource.java:134) ... 12以上。

がありますが、接続を作成し、それを閉じることはありません。だからすべての呼び出しでプールを排水します。

+0

うわー! @クリスチャンシュナイダー、私はその行が私の問題のおかげであると信じられない。 :) – christmo