2012-07-06 22 views
0

基本上,我連接和斷開與在AbstractModel類中定義這些方法的數據庫:Postgres的存儲功能不能與C3P0插入

// 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連接池時這是否正確?它現在似乎工作正常。

回答

2

TL; DR但有一點抓住了我:

注:我評論過我們的池設置/參數的一些,因爲應用程序趕緊跑出來的連接,是有原因的,我不知道。

原因可能是連接沒有正確返回池。由於我在代碼中找不到任何對Connection.commit的引用,我認爲您的交易仍處於開放狀態,從未提交過。應用程序終止後,PostgreSQL將回滾所有這些連接,並且INSERT消失。

所以:

  • 仔細檢查,該TXNs確實承諾。
  • 仔細檢查連接是否正確返回池中。

如果這沒有幫助:修剪和清理你的代碼相當。該服務器有兩個目的:第一:在執行此操作時可能會自己檢測到代碼中的錯誤。第二:如果你有一個SSCCE的例子,你可以發帖這個,有人可能會試圖在眨眼間理解它。這是不可能與您的當前代碼。

+0

請閱讀我發佈的第二個答案。謝謝。 – greatkalu 2012-07-07 07:12:53

0

我得到它的工作,但我不完全確定如何或爲什麼它。這行代碼似乎是問題:

myConnection.setAutoCommit(false); 

它來自模型中的方法。將這一行註釋到應該修改表中數據的方法似乎已經成功了。問題是,一些插入數據的方法似乎可以正常工作,而另一些則不行。我不知道爲什麼。

是否有一個簡單的例子,除了文檔,以簡單的方式解釋c3p0的實現?我一直在尋找一個,但沒有找到任何東西。

我會盡快進一步調查此事。

+0

請再次檢查我的答案。將自動提交設置爲「false」是另一種表示,即您不在某處「提交」或「回滾」您的交易。禁用自動提交只是將每個語句包裝到自己的事務中。 – 2012-07-07 07:25:27

+0

正確!那麼建議始終將自動提交設置爲false,然後進行提交?這是否與getConnection()和destroy()方法一起足以管理通過c3p0池的連接?我想我應該遵循這種模式來處理所有的數據庫查詢,而不僅僅是那些修改數據庫的數據庫......我在正確的軌道上嗎? – greatkalu 2012-07-07 07:36:10