2

为什么我应该更喜欢使用连接池而不是 Tomcat 中静态类中的静态变量来保存数据库连接?

在我看来,这相当于使用只能存储一个连接的连接池。所以,一个相关的问题是:为什么一个连接池的容量需要大于一个连接?

提前致谢。

4

4 回答 4

5

使用池,您可以有多个线程使用不同的连接。您真的想将您的 Web 应用程序限制为一次处理一个与数据库相关的请求吗?:) (并添加同步的复杂性以确保一个线程不会尝试使用该单个连接,而另一个请求正在这样做......)

拥有一个容量为 1 的连接池通常是一个非常糟糕的主意 - 但至少如果你这样做了,你以后可以在不更改任何其他代码的情况下增加容量,当然。

(编辑:正如其他答案中所述,如果池中的连接以某种方式变得陈旧或损坏,则可以关闭并重新打开它们。)

于 2013-08-13T19:31:39.390 回答
4

原因是为了提高可扩展性、鲁棒性和速度。

如果您正在创建一个 Web 应用程序,可能会有许多并发的 HTTP 请求进入,每个请求都由不同的线程提供服务。

如果您只有一个与数据库的静态连接,则需要围绕该连接进行同步。您不能在多个线程之间共享连接,这意味着每个 HTTP 请求都必须等待其他人使用数据库。如果某个地方出现问题,您需要修复/重新连接该连接。

您可以在每个 HTTP 请求开始时打开一个连接 - 但是打开一个新的数据库连接可能会很昂贵,而且您无法控制拥有多少数据库连接。数据库可能会因连接过多而不堪重负。

连接池解决了这个问题,因为您有一个已经打开的连接池,可以分发给 HTTP 请求或需要执行数据库操作的应用程序的不同部分,并在数据库操作时返回到池中已经完成,准备再次被其他东西使用。

但是,只有 1 个连接的连接池很少有意义 - 但是连接池也会处理许多其他事情,例如关闭连接并在连接过时或处于不良状态时打开一个新连接,以及当在特定时间没有更多连接要分发时,它会负责同步。

于 2013-08-13T19:40:21.440 回答
1

如果您使用的连接池只有一个连接,则相当于拥有一个静态连接 - 就像您提到的那样,连接池没有任何优势。

连接池的优势在于当您使用多个连接(多线程)时 - 它可以节省您管理连接(打开/关闭连接、样板代码、智能资源处理等)的工作量。

仅将连接池用于一个连接有点像铺设一条仅由一辆车使用的 10 车道道路 - 大量开销(几乎)没有收益。

于 2013-08-13T19:32:02.137 回答
1

使用连接池不仅仅是共享连接:它是关于利用多年的经验来处理损坏的 JDBC 驱动程序以及连接可能变得不可用的所有奇怪方式。使用单个静态连接不仅是一个瓶颈,而且是一个非常脆弱的解决方案。它会导致您的应用程序定期中断,甚至重新启动应用程序也无法解决问题:您可能会遇到连接泄漏。

于 2013-08-13T19:38:49.037 回答