0

基本上,我使用 AbstractModel 类中定义的这些方法连接和断开数据库:

    // close connection
    public void closeConnection(){
        try{
//          if (!rs.isClosed()){
//              rs.close();
//          }
            cstmt.close();
            SingletonConnection.instance();
            DatabaseConnection.closeConnection();
        } catch (SQLException e){
            System.out.println("SQL Exception: ");
            e.printStackTrace();
        }

    }

    // establish connection
    public void createConnection(){
        try {
            SingletonConnection.instance();
            myConnection = DatabaseConnection.establishConnection();
        } catch (SQLException e){
            e.printStackTrace();
        }
    }

在尝试关闭 ResultSet rs 时,我遇到了 NullPointerException 的另一个问题,但是 c3p0 文档说,当连接终止时,ResultSets 默认关闭。

这两个方法当然是调用 DatabaseConnection 类中的这两个方法:

// create connection
public static Connection establishConnection() throws SQLException {
    return datasource.getConnection();
}

// close connection
public static void closeConnection() throws SQLException{
    DataSources.destroy(datasource);
}

所以我基本上使用 getConnection() 和 destroy() 方法来打开和关闭数据源上的连接。这是处理 c3p0 连接池时的正确方法吗?它现在似乎工作正常。

4

2 回答 2

2

TL; DR 但有一件事抓住了我:

注意:我已经评论了我们的一些池设置/参数,因为应用程序很快就失去了连接,原因我不知道。

原因可能是连接没有正确返回到池中。而且由于我在您的代码中找不到对 a 的任何引用,Connection.commit我认为您的事务仍然是开放的并且从未提交过。应用程序终止后,PostgreSQL 将回滚任何这些连接,并且您的 INSERT 将消失。

所以:

  • 仔细检查,TXN 确实已提交。
  • 仔细检查,连接是否正确返回到池中。

如果这没有帮助:大幅削减和清理您的代码。这有两个目的:第一:这样做时,可能会自己检测代码中的错误。第二:如果你有一个SSCCE的例子,你可以发布这个,有人可能会试图在一瞬间理解它。您当前的代码无法做到这一点。

于 2012-07-06T14:43:20.707 回答
0

我让它工作,但不完全确定它是如何或为什么这样做的。这行代码似乎是问题所在:

myConnection.setAutoCommit(false);

它来自模型中的方法。在应该修改表中数据的方法上注释掉这一行似乎已经成功了。问题是,一些插入数据的方法似乎可以正常工作,而其他方法则不能。我不确定为什么。

除了文档之外,是否有一个简单的示例以简单的方式解释 c3p0 的实现?我一直在寻找一个,但没有找到任何东西。

一旦进一步调查此事,我会及时通知您。

于 2012-07-07T07:05:32.420 回答