使用 guice、mybatis 和 c3p0 或 bonecp 配置连接池大小
Posted
技术标签:
【中文标题】使用 guice、mybatis 和 c3p0 或 bonecp 配置连接池大小【英文标题】:Configuring connection pool size with guice, mybatis, and c3p0 or bonecp 【发布时间】:2014-11-18 04:18:54 【问题描述】:我正在使用 Guice/Mybatis 来管理和执行我对 mysql 数据库的查询。我建立连接和扩展 MyBatisModule 的类包含以下相关位:
Properties myBatisProperties = new Properties();
myBatisProperties.setProperty("c3p0.maxPoolSize", "5");
myBatisProperties.setProperty("c3p0.initialPoolSize", "5");
bindDataSourceProviderType(C3p0DataSourceProvider.class);
bindTransactionFactoryType(JdbcTransactionFactory.class);
addMapperClass(getMapperClass());
Names.bindProperties(binder(), myBatisProperties);
bind(getBindServiceClass()).to(getBindServiceToClass());
当我使用 c3p0 或 bonecp 配置使用其属性 bonecp.maxConnectionsPerPartition
和 bonecp.partitionCount
,并使用适当的 DataSourceProvider.class
代替 C3p0DataSourceProvider
进行配置时,c3p0 和 bonecp 都会忽略我的最大连接配置并打开(和保持打开)为每个查询建立一个新连接,直到 mysql 用完可用连接。
当我使用默认的 mybatis 池提供程序 PooledDataSourceProvider
及其属性 mybatis.pooled.maximumActiveConnections
和 mybatis.pooled.maximumIdleConnections
时,它尊重我的配置并正确池连接。
我做错了什么?
更多文档请访问http://mybatis.github.io/guice/datasources.html
【问题讨论】:
re c3p0:c3p0 在池初始化时将其配置转储到 INFO。检查您的日志并验证您想要的设置是否已进入数据源。如果没有,除了通过您使用的包装器之外,还有很多其他方法可以配置 c3p0。 奇怪... 3cp0 声称其最大池大小为 5:[ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> true, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, forceIgnoreUnresolvedTransactions -> false, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 5, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, unreturnedConnectionTimeout -> 0]
(我从中删除了一些内容以符合评论大小限制。如果您没有看到可能相关的内容,请告诉我,我会发布)
啊哈!这就是问题所在。 C3P0 池在应用程序的生命周期内被多次初始化。每个查询一次,但每隔几个查询就会发生一次。我会继续挖掘。
【参考方案1】:
看起来问题是由于我每次都创建了一个新的注入器。特别是这一行:
Injector injector = Guice.createInjector(new MyDAOPoolModule());
return injector.getInstance(MyDAOService.class);
如果我将注入器设为单例,它只会创建一个池。
【讨论】:
以上是关于使用 guice、mybatis 和 c3p0 或 bonecp 配置连接池大小的主要内容,如果未能解决你的问题,请参考以下文章