gpt4 book ai didi

java - 带有netbeans的jsp tomcat中的c3p0连接池

转载 作者:行者123 更新时间:2023-11-30 07:19:16 26 4
gpt4 key购买 nike

我正在 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: 无法从底层数据库获取连接!

为什么我得到这个......?

关于进一步的试错法....我发现代码下面的语句cpds = new ComboPooledDataSource(); 正在执行。

那么,这里可能是什么问题。我的做法正确吗?

最佳答案

这不是一个好方法。每次客户端访问您的页面时,都会执行 JSP 的 <% ... %> 中的内容。每个 Web 应用程序应该只创建一次连接池,而不是每个用户请求一次!

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

如果这看起来工作量太大,只需将您的 makeConnectionPool() 更改为私有(private)方法并仅从静态初始化程序 block 中调用它。摆脱 <% MCE_Server.makeConnectionPool(); %> 完全。然后 makeConnectionPool() 将仅在加载 MCE_Server 类时调用一次。但是由于您永远不会破坏池,如果您卸载并热重新部署您的应用程序(即您在不退出 Servlet 容器的 JVM 的情况下修改并重新加载 war 文件),您会发现线程和其他资源的泄漏。

关于java - 带有netbeans的jsp tomcat中的c3p0连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com