我应该将哪个JDBC连接池库用于新的应用程序项目(而不是Web应用程序)?
我应该选择BoneCP吗?我没有任何巨大的要求.我只需要一个好的,易于使用的数据库连接池,即正在开发中.图书馆,作者可以回复错误报告,回答一些具体问题等.
顺便说一下,实际上,我只使用MySQL.我发现,MySQL驱动程序支持DriverManager接口,但我不确定它是否实际上是连接池.
在厌倦了c3p0的持续锁定后,我转向BoneCP,为我的数据库提供了一个替代连接池.我有一个服务器应用程序,每分钟处理大约7,000个项目,需要将这些项目记录到我们的MySQL数据库中.我目前有100个工作线程,并设置我的池如下:
BoneCPConfig config = new BoneCPConfig();
config.setJdbcUrl("jdbc:mysql://"+Settings.MYSQL_HOSTNAME+"/"+Settings.MYSQL_DATABASE+"?autoReconnectForPools=true" );
config.setUsername(Settings.MYSQL_USERNAME);
config.setPassword(Settings.MYSQL_PASSWORD);
config.setMinConnectionsPerPartition(5);
config.setMaxConnectionsPerPartition(10);
config.setPartitionCount(5);
config.setAcquireIncrement(5);
connectionPool = new BoneCP(config); // setup the connection pool
Run Code Online (Sandbox Code Playgroud)
这些应用程序的可接受设置是什么?我问,因为在运行一两分钟后,我在尝试呼叫getConnection
池时遇到了BoneCP异常.谢谢您的帮助.
这是我在工作线程中用于db调用的代码,它不能在线上失败dbConn = this.dbPool.getConnection()
.我没有正确关闭连接吗?
private void insertIntoDb() {
try {
Connection dbConn = this.dbPool.getConnection();
try {
PreparedStatement ps3 = dbConn.prepareStatement("INSERT IGNORE INTO test_table1 SET test1=?, test2=?, test3=?");
ps3.setString(1, "some string");
ps3.setString(2, "some other string");
ps3.setString(3, "more strings");
ps3.execute();
ps3.close();
PreparedStatement ps4 = dbConn.prepareStatement("INSERT IGNORE INTO test_table2 SET test1=?, test2=?, test3=?");
ps4.setString(1, "some string"); …
Run Code Online (Sandbox Code Playgroud) 我在我的Java项目中使用BoneCP.但是,遗憾的是,我发现数据库发生故障后该池无法恢复.我不是唯一一个有这种问题的人(如果你想要看官方论坛).由于我(和许多其他人)从未在bonecp论坛上得到答案,似乎不再支持这个项目,我的问题不太可能得到解决.
因此,我正在寻找一个替代的主动开发和支持的连接池库,它能够正确处理数据库中断,并在数据库再次可用时立即恢复.
来自官方BoneCP doc:http://jolbox.com/index.html?page = http://jolbox.com/configuration.html
partitionCount为了减少锁争用并从而提高性能,每个传入连接请求都从具有线程关联性的池(即pool [threadId%partition_count])中选择一个连接.这个数字越高,当你有足够的短期线程时,你的性能会越好.超过某个阈值时,这些池的维护将开始对性能产生负面影响(仅适用于分区上的连接开始耗尽的情况).
默认值:2,最小值:1,推荐值:3-4(但非常适合应用)
但它不是那么清楚,没有一个很好的例子.我正在运行一个普通的Web服务,同时有0-500个线程.这是一个很好的价值,为什么?
我们的网站每天大约获得1M PV,我们肯定会使用Tomcat.
我找不到有关jdbc-pool的更多信息,不确定它是否足够稳定以供生产.有人有经验吗?以及任何配置/调整内容供参考?
正如有人提到的,BoneCP可能是另一种选择.但似乎它已经停止了(太可悲了......).这会是一个更好的选择吗?
顺便说一句,HikariCP太年轻了,我会留意它,因为它是迄今为止我发现的最新/最快的CP.
谢谢你的建议.
我刚刚开始使用BoneCP并从作者站点中提取示例JDBC代码.
我有一个名为getConnection()的函数返回一个连接,这里是一个片段:
// setup the connection pool
BoneCPConfig config = new BoneCPConfig();
// Config goes here.
connectionPool = new BoneCP(config); // setup the connection pool
return connectionPool.getConnection(); // fetch a connection
Run Code Online (Sandbox Code Playgroud)
现在,我的问题:1)当我完成使用从上面的函数返回的连接时,我是否调用connection.close(),以便它返回到池中,或者它是否完全关闭连接?如何返回池连接?
2)如何在应用程序退出时清理池?我结束时会调用connectionPool.shutdown()吗?而且,我读到某个地方我需要单独关闭所有池化连接?这是真的?
谢谢.
我们正在尝试从c3p0迁移到bonecp连接池.我们使用hibernate作为ORM工具.
现在,有没有什么办法来监控像结识池中的时间以及是否有游泳池等未归还的任何连接的特定点的最大可用和忙碌连接在boncecp的连接?
谢谢您的帮助
我正在使用Postgres 9.2-1002-jdbc4和Anorm 2.2.0 API运行Play 2.2.0应用程序.我经常遇到连接问题,如下所示:
2013-11-19 19:45:36,544 [ERROR][a.d.Dispatcher][play-akka.actor.default-dispatcher-17] This connection has been closed.org.postgresql.util.PSQLException: This connection has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:822) ~[org.postgresql.postgresql-9.2-1002-jdbc4.jar:na]
at org.postgresql.jdbc2.AbstractJdbc2Connection.setAutoCommit(AbstractJdbc2Connection.java:769) ~[org.postgresql.postgresql-9.2-1002-jdbc4.jar:na]
at com.jolbox.bonecp.ConnectionHandle.setAutoCommit(ConnectionHandle.java:1247) ~[com.jolbox.bonecp-0.8.0-rc1.jar:na]
at com.jolbox.bonecp.ConnectionHandle.<init>(ConnectionHandle.java:251) ~[com.jolbox.bonecp-0.8.0-rc1.jar:na]
at com.jolbox.bonecp.ConnectionHandle.recreateConnectionHandle(ConnectionHandle.java:273) ~[com.jolbox.bonecp-0.8.0-rc1.jar:na]
at com.jolbox.bonecp.ConnectionHandle.close(ConnectionHandle.java:476) ~[com.jolbox.bonecp-0.8.0-rc1.jar:na]
at play.api.db.AutoCleanConnection.close(DB.scala:485) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.DBApi$class.withConnection(DB.scala:84) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.BoneCPApi.withConnection(DB.scala:276) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.DBApi$class.withTransaction(DB.scala:97) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.BoneCPApi.withTransaction(DB.scala:276) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.DB$$anonfun$withTransaction$4.apply(DB.scala:185) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.DB$$anonfun$withTransaction$4.apply(DB.scala:185) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at scala.Option.map(Option.scala:145) ~[org.scala-lang.scala-library-2.10.2.jar:na]
at play.api.db.DB$.withTransaction(DB.scala:185) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
Run Code Online (Sandbox Code Playgroud)
我知道没有数据库连接问题; 数据库运行在同一个盒子上.这些连接问题每天间歇性地发生2-3次,并且可以自行恢复.
我尝试了这些荒谬的低连接测试设置:
db.default.idleConnectionTestPeriod=10 seconds
db.default.idleMaxAge=30 seconds
db.default.maxConnectionAge=60 seconds
Run Code Online (Sandbox Code Playgroud)
这些连接设置似乎可以减少它,虽然我想知道是否有更基本的事情发生.postgres日志中没有任何内容.
我刚刚开始使用BoneCP,这是我第一次使用连接池.关于我应该如何使用它,我有点困惑.目前我将BoneCP对象保存为静态变量,因此我可以在不同的连接之间使用它.
当我完成连接后,我将其关闭connection.close()
.
我应该这样做,还是我不应该关闭它以使它能够被池重用?
这是我当前获得连接的实现:
private static BoneCP connectionPool;
public Connection getConnection() throws SQLException {
if (connectionPool == null) {
initPool();
}
return connectionPool.getConnection();
}
private void initPool() throws SQLException {
BoneCPConfig config = new BoneCPConfig();
config.setJdbcUrl(DB_URL);
config.setUsername(DB_USERNAME);
config.setPassword(DB_PASSWORD);
config.setMinConnectionsPerPartition(5);
config.setMaxConnectionsPerPartition(10);
config.setPartitionCount(1);
connectionPool = new BoneCP(config);
}
Run Code Online (Sandbox Code Playgroud)
这看起来是正确的还是我误解了我应该如何使用BoneCP?