2

我对 c3p0 连接池有这个问题,我是 c3p0 的新手。

我的桌面程序将 java 与 mssql 2008r2 一起使用,我使用的 jdbc 驱动程序是 jtds,对于连接池,我使用 c3p0

当程序运行一段时间时我遇到了一些问题,程序被卡住了,因为它正在等待从池中获取连接。

好像是连接池满了,导致sql语句无法执行。每次我完成执行 sql 语句时,我已经关闭了连接。

有人对 c3p0 有同样的问题吗?

注意:我使用 ComboPooledDataSource,当我想获得一些连接时,我使用 ComboPooledDataSource,getConnection() 方法。这个来自 ComboPooledDataSource 的 getConnection() 方法,它是否获得空闲连接?

如何连接到空闲?因为每次获得连接时我都已经关闭了连接。

谢谢。

这是我使用的代码:通常我有 2 个类:1.for 数据库连接(获取连接和池) 2.for 数据库事务(执行查询语句)

public final class DBConnection {
private static DatabaseProperties dbProp;
private static ComboPooledDataSource ds;

private DBConnection(){}

private static void create(){
    DatabaseProperties dp = getDatabaseProperties();
    boolean success = true;

    do{
        try{
            ds = new ComboPooledDataSource();
            ds.setDriverClass("net.sourceforge.jtds.jdbc.Driver");
            ds.setJdbcUrl("jdbc:jtds:sqlserver://"+ dp.getIpaddr()+":"+dp.getPort()+ "/"+dp.getDbname(););
            ds.setUser(dp.getUsername());
            ds.setPassword(dp.getPassword());

            ds.setMinPoolSize(3);
            ds.setAcquireIncrement(1);
            ds.setMaxPoolSize(20);
        } catch (Exception ex) {
            LoggerController.log(Level.SEVERE,"Database error on creating connection",ex,LoggerController.DATABASE);
            success = false;
        }
    }while(!success);
}
public static ComboPooledDataSource getDataSource(){
    if(ds == null)create();

    return ds;
}

public static Connection getConnection(){
    Connection con = null;
    try {
        con = DBConnection.getDataSource().getConnection();
    } catch (SQLException ex) {
        LoggerController.log(Level.SEVERE,"Database error on getting connection",ex,LoggerController.DATABASE);
    }

    return con;
}

public static void close(){
    ds.close();
}

}

public class DBTrans {
private DBTrans(){}

public static DataTable executeQuery(String query) throws SQLException{
    DataTable dt = null;
    Connection con = null;
    try {
        con = DBConnection.getConnection();
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(query);
        dt = new DataTable(rs);
    } catch (SQLException ex) {
        throw new SQLException("QUERY= ["+query+"]\n"+ex.getMessage());
    }
    finally{
        if(con!=null){
            con.close();
        }
    }
    return dt;
}

public static int executeUpdate(String query) throws SQLException{
    int sql = 0;
    Connection con = null;
    try {
        con = DBConnection.getConnection();
        Statement stmt = con.createStatement();
        sql = stmt.executeUpdate(query);
        con.close();
    } catch (SQLException ex) {
        throw new SQLException("QUERY=["+query+"]\n"+ex.getMessage());
    }
    finally{
        if(con!=null){
            con.close();
        }
    }
    return sql;
}

}

4

1 回答 1

2

鉴于您显示的代码,最终您的应用程序可能会泄漏连接,从而使连接池耗尽(即,所有连接都不可逆转地检出)。您需要始终如一地使用强大的资源清理习惯。参见例如

http://old.nabble.com/Re:-My-connections-are-all-idle...-p27691635.html

一旦你修改你的代码以可靠地连接连接,如果你仍然看到问题,c3p0 有设置来查找和调试未返回的连接。您可以临时设置 unreturnedConnectionTimeout 并使用 debugUnreturnedConnectionStackTraces 来追踪泄漏。看

http://www.mchange.com/projects/c3p0/index.html#unreturnedConnectionTimeout

http://www.mchange.com/projects/c3p0/index.html#debugUnreturnedConnectionStackTraces

但首先,只需修复您的资源清理代码,看看问题是否消失。捕获 debugUnreturnedConnectionStackTraces 是性能拖累;顾名思义,它应该只是临时使用,用于调试。

我希望这有帮助!

于 2012-10-09T14:01:38.910 回答