我读了一本关于Hibernate的书,我遇到了关于Session对象的以下陈述。
....但是如你所知,持有JDBC 跨多个请求的连接 不推荐,因为它是一个 昂贵的资源。因此,如果我们想 维护Hibernate Session 很长一段时间,使它跨越 多次重用请求 我们想要的持久化实例 断开会话的JDBC 没有的每个请求的连接 结束会议。我们可以用 disconnect()和reconnect()方法 在Session界面中支持 这种要求。
断开连接并重新连接JDBC会使它比保持原样更昂贵吗?究竟是什么让资源变得昂贵?
答案 0 :(得分:8)
在创建(建立)新连接时发生跨越多台计算机(如果您的数据库服务器通过网络托管)的握手过程会使其变得昂贵。这就是为什么它建议使用连接池,或者在你的情况下使用会话。这可能包括主机查找,初始连接和后续控制命令。
答案 1 :(得分:7)
Session接口上的断开连接和重新连接通常不会实际终止与数据库的连接。期望您正在使用池化提供程序并断开会话只是将实际的JDBC连接返回到池以供其他人使用。
对于大规模DBMS,打开连接和打开游标的开销远远高于Java应用服务器上的Web请求的开销。作为应用服务器可以处理数百个同时Web请求的物理计算机,只能处理30-50个并发连接作为Oracle 11服务器。 (只是个人/轶事经验,而不是真正的基准。)
如果您在整个“对话”周期中建立连接,那么您的Web吞吐量将仅限于您的数据库资源,这也会比Web请求处理程序线程更快地耗尽。通过仅在您需要时保持连接,而不是整个请求生命周期,在等待数据库连接时阻塞的Web请求线程更少。
答案 2 :(得分:2)
这取决于资源是什么。但是对于像数据库连接这样的东西,它被认为是昂贵的,因为为了做到这一点,机器必须分配套接字,内存,文件和其他资源来保持你和数据库之间的连接打开。设置连接也需要相当多的时间(从计算机的角度来看),因此不断打开和关闭它会降低你的速度。
最好的折衷方案是使用连接池。因此,在需要它的多个事物之间共享一个连接。这样可以节省大量的时间和资源,并且考虑到大多数情况下连接不会被持续使用,所以可以更好地分享连接。