2016-02-24 55 views
2

我正在使用帶有java的sqlite驅動程序。正如你所知道的一般順序是在關閉後獲取結果

Create Statement 
Execute Statement 
Get ResultSet 

Process Results 

close ResultSet 
close statement 

的問題是,所有的上面是一個方法,我想調用者得到的結果並對其進行處理。但是,由於結果在方法結束時返回,那麼語句和結果集將關閉。

我能想到的唯一工作就是讓RS和Stmnt成爲一個類變量,並讓調用者關閉它們,但如果它是多線程環境,則會造成問題。

什麼是推薦的方式來實現我想要的?有了這個主叫

public void query(String query, Consumer<ResultSet> consumer) { 
    // Create Statement 
    try (Statement stmt = ...) { 
      // Execute Statement 
      ResultSet rs = ... 
      consumer.accept(rs); 
    } 
} 

可以從結果中提取的數據集和你: 感謝

public ResultSet runQuery(String sql) { 

     try { 

      st = conn.createStatement(); 
      rs = st.executeQuery(sql); 

      rs.close(); 
      st.close() 

     } catch (SQLException ex) { 
      Logger.getLogger(DatabaseHelper.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     return rs 
    } 

從另一個文件

private void displayListOfEmployee(){ 
     String sql = "Select * from employee"; 
     ResultSet rs = DB.getInstance().runQuery(sql); 
     while(rs.next()!=null){ 
      System.out.println(.....); // display value of column 
     } 
} 
+0

你應該問問自己,你是否真的想要這樣包裝JDBC,因爲它違背瞭如何使用JDBC(你似乎正在使用'conn','st'和'rs'這是一個意外的字段等待在併發使用下發生)。 –

回答

2

您可以將Consumer<ResultSet>參數添加到方法可以保證資源關閉。

的變化是使用一個Function參數,並計算出一個返回值:

public <T> T query(String query, Function<ResultSet,T> function) { 
    // Create Statement 
    try (Statement stmt = ...) { 
      // Execute Statement 
      ResultSet rs = ... 
      return function.apply(rs); 
    } 
} 

由於Consumer.acceptFunction.apply不允許扔你可能要定義類似的功能接口,允許檢查的異常檢查異常和在該方法中使用它。

UPDATE:

你的例子將轉化爲:

private void displayListOfEmployee(){ 
    String sql = "Select * from employee"; 
    DB.getInstance().runQuery(sql, rs -> { 
     while (rs.next()) 
      System.out.println(.....); // display value of column 
    }); 
} 
+0

您能否解釋消費者的方法?我不確定你的意思。如果我的問題是愚蠢的,我很抱歉 – Snake

+0

@Snake在你的問題上添加一個簡短的例子,你打算如何使用你的功能,我將它翻譯成消費者版本 – wero

+0

我用例子編輯了這個問題 – Snake

1

一種可能的解決辦法是使用一個CachedRowSet,其由ResultSet填充,但可以活得比相關Statement/ConnectionResultSet物通過製備。

注意這會將整個ResultSet讀入內存。