Java 为什么使用连接池而不是静态连接变量?

Java 为什么使用连接池而不是静态连接变量?,java,tomcat,database-connection,Java,Tomcat,Database Connection,为什么我更喜欢使用连接池而不是Tomcat中静态类中的静态变量来保存数据库连接 在我看来,这相当于使用一个连接池,该连接池只能存储一个连接。因此,一个相关的问题是:为什么连接池的容量需要大于一个连接 提前感谢。使用池,您可以使用不同的连接拥有多个线程。是否确实要将web应用程序限制为一次只能处理一个与db相关的请求?:)(并增加了同步的复杂性,以确保一个线程在另一个请求使用该连接时不会尝试使用该连接…) 通常情况下,拥有一个容量为1的连接池是一个非常糟糕的主意,但至少如果您这样做了,那么您以后可

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

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


提前感谢。

使用池,您可以使用不同的连接拥有多个线程。是否确实要将web应用程序限制为一次只能处理一个与db相关的请求?:)(并增加了同步的复杂性,以确保一个线程在另一个请求使用该连接时不会尝试使用该连接…)

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


(编辑:如其他答案中所述,如果池中的连接以某种方式过时或损坏,则可以关闭或重新打开。)

如果您使用的连接池只有一个连接,则相当于有一个静态连接-如您所述,连接池在这方面没有优势

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


使用连接池只进行一次连接有点像铺设一条10车道的道路,只供一辆车使用-大量的高架道路(几乎)没有收获。

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

原因是为了提高可扩展性、健壮性和速度

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

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

您可以在每个HTTP请求开始时打开一个连接,但是打开一个新的数据库连接可能会很昂贵,并且您无法控制有多少数据库连接。数据库可能会因为连接太多而不知所措

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


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

除了Jon提到的,单个静态数据库连接将在一段时间内失效(例如,如果一个事务在上午9点命中,而另一个事务在晚上9点进入)如果尝试运行任何查询,则将不可用。使用静态连接设计,在这种情况下,只有重新启动应用程序服务器才是解决方案。