JDBC连接是否应该与netstat网络连接匹配?

时间:2015-01-29 23:25:04

标签: hibernate postgresql tomcat jdbc transactions

我们有一个Tomcat6 / Hibernate 3.x / Postgres应用程序,而且我无助于我的深度有点不清楚应用服务器和数据库之间的“连接”是什么,至少就JDBC而言。

表面上我们正在使用一个连接池(Tomcat JDBC),它在启动时打开10个连接。 Netstat似乎证实了这一点:

netstat -nato | grep 5432
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)

但这些连接始终处于“关闭”状态。当我将Hibernate日志设置为DEBUG for JDBC时,我看到大量的openConnection()closeConnection()调用(对于一个简单的网页超过100),但netstat的输出保持不变。

JDBC和网络连接不是以1:1的比例创建的吗?这只是连接池实际工作的证据吗?

1 个答案:

答案 0 :(得分:3)

这就是connection pooling的工作方式。该池打开N个物理数据库连接,当应用程序获取连接时,它将获得JDBC Connection代理,而不是实际的驱动程序连接对象。

完成应用程序事务后,将调用Connection.close()方法。代理将拦截close方法,只是将Connection对象返回到池中,而不是实际关闭物理连接。

您看到如此多的openConnection()closeConnection()方法的原因可以解释如下:

  • 您正在使用JTA,它在每个语句的基础上要求aggressive connection release
  • 您不会将操作包装在单个@Transactional服务方法中,并且Hibernate默认为自动提交,因此每个语句都将在其自己的特定事务中运行(并且每个语句实际上都需要Connection获取/发布周期)
  • 您大量使用Ajax,因此加载首页不仅仅是一个HTTP请求。您提出的异步请求越多,所需的事务就越多,您对连接池的压力就越大。

为了监控和调整连接池,我建议您开始使用FlexyPool