karaf + pax-jdbc连接池已达到限制

时间:2016-03-27 17:04:00

标签: mysql osgi apache-karaf pax jdbc-pool

我在karaf中遇到了pax-jdbc的池连接问题,我正在尝试通过注入一个Mysql DataSource(DS) blueprint.xml进入我的项目,为了测试它,我已经构建了一个karaf命令,其中将DS注入karaf命令类 并使用该连接执行查询。这没关系,但问题是当我执行命令很多次时,为 每次执行都会创建一个新的DS实例,并且池连接无法打开到MySQL的新连接,因为 游泳池已达到极限。

我已将此代码上传到此链接中的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-connection”,它会冻结karaf的提示,如果你打断了 执行你可以得到这个例外:

  

java.sql.SQLException:无法获取连接,一般错误在   org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:146)     在com.twim.OrmCommand.execute(OrmCommand.java:53)at   org.apache.karaf.shell.impl.action.command.ActionCommand.execute(ActionCommand.java:83)     在   org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:67)     在   org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:87)     在org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)     在   org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)     在org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)at   org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)at at   org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)at at   org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)     在   org.apache.karaf.shell.impl.console.ConsoleSessionImpl.run(ConsoleSessionImpl.java:270)     在java.lang.Thread.run(Thread.java:745)引起:   java.lang.InterruptedException at   java.util.concurrent.locks.AbstractQueuedSynchronizer中的$ ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2014)     在   java.util.concurrent.locks.AbstractQueuedSynchronizer中的$ ConditionObject.await(AbstractQueuedSynchronizer.java:2048)     在   org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583)     在   org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)     在   org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)     在   org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134)     ......还有12个

1 个答案:

答案 0 :(得分:2)

代码中的问题位于System.out.println("--DS--: " + ds.getConnection());行。

您创建了一个连接,但从未关闭它。因此,每次通话都会耗尽游泳池。