为什么我应该更喜欢使用连接池而不是 Tomcat 中静态类中的静态变量来保存数据库连接?
在我看来,这相当于使用只能存储一个连接的连接池。所以,一个相关的问题是:为什么一个连接池的容量需要大于一个连接?
提前致谢。
为什么我应该更喜欢使用连接池而不是 Tomcat 中静态类中的静态变量来保存数据库连接?
在我看来,这相当于使用只能存储一个连接的连接池。所以,一个相关的问题是:为什么一个连接池的容量需要大于一个连接?
提前致谢。
使用池,您可以有多个线程使用不同的连接。您真的想将您的 Web 应用程序限制为一次处理一个与数据库相关的请求吗?:) (并添加同步的复杂性以确保一个线程不会尝试使用该单个连接,而另一个请求正在这样做......)
拥有一个容量为 1 的连接池通常是一个非常糟糕的主意 - 但至少如果你这样做了,你以后可以在不更改任何其他代码的情况下增加容量,当然。
(编辑:正如其他答案中所述,如果池中的连接以某种方式变得陈旧或损坏,则可以关闭并重新打开它们。)
原因是为了提高可扩展性、鲁棒性和速度。
如果您正在创建一个 Web 应用程序,可能会有许多并发的 HTTP 请求进入,每个请求都由不同的线程提供服务。
如果您只有一个与数据库的静态连接,则需要围绕该连接进行同步。您不能在多个线程之间共享连接,这意味着每个 HTTP 请求都必须等待其他人使用数据库。如果某个地方出现问题,您需要修复/重新连接该连接。
您可以在每个 HTTP 请求开始时打开一个连接 - 但是打开一个新的数据库连接可能会很昂贵,而且您无法控制拥有多少数据库连接。数据库可能会因连接过多而不堪重负。
连接池解决了这个问题,因为您有一个已经打开的连接池,可以分发给 HTTP 请求或需要执行数据库操作的应用程序的不同部分,并在数据库操作时返回到池中已经完成,准备再次被其他东西使用。
但是,只有 1 个连接的连接池很少有意义 - 但是连接池也会处理许多其他事情,例如关闭连接并在连接过时或处于不良状态时打开一个新连接,以及当在特定时间没有更多连接要分发时,它会负责同步。
如果您使用的连接池只有一个连接,则相当于拥有一个静态连接 - 就像您提到的那样,连接池没有任何优势。
连接池的优势在于当您使用多个连接(多线程)时 - 它可以节省您管理连接(打开/关闭连接、样板代码、智能资源处理等)的工作量。
仅将连接池用于一个连接有点像铺设一条仅由一辆车使用的 10 车道道路 - 大量开销(几乎)没有收益。
使用连接池不仅仅是共享连接:它是关于利用多年的经验来处理损坏的 JDBC 驱动程序以及连接可能变得不可用的所有奇怪方式。使用单个静态连接不仅是一个瓶颈,而且是一个非常脆弱的解决方案。它会导致您的应用程序定期中断,甚至重新启动应用程序也无法解决问题:您可能会遇到连接泄漏。