Java 使用Spring的Tomcat jdbc池

Java 使用Spring的Tomcat jdbc池,java,spring,tomcat,connection-pooling,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 对于应用程序,我使用spring框架,使用Tomc

我收到这样的警告:

WARNING:[PoolCleaner[661646649:1440675349770]] org.apache.tomcat.jdbc.pool.ConnectionPool.abandon 
Connection has been abandoned PooledConnection[org.postgresql.jdbc4.Jdbc4Connection@7c9e8e2e]:
java.lang.Exception
对于应用程序,我使用spring框架,使用TomcatJDBC池和Postgres作为数据库。我的配置文件:

<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>

更新:我发现了错误。我的连接变量是全局的,我把它设置为方法的局部变量,所有的事情都解决了。还通过Apache基准测试,使用了池。(连接已更新,由pg_stat_活动查看)。谢谢你的回复

如果在
X
秒(超时)内未使用连接,且未返回到池,则认为该连接已被放弃,即行为不当的代码使连接保持打开状态(或者更确切地说,未将其返回到池)

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

这要么是连接池中的错误(对于这样的标准功能来说不太可能),要么是某个连接被不正确地使用。这可能并不明显


您还可以通过pg_stat_活动中的
select*,从Postgres侧监控连接。您应该可以很好地看到池中正在等待的连接,因为它们显示了
SELECT 1
验证查询。

没有错误代码,我确保连接已关闭。在spring中,我认为没有办法显式地将连接返回到池中,也就是说,在我关闭连接后,它会自动返回。关闭连接就是将连接返回到池中,尽管是半显式的。包装类重写
close()
,因此连接实际上没有关闭。等一下编辑…Kayaman,我已经在用它监控连接了,但是谢谢你的建议。嗯,我很确定我正在关闭连接。我正在检查它是否关着。[Connection.isClosed()]
select*from pg_stat_activity
显示空闲的连接(我想是池中的连接)?它是否显示放弃的连接?或者它认为被放弃的连接是空闲的?Postgres不知道被放弃的连接,也不在乎。它要么连接,要么不连接。放弃的连接应显示执行的最后一次查询,
query\u start
将在
timeout
秒前结束。但是,如果一个连接从池中签出、未使用且从未返回,它仍然会显示
SELECT 1
查询作为最后一个查询。为什么我会获得否决票?你们能至少解释一下你们的理由吗?这样,下次我就不会再犯同样的错误了。
//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()