我在Tomcat 7中有一个server.xml的配置:
<Resource auth="Container" driverClassName="org.postgresql.Driver" global="jdbc/MyDB" maxActive="100" maxIdle="8" maxWait="10000" minIdle="0" name="jdbc/MyDB" password="XXXX" type="javax.sql.DataSource" url="jdbc:postgresql://myServer:5432/SomeDBName" username="postgres"
removeAbandoned="true" removeAbandonedTimeout="20" logAbandoned="true" maxAge="600000"/>
在我的wepapp初始化时,执行以下代码:
DataSource dsRand = (DataSource) getContext().lookup("some jndi to the database");
在我的webapp中登录后,执行以下代码:
Connection conRand = null;
Statement stmtRand = null;
ResultSet rsRand = null;
conRand = dsRand.getConnection();
stmtRand = conRand.createStatement();
...
finally {
DbUtils.closeQuietly(rsRand);
DbUtils.closeQuietly(stmtRand);
DbUtils.closeQuietly(conRand);
}
然后,在我登录我的webapp之前,我使用以下命令检查Postgres数据库中的连接表:
SELECT datname,procpid,current_query,backend_start,client_addr, to_char(now()-backend_start, 'HH24:MI:SS') as age FROM pg_stat_activity ORDER BY backend_start;
然后我登录并且现在存在连接。而它只是坐在那里,它没有关闭。当我在上面调用close()时,它不应该从表中删除吗?
目前,我的浏览器与数据库有2个连接,而且我是唯一登录的(测试环境)。我上面提到的查询显示连接的时间是1.5小时0.5小时,这与Tomcat DataSource容器定义afaik完全不对应。
我在这里做错了什么?我在这里误解了什么吗?
PostgreSQL 8.4.22,Tomcat 7.0,Java 1.7
祝你好运, 詹纳斯
答案 0 :(得分:1)
Tomcat数据源正在使用连接池。 所以
在你的finally块中DbUtils.closeQueitly(conRand)
是不关闭与数据库的连接, 但只是 将连接返回到池中。
使用您的配置
了maxidle = “8”
导致最多8个连接“保持打开”以便重复使用。
在数据源资源上使用配置(在conf / server.xml中) 控制 是否保留连接(以及多少)