java - 与 Spring 的 Tomcat jdbc 池

标签 java spring tomcat connection-pooling

我收到这个警告:

WARNING:[PoolCleaner[661646649:1440675349770]] org.apache.tomcat.jdbc.pool.ConnectionPool.abandon 
Connection has been abandoned PooledConnection[org.postgresql.jdbc4.Jdbc4Connection@7c9e8e2e]:
java.lang.Exception

对于应用程序,我使用带有 Tomcat JDBC 池和 Postgres 作为数据库的 spring 框架。我的配置文件:

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://ip/db" />
        <property name="username" value="user" />
        <property name="password" value="pass" />
        <property name="initialSize" value="5" />
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="10" />
        <property name="testOnBorrow" value="true" />
        <property name="validationInterval" value="30000" />
        <property name="minIdle" value="5" />
        <property name="removeAbandoned" value="true" />
        <property name="removeAbandonedTimeout" value="60" />
        <property name="logAbandoned" value="true" />
        <property name="validationQuery" value="SELECT 1" />
        <property name="initSQL" value="SET application_name = 'app'" />
    </bean>

问题来了。根据我的理解,removeAbandoned 应该只放弃使用超过 60 秒的连接,即运行超过 60 秒的查询。我根本没有这样的疑问。但是我与池的连接被放弃了。

我怀疑 removeAbandoned 正在删除池中的空闲连接。虽然它不应该这样做。 在我的应用程序中,我通过这种方式获得连接:

//i am using autowiring.
@Autowired
private DataSource dataSource; 
//and in my methods i use it this way: 
Connection conn = dataSource.getConnection();
//and i am closing it after method completion
//maybe i should not??
conn.close()

更新:我发现了错误。我的 Connection 变量是全局的,我将它设为方法的本地变量,一切正常。同样通过 Apache 基准测试,使用了池化。 (连接已更新,由 pg_stat_activity 看到)。感谢您的回复。

最佳答案

如果连接在 X 秒(超时)内没有被使用并且没有返回到池中,它被认为是被放弃的,即行为不当的代码使连接保持打开状态(或者更确切地说没有不要把它放回池子里)。

空闲连接不会被丢弃(或者至少它们不应该被丢弃),因为它们没有被使用。

它要么是连接池中的错误(不太可能用于此类标准功能),要么是某处连接使用不当。这可能并不明显。

您还可以从 Postgres 端监控连接,使用 select * FROM pg_stat_activity;。您应该清楚地看到在池中等待的那些,因为它们显示了 SELECT 1 验证查询。

关于java - 与 Spring 的 Tomcat jdbc 池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32249485/

相关文章:

java - 创建一个简单的 Hello world Android 客户端-服务器程序

java - 定义带有别名和空值的 spring bean

java - 无法在java中的数据库中保存日历数据

java:Tomcat 9 状态代码 200 但响应消息为空

java - 为什么我需要在 tomcat 应用程序上启用 CORS

java - 将 CSS 文件附加到 Tomcat 中的 Java Servlet

java - 如何摆脱这个警告?该字段的值未被使用

java - 为什么我仍然可以更改这个最终变量?

Java 正则表达式在行中找到模式时找不到匹配项抛出异常

java - Spring-注入(inject)的变量为空