Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function Postgres存储函数不使用c3p0插入_Function_Postgresql_Insert_C3p0 - Fatal编程技术网

Function Postgres存储函数不使用c3p0插入

Function Postgres存储函数不使用c3p0插入,function,postgresql,insert,c3p0,Function,Postgresql,Insert,C3p0,基本上,我使用AbstractModel类中定义的以下方法连接和断开与数据库的连接: // close connection public void closeConnection(){ try{ // if (!rs.isClosed()){ // rs.close(); // } cstmt.close(); SingletonConnection.i

基本上,我使用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;但是有一件事吸引了我:

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

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

因此:

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

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

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

myConnection.setAutoCommit(false);
它来自模型中的方法。将这一行注释掉,说明应该修改表中数据的方法似乎已经做到了这一点。问题是,一些插入数据的方法似乎可以很好地使用它,而其他方法则不行。我不知道为什么

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


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

请再次检查我的答案。将autocommit设置为“false”是另一个指示,表示您没有
提交
回滚
您的事务。禁用自动提交只需将每个语句包装到自己的事务中。正确!因此,建议始终将自动提交设置为false,然后提交吗?这与getConnection()和destroy()方法一起是否足以通过c3p0池管理连接?我认为所有数据库查询都应该遵循这种模式,而不仅仅是修改数据库的查询。。。我走对了吗?