2012-02-10 104 views
0

目前我使用单独的DBConnectionManager类来处理连接池,但我也意识到这是错误的方式,因为每次doGet()时servlet都不会调用同一个池,被执行。针对Servlets的JDBC连接池

  1. 有人可以向我解释为什么会出现上述情况吗?
  2. JNDI是通过tomcat实现适当连接池的java servlets的方式吗?

我有2篇文章的链接,这是用servlet实现连接池的正确方法吗?

http://www.javaranch.com/journal/200601/JDBCConnectionPooling.html

http://onjava.com/onjava/2006/04/19/database-connection-pooling-with-tomcat.html

是否有可能保存数据库管理器对象的背景下,像这样:

mtdb = (MTDbManager) context.getAttribute("MTDBMANAGER"); 
if (mtdb == null) { 
      System.out 
        .println("MTDbManager is null, reinitialize MTDbManager");    

      initMTDB(config); 
      context.setAttribute("MTDBMANAGER", mtdb); 
     } 

然后我打电话mtdb.getInstance()的getConnection()和。它会一直引用这个对象。

谢谢。

回答

4

通常,最好的建议是将连接池留给应用程序服务器。只需使用JNDI查找数据源,然后让应用程序服务器处理其余部分。这使得您的应用程序可移植(不同的应用程序服务器具有不同的池化机制和设置),并且最有可能是最有效的。

+0

又一个问题,并做JNDI正确连接池?含义我将最大连接数设置为5,第6个请求进入,JNDI将尝试重新连接之前执行等待超时。 – Maurice 2012-02-10 09:10:54

+2

JNDI本身不会进行池化,您可以查找一个['javax.sql.DataSource'](http://docs.oracle.com/javase/6/docs/api/javax/sql/DataSource.html)对象为您提供您需要连接时调用的getConnection()方法。如果没有可用的连接,则对getConnection()的调用将被阻止。注:每次需要连接时都不必查找JNDI数据源,因此将引用缓存到数据源是非常常见的做法。希望有所帮助。 – beny23 2012-02-10 09:27:20