使用 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.maxConnectionsPerPartitionbonecp.partitionCount,并使用适当的 DataSourceProvider.class 代替 C3p0DataSourceProvider 进行配置时,c3p0 和 bonecp 都会忽略我的最大连接配置并打开(和保持打开)为每个查询建立一个新连接,直到 mysql 用完可用连接。

当我使用默认的 mybatis 池提供程序 PooledDataSourceProvider 及其属性 mybatis.pooled.maximumActiveConnectionsmybatis.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 配置连接池大小的主要内容,如果未能解决你的问题,请参考以下文章

Guice重写NamedCache绑定

Guice 注入空指针

springBoot和c3p0的整合

OptionalBinding 使用 Guice 避免用户绑定

使用 Guice 实现 Restlet

Guice、Peaberry 和 ServletModule