Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate JDBC连接是否应该与netstat网络连接匹配?_Hibernate_Postgresql_Tomcat_Jdbc_Transactions - Fatal编程技术网

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

Hibernate JDBC连接是否应该与netstat网络连接匹配?,hibernate,postgresql,tomcat,jdbc,transactions,Hibernate,Postgresql,Tomcat,Jdbc,Transactions,我们有一个Tomcat6/Hibernate 3.x/Postgres应用程序,我对应用程序服务器和数据库之间的“连接”有点茫然,至少就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

我们有一个Tomcat6/Hibernate 3.x/Postgres应用程序,我对应用程序服务器和数据库之间的“连接”有点茫然,至少就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的比例创建的吗?这只是连接池实际工作的证据吗

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

当应用程序事务完成时,将调用该方法。代理将拦截
close
方法,并将连接对象简单地返回到池中,而不是实际关闭物理连接

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

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

为了监视和优化您的连接池,我建议您开始使用

是的,这是游泳池工作的证据。谢谢你的回复,EJP。不过有点困惑:远程运行jconsole会向我显示池清理器,但没有其他与池相关的线程。可以安全地假设这只是我们的应用程序和jconsole的配置问题?为什么会有其他线程与池相关?老实说,我不确定应该在输出中看到什么。我想我希望池中的每个连接都有一个单独的线程(我没有任何理由这样做;我正在学习这一点)。再次感谢你的帮助。我们在Hibernate事务中使用autocommit,并且我们已经将发布模式设置为“自动”(我们没有使用JTA)。我将查看FlexyPool。谢谢一旦我有了足够的代表,我就投票支持这个答案——非常好地解释了JDBC和物理连接之间的关系。谢谢你的好话。如果您有任何其他与Hibernate/transactions/JDBC/Spring/Database相关的有趣问题(如本文),您可以ping我,我来看看。FlexyPool是一个小型但功能强大的实用程序,我们行业的一些主要参与者(美国和瑞士的银行)正在使用它。