使用Tomcat DataSource容器时未连接连接

时间:2016-02-29 14:17:02

标签: java postgresql tomcat

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

祝你好运, 詹纳斯

1 个答案:

答案 0 :(得分:1)

Tomcat数据源正在使用连接池。 所以

  
    

DbUtils.closeQueitly(conRand)

  
在你的finally块中

是不关闭与数据库的连接, 但只是 将连接返回到池中。

使用您的配置

  

了maxidle = “8”

导致最多8个连接“保持打开”以便重复使用。

在数据源资源上使用配置(在conf / server.xml中) 控制 是否保留连接(以及多少)

详情请参阅Tomcat 7 Datasource HOW-TOTomcat 7 Pool Attributes