Hibernate:是什么让JDBC连接变得昂贵?

时间:2011-06-21 04:55:01

标签: java hibernate jdbc transactions

我读了一本关于Hibernate的书,我遇到了关于Session对象的以下陈述。

  

....但是如你所知,持有JDBC   跨多个请求的连接   不推荐,因为它是一个   昂贵的资源。因此,如果我们想   维护Hibernate Session   很长一段时间,使它跨越   多次重用请求   我们想要的持久化实例   断开会话的JDBC   没有的每个请求的连接   结束会议。我们可以用   disconnect()和reconnect()方法   在Session界面中支持   这种要求。

断开连接并重新连接JDBC会使它比保持原样更昂贵吗?究竟是什么让资源变得昂贵?

3 个答案:

答案 0 :(得分:8)

在创建(建立)新连接时发生跨越多台计算机(如果您的数据库服务器通过网络托管)的握手过程会使其变得昂贵。这就是为什么它建议使用连接池,或者在你的情况下使用会话。这可能包括主机查找,初始连接和后续控制命令。

答案 1 :(得分:7)

Session接口上的断开连接和重新连接通常不会实际终止与数据库的连接。期望您正在使用池化提供程序并断开会话只是将实际的JDBC连接返回到池以供其他人使用。

对于大规模DBMS,打开连接和打开游标的开销远远高于Java应用服务器上的Web请求的开销。作为应用服务器可以处理数百个同时Web请求的物理计算机,只能处理30-50个并发连接作为Oracle 11服务器。 (只是个人/轶事经验,而不是真正的基准。)

如果您在整个“对话”周期中建立连接,那么您的Web吞吐量将仅限于您的数据库资源,这也会比Web请求处理程序线程更快地耗尽。通过仅在您需要时保持连接,而不是整个请求生命周期,在等待数据库连接时阻塞的Web请求线程更少。

答案 2 :(得分:2)

这取决于资源是什么。但是对于像数据库连接这样的东西,它被认为是昂贵的,因为为了做到这一点,机器必须分配套接字,内存,文件和其他资源来保持你和数据库之间的连接打开。设置连接也需要相当多的时间(从计算机的角度来看),因此不断打开和关闭它会降低你的速度。

最好的折衷方案是使用连接池。因此,在需要它的多个事物之间共享一个连接。这样可以节省大量的时间和资源,并且考虑到大多数情况下连接不会被持续使用,所以可以更好地分享连接。