我在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();
正在执行。
那么,这可能是什么问题。我的方法是否正确?
答案 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连接器。