Postgres存储函数未使用c3p0插入



基本上,我使用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文档说,连接终止时,ResultSet默认关闭。

当然,这两个方法在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连接池时,这是正确的方法吗?目前看来运行良好。

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

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

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

因此:

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

如果这没有帮助:大幅削减并清理代码。这有两个目的:第一:在执行此操作时,您可能会自己检测代码中的错误。第二:如果你有一个SSCCE的例子,你可以发布这个,有人可能会试图在眨眼之间理解它。这在您当前的代码中是不可能的。

我让它工作了,但不确定它是如何工作的,也不确定为什么工作。这行代码似乎就是问题所在:

myConnection.setAutoCommit(false);

它来自模型中的一个方法。在本应修改表中数据的方法上注释这一行似乎已经成功了。问题是,一些插入数据的方法似乎可以很好地使用它,而其他方法则不然。我不知道为什么。

除了文档之外,是否还有一个简单的例子可以简单地解释c3p0的实现?我一直在找,但什么也没找到。

我会在进一步调查此事后尽快向你通报最新情况。

最新更新