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