数据库 – 如何在使用C3P0时最好地关闭连接并避免非活动会话?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了数据库 – 如何在使用C3P0时最好地关闭连接并避免非活动会话?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3762字,纯文字阅读大概需要6分钟。
内容图文
我正在使用c3p0进行连接池.我使用的ComboPooledDataSource配置如下.
@Bean
public DataSource dataSource() {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("user");
dataSource.setDriverClass("oracle.jdbc.OracleDriver");
dataSource.setJdbcUrl("test");
dataSource.setPassword("test");
dataSource.setMinPoolSize("10");
dataSource.setMaxPoolSize("20");
dataSource.setMaxStatements("100");
return dataSource;
}
我正面临着一些问题.我收到警告说这可能会泄漏连接.还有以下错误,不时
因为所有连接都在用完.
java.sql.SQLException: Io exception: Got minus one from a read call
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:439)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection
(WrapperConnectionPoolDataSource.java:182)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection
(WrapperConnectionPoolDataSource.java:171)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource
(C3P0PooledConnectionPool.java:137)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
从DB stat,可以看到近290个非活动连接.我在两台服务器上部署了大约8个应用程序,
连接到同一个DB.
我的疑问是
>如何确保连接已关闭且没有这些非活动连接?
>配置空闲时间和超时是否可以解决此问题?
>如果服务器关闭/ tomcat关闭会发生什么情况,连接是否会保持打开状态?
>连接主要在启动期间用于加载缓存,那么之后是否有办法不使用这些连接?
>我应该如何处理现有的非活动连接?
解决方法:
>如果maxPoolSize为20和8个部署,您应该最多可以看到180个连接,如果应用程序已经看到流量已经消退,则可能处于非活动状态.您没有配置任何内容来鼓励快速缩小池 – 设置为maxIdleTime和/或maxIdleTimeExcessConnections和/或maxConnectionAge.
>您应该告诉Spring如何关闭您定义的DataSource.在dataSource()方法之上单独使用@Bean(destroyMethodName =“close”)而不是@Bean.
>您尚未配置任何类型的连接测试,因此即使损坏的连接可能仍保留在池中.请参阅Simple Advice On Connection Testing.
>如果问题是连接泄漏,客户端最终将无限期挂起,因为池将超出Connections以检出,但已经达到maxPoolSize,因此无法从DBMS获取更多内容.你是否看到客户这样挂?
>您避免连接泄漏的方式是,在Java7之后,始终通过try-with-resources从您的DataSource获取Connections.即,使用…
try ( Connection conn = myDataSource.getConnection() ) {
...
}
而不是在可能抛出异常或在try块中的方法中调用getConnection().如果您使用的是旧版本的Java,则需要使用健壮的资源清理惯用法,即在try块中获取Connection,并确保conn.close()始终在finally块中关闭,无论是否finally块中的其他失败.如果您不直接使用DataSource,但让Spring实用程序使用它,希望这些实用程序正在做正确的事情.但是你应该发布你收到的任何警告警告你潜在的连接泄漏!
>如果您的应用程序在“预热”之后几乎没有使用Connections,并且您希望最小化资源占用空间,请将minPoolSize设置为非常低的数字,并使用上面的maxIdleTime和/或maxIdleTimeExcessConnections和/或maxConnectionAge来确保当连接不再需要时,池会立即缩小.或者,您可以在完成其工作后关闭()DataSource,但您可能将其留给Spring.
内容总结
以上是互联网集市为您收集整理的数据库 – 如何在使用C3P0时最好地关闭连接并避免非活动会话?全部内容,希望文章能够帮你解决数据库 – 如何在使用C3P0时最好地关闭连接并避免非活动会话?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。