我们有一个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的比例创建的吗?这只是连接池实际工作的证据吗?
答案 0 :(得分:3)
这就是connection pooling的工作方式。该池打开N个物理数据库连接,当应用程序获取连接时,它将获得JDBC Connection代理,而不是实际的驱动程序连接对象。
完成应用程序事务后,将调用Connection.close()方法。代理将拦截close
方法,只是将Connection对象返回到池中,而不是实际关闭物理连接。
您看到如此多的openConnection()
和closeConnection()
方法的原因可以解释如下:
为了监控和调整连接池,我建议您开始使用FlexyPool。