2012-09-21 50 views
1

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

回答

2

你应该阅读有关连接池:

C3PO,BoneCP,DBCP

这是可用的最好的和流行的连接池,我在我的生产项目使用BoneCP。

+0

我试过BoneCP,现在它工作的很好。谢谢 – NSF

2

我认为你需要考虑如果可能的话使用连接池。

这样你不需要担心创建连接/关闭开销。

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

查看此discussion了解连接池的工作原理。

1

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

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

怎么样使用一个单独的连接管理器的servlet来分享所有servlet之间的全球连接(即所有servlet使用相同的连接)

虽然JDBC规范并不阻止共享的连接通过多线程,这被认为是不好的做法,因为它可能是驱动程序实现相关的。因此,每个数据库会话一个连接会导致更便携和可维护的代码。

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

为了得到连接时,应用程序可以与交互或者:

  • DriverManager类与一种或多种驱动程序实现

OR

  • DataSource实现工作

使用DataSource对象是首选方法,因为它增强了应用程序的可移植性,它使代码维护更加容易,并且它使得应用程序透明地使用连接池和分布式事务处理成为可能。所有建立到数据源的连接的J2EE组件都使用一个 DataSource对象来获取连接。