我在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个
答案 0 :(得分:2)
代码中的问题位于System.out.println("--DS--: " + ds.getConnection());
行。
您创建了一个连接,但从未关闭它。因此,每次通话都会耗尽游泳池。