【问题标题】:JDBC Connection Pooling for ServletsServlet 的 JDBC 连接池
【发布时间】:2012-03-02 18:14:21
【问题描述】:

目前我正在使用单独的 DBConnectionManager 类来处理我的连接池,但我也意识到这是错误的做法,因为每次执行 doGet() 时 servlet 都没有调用同一个池。

  1. 有人可以向我解释为什么会发生上述情况吗?
  2. JNDI 是否适合使用带有 tomcat 的 java servlet 以实现正确的连接池?

我有 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(),它会一直引用这个对象。

谢谢。

【问题讨论】:

    标签: java servlets jdbc connection-pooling


    【解决方案1】:

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

    【讨论】:

    • 还有一个问题,JNDI 是否进行了正确的连接池?这意味着我将最大连接数设置为 5,第 6 个请求进来,JNDI 将在尝试再次获得连接之前等待超时。
    • JNDI 本身不进行池化,您可以查找 javax.sql.DataSource 对象,该对象为您提供 getConnection() 方法,当您需要连接时将调用该方法。如果没有可用的连接,则对getConnection() 的调用将被阻塞。注:您也不必每次需要连接时都查找 JNDI 数据源,缓存对数据源的引用是很常见的做法。希望对您有所帮助。
    【解决方案2】:

    看看并使用 C3P0,而不是滚动您自己的解决方案:http://sourceforge.net/projects/c3p0/

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 2014-07-25
      相关资源
      最近更新 更多