全局MySQL连接或每个请求的一个连接?

时间:2012-09-21 18:41:35

标签: java mysql java-ee servlets

我有几个servlet在Tomcat服务器上工作。现在我让他们为每个请求创建数据库连接,并在使用后关闭它们。这可能会导致建立/关闭连接的巨大开销。如何使用单个连接管理器servlet在所有servlet之间共享全局连接(即所有servlet使用相同的连接)。这是一个好习惯还是并发操作可能存在问题?

3 个答案:

答案 0 :(得分:2)

我认为如果可能,您需要考虑使用连接池。

这样您就不必担心创建连接/关闭开销。

当你想要连接时,可以从池中获取它,当你完成连接时,调用close(),它返回到池的连接。

请参阅此discussion以了解连接池的工作原理。

答案 1 :(得分:2)

您应该阅读有关连接池的信息:

C3PO,BoneCP,DBCP

这是最好的和最受欢迎的连接池,我在我的生产项目中使用BoneCP。

答案 2 :(得分:1)

  

这可能会导致建立/关闭连接的巨大开销。

你说得对,连接建立和关闭它如果太频繁就证明是昂贵的操作。

  

如何使用单个连接管理器servlet在所有servlet之间共享全局连接(即所有servlet使用相同的连接)

虽然JDBC规范不会阻止连接被多个线程共享,但这被认为是一种不好的做法,因为它可能依赖于驱动程序实现。因此,每个数据库会话一个连接会产生更多可移植和可维护的代码。

JDBC规范建议使用DataSource个对象来池化连接,以避免上面提到的开销。

  

要获得连接,应用程序可以与以下任一项进行交互:

     
      
  • 使用一个或多个驱动程序实现的DriverManager类
  •   
     

OR

     
      
  • 数据源实施
  •   
     

使用DataSource对象是首选方法,因为它增强了应用程序   可移植性,它使代码维护更容易,并使它成为可能   应用程序透明地使用连接池和分布式   交易。建立与数据源的连接的所有J2EE组件都使用a   用于获取连接的DataSource对象。