2014-10-05 45 views
0

我有很多線程訪問MYSQL數據庫,起初我沒有使用連接池,所以我有這個錯誤「你不能操作一個關閉ResultSet「仍然有你使用連接池後無法操作關閉ResultSet錯誤

我在Google上搜索並發現我應該使用連接池,所以我嘗試使用c3p0 API來實現,但我仍然遇到同樣的問題並且沒有任何更改。 所以我應該同步getAllcountries方法或有另一個更好的解決方案。

public class DataSource { 

private static DataSource datasource; 
private ComboPooledDataSource cpds ; 

private DataSource() throws IOException, SQLException, PropertyVetoException { 
    cpds = new ComboPooledDataSource(); 
    cpds.setDriverClass("com.mysql.jdbc.Driver"); //loads the jdbc driver 
    cpds.setJdbcUrl("jdbc:mysql://localhost/question_game"); 
    cpds.setUser("root"); 
    cpds.setPassword(""); 
    cpds.setMaxPoolSize(500); 
    } 

public static DataSource getInstance() throws IOException, SQLException, PropertyVetoException { 
    if (datasource == null) { 
     datasource = new DataSource(); 
     return datasource; 
    } else { 
     return datasource; 
    } 
} 

public Connection getConnection() throws SQLException { 
    return this.cpds.getConnection(); 
} 


public List<Country> getAllCountries() { 
    String query = "SELECT * FROM country order by name "; 
    List<Country> list = new ArrayList<Country>(); 
    Country country = null; 
    ResultSet rs = null; 
    try { 
     try { 
      connection = DataSource.getInstance().getConnection(); 
      } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (PropertyVetoException e) { 
      e.printStackTrace(); 
     } 
     statement = connection.createStatement(); 
     rs = statement.executeQuery(query); 
     while (rs.next()) { 
       //getting countries 
     } 
    } catch (SQLException ex) { 
     ex.printStackTrace(); 
    } finally { 
     //DbUtil used to check if null 
     DbUtil.close(rs); 
     DbUtil.close(statement); 
     DbUtil.close(connection); 
    } 
    return list; 

} 

回答

2

除了@ stephen-c的觀察, 你基本上有兩種選擇:或者同步getAllCountries方法,或者使數據庫連接局部於該方法而不是作爲類成員。

現在,'connection'是一個類成員(可用於所有線程的所有getAllCountries()調用),所以連接可能被第二個線程覆蓋。將它移到方法中的一個變量中,然後每個方法的調用都會有自己的連接。

0

我看到一個名爲getConnection的方法,我沒有看到你在哪裏調用它。相反,我看到使用被這樣創造了一個靜態DataSource對象的getAllCountries方法:

new DataSource(); 

我搜索谷歌和發現我應該使用連接池,所以我嘗試C3P0 API實施,但我仍然有同樣的問題,並沒有什麼變化

啊......

它看起來像你剛纔立方米將您發現的代碼粘貼到您的應用程序中,而無需真正考慮它。很明顯...你需要明白什麼代碼在做和想出如何在你的應用中使用它

+0

我正在使用getInstance()方法,因爲我只想要一個DataSource實例。 – Marah 2014-10-05 02:17:01

+0

它不是正在關閉的數據源,而是從數據源獲得的連接正在被替換。 – 2014-10-05 07:53:15

相關問題