基本上,我使用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连接池时的正确方法吗?它现在似乎工作正常。
答案 0 :(得分:2)
TL; DR但有一件事让我抓狂:
注意:我已经评论了我们的一些池设置/参数,因为应用程序很快就用完了连接,原因我不知道。
原因可能是,连接没有正确地返回池中。由于我在代码中找不到对Connection.commit
的任何引用,我认为您的交易仍然是开放的,从未提交过。应用程序终止后,PostgreSQL将回滚任何这些连接,你的INSERT就不见了。
所以:
如果这没有帮助:减少并清理代码相当。这有两个目的:第一:执行此操作您可能会自己检测代码中的错误。第二:如果您有SSCCE示例,则可以发布此,有人可能会尝试在瞬间理解它。您当前的代码无法做到这一点。
答案 1 :(得分:0)
我得到了它的工作,但我不确定它是如何或为什么这样做。这行代码似乎是个问题:
myConnection.setAutoCommit(false);
它来自模型中的方法。在应该修改表中数据的方法上注释掉这一行似乎已经成功了。问题是,一些插入数据的方法似乎可以正常工作,而其他方法则没有。我不确定为什么。
除了文档之外,是否有一个简单的例子以简单的方式解释c3p0的实现?我一直在寻找一个但没有找到任何东西。
我会在您进一步调查此事后立即通知您。