gpt4 book ai didi

java - 使用单例类、Tomcat、C3P0 在 Java Web 应用程序中管理池数据源

转载 作者:行者123 更新时间:2023-12-01 15:33:12 25 4
gpt4 key购买 nike

我有一个在 Blackboard 学习软件中运行的 Java Web 应用程序,该软件使用 Tomcat 5.5。该应用程序连接到外部数据库。

我无权在 Blackboard 服务器上声明数据源,因此我尝试将所有内容打包到 Web 应用程序中。尽管在使用后仔细关闭了所有结果集、语句和连接,但我的基于公共(public)资源的池方法出现了连接耗尽的问题。我现在正在切换到 C3P0 池方法,但我不确定我的一般方法是否正确。

我使用单例类来创建数据源,目的是最大限度地减少实现连接池的数据源的创建和销毁。下面的类(class)应该清楚地说明这一点。这是一个合理的方法,还是可能导致我之前出现连接不足的问题?

谢谢。

编辑。更新了问题以阐明单例方法的目的。我试图避免每次需要数据库连接时创建数据源。这似乎抵消了连接池的好处。

数据源类:

import java.beans.PropertyVetoException;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import com.mchange.v2.c3p0.*;

public class MyDataSource {

private static MyDataSource mds = new MyDataSource();
public static DataSource ds;

private MyDataSource() {
try {
ds = getDataSource();
} catch (NamingException e) {
e.printStackTrace();
}
}

public static MyDataSource getInstance(){
return mds;
}

public Connection getConnection() throws SQLException, NamingException {
Connection myConnect = ds.getConnection();
return myConnect;
}

private DataSource getDataSource() throws NamingException {

ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass( "com.mysql.jdbc.Driver" );
} catch (PropertyVetoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cpds.setJdbcUrl( "jdbc:mysql://195.195.xx.xx:3306/dbName" );
cpds.setUser("lemmy");
cpds.setPassword("xxx");
cpds.setMaxIdleTime(180);
cpds.setMaxPoolSize(100);
return cpds;
}
}

连接类别:

import java.sql.*;
import javax.sql.*;
import javax.naming.*;

public class DbConnection {

public Connection c;

public DbConnection() throws NamingException, SQLException {
c = getConnection();
}

public Connection getConnection() throws SQLException, NamingException {
Connection myConnect = MyDataSource.getInstance().getConnection();
return myConnect;
}

public void close(){
JDBCUtils.close(this.c);
}
}

关闭连接等

import java.sql.*;

public class JDBCUtils {

static public void close (ResultSet rs) {
try { if (rs!=null) rs.close(); } catch (Exception e) {}
}

// Works for PreparedStatement also since it extends Statement.
static public void close (Statement stmt) {
try { if (stmt!=null) stmt.close(); } catch (Exception e) {}
}

static public void close (java.sql.Connection conn) {
try { if (conn!=null) conn.close(); } catch (Exception e) {}
}

}

使用示例:

    String myQuery = null;
DbConnection myConnect = null;
Statement myStatement = null;
ResultSet rs = null;

try {
myConnect = new DbConnection();
myStatement = myConnect.c.createStatement();

// Do stuff here

}catch (SQLException e) {
out.println("SQL Error: "+e);
} finally {
JDBCUtils.close(rs);
JDBCUtils.close(myStatement);
myConnect.close();
}

最佳答案

您可能想查看JdbcTemplate来自Spring框架。您可以独立使用它,因为 Spring 声称提供了许多帮助器类。这简化了连接/语句/结果集嵌套问题。它还可以更简单地处理查询。

我知道出于学习目的,您可能不会使用 JdbcTemplate,但类设计很有趣。

关于池化,@duffymo 已经给出了答案。

关于java - 使用单例类、Tomcat、C3P0 在 Java Web 应用程序中管理池数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9310028/

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