jsp tomcat中的c3p0连接池与netbeans

时间:2013-02-06 10:07:49

标签: java jsp web connection-pooling c3p0

我在jsp中执行连接池操作。 我在名为 MCE_Server.java 的特定类中创建了一个静态函数,并包含以下内容

 public static void makeConnectionPool()
 {
    try
    {
        cpds = new ComboPooledDataSource();
        cpds.setDriverClass("com.mysql.jdbc.Driver");
        cpds.setJdbcUrl("jdbc:mysql://localhost:3306/mce_db");
        cpds.setUser("root");
        cpds.setPassword("xxxxxx");
        cpds.setMaxPoolSize(100);
        cpds.setMinPoolSize(10);
        cpds.setAcquireIncrement(20);
    } 
    catch (PropertyVetoException ex) 
    {

        Logger.getLogger(MCE_Server.class.getName()).log(Level.SEVERE, null, ex);
    }

 }

从jsp页面调用以下静态函数

http://................/dbActivatePage.jsp

我已经包含了这个功能

      <%@page import="xxxxx.MCE_Server"%>
      <html>
      .
      .
      .
      <body>
      <%
              MCE_Server.makeConnectionPool();
      %>
      .
      .
      .
      </body>
      </html>

我计划按照 MCE_Server.java 中包含的静态函数获取所需的连接,如下所示:

       public static Connection getConnectionfromPool() throws SQLException
       {
             return cpds.getConnection();
       }

即每当我需要连接时。我将包含MCE_Server.getConnectionfromPool()

现在我遇到的问题是我收到错误

java.sql.SQLException: Connections could not be acquired from the underlying database!

为什么我要这个...... ??

On进一步的试错方法....我发现代码下方的陈述 cpds = new ComboPooledDataSource();正在执行。

那么,这可能是什么问题。我的方法是否正确?

2 个答案:

答案 0 :(得分:3)

这不是一个好方法。里面的东西&lt;%...%&gt;每次客户端访问您的页面时都会执行JSP。每个Web应用程序只应创建一次连接池,而不是每个用户请求创建一次!

我最喜欢在Web应用程序中设置连接池的方法是设置一个ServletContextListener,它在contextInitialized(ServletContextEvent sce)中创建池,并将它绑定到应用程序范围中的名称(即它设置了一个ServletContext属性)。该池应该在ServletContextListener的contextDestroyed方法中关闭()。

如果这似乎太多了,只需将makeConnectionPool()更改为私有方法,并仅从静态初始化程序块中调用它。摆脱&lt;%MCE_Server.makeConnectionPool(); %GT;完全。然后在加载MCE_Server类时,只调用一次makeConnectionPool()。但是由于你永远不会破坏池,如果你卸载并热重新部署你的应用程序,你会发现线程和其他资源的泄漏(即你修改并重新加载war文件而不退出Servlet容器的JVM)。

答案 1 :(得分:1)

好好看看你出现的错误。

java.sql.SQLException: Connections could not be acquired from the underlying database!

看起来你的c3p0配置是正确的,尽管我同意Waldman使用ServletContextListener的想法。在你的情况下,我坚信问题必须与mysql类路径有关。请检查您是否正确包含了mysql连接器。