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