Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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
Java 使用连接池后仍然存在无法对关闭的ResultSet错误进行操作的问题_Java_Mysql_Multithreading_Jdbc_C3p0 - Fatal编程技术网

Java 使用连接池后仍然存在无法对关闭的ResultSet错误进行操作的问题

Java 使用连接池后仍然存在无法对关闭的ResultSet错误进行操作的问题,java,mysql,multithreading,jdbc,c3p0,Java,Mysql,Multithreading,Jdbc,C3p0,我有很多线程访问MYSQL数据库,起初我没有使用连接池,所以我有一个错误,你不能在一个关闭的ResultSet上操作 我在谷歌上搜索,发现我应该使用连接池,所以我尝试了C3P0API来实现,但我仍然有同样的问题,没有任何改变。 所以我应该同步getAllcountries方法还是有其他更好的解决方案 public class DataSource { private static DataSource datasource; private ComboPooledDataSource cpds

我有很多线程访问MYSQL数据库,起初我没有使用连接池,所以我有一个错误,你不能在一个关闭的ResultSet上操作

我在谷歌上搜索,发现我应该使用连接池,所以我尝试了C3P0API来实现,但我仍然有同样的问题,没有任何改变。 所以我应该同步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;

}
我看到一个名为getConnection的方法,但看不到您在哪里调用它。相反,我看到您的getAllCountries方法使用了一个静态数据源对象,该对象是这样创建的:

new DataSource();
我在谷歌上搜索,发现我应该使用连接池,所以我尝试了C3P0API来实现,但我仍然有同样的问题,没有任何改变

是的


看起来您只是将找到的代码剪切并粘贴到应用程序中,而没有真正考虑它。明显地您需要了解代码在做什么,并找出如何在应用程序中使用它。

除了@stephen-c的观察, 基本上有两个选项:同步getAllCountries方法,或者使数据库连接成为该方法的本地连接,而不是将其作为类成员


正如您现在看到的,“connection”是一个类成员,可用于所有线程上的所有getAllCountries调用,因此该连接可能被第二个线程覆盖。将其移动到方法中的一个变量,然后该方法的每次调用都将有自己的连接。

我使用getInstance方法是因为我只需要一个DataSource实例。关闭的不是DataSource,而是从DataSource获得的连接被替换。