无法在Java中重新打开MySQL连接

时间:2015-01-08 14:07:56

标签: java mysql

我在Java中遇到了一个烦人的错误。我正在连接MySQL数据库并在Eclipse中使用Tomcat。它的工作非常出色,但只是第一次。如果我重新加载页面或再次运行页面,我会得到com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许任何操作。

这是我的代码:

    Connection conn = null;
    String returnString = null;
    Response response = null;
    ResultSet rs = null;

    try {
        System.out.println("Trying to connect");
        conn = DbUtil.getConnection(); // Connect to the database
        System.out.println("Okay, connected");

        query = conn.prepareStatement("SELECT host_firstname FROM host"); //Crashes at this line!
        rs = query.executeQuery();

        ConvertToJson jsonConverter = new ConvertToJson();
        JSONArray jsonArray = new JSONArray();

        jsonArray = jsonConverter.convertToJsonArray(rs);


        returnString = jsonArray.toString();
        response = Response.ok(returnString).build();

    }
    catch (Exception e) {
        e.printStackTrace();
        System.out.println("hello!!!!");
    }
    finally {
        if (rs != null){
            rs.close();
        }
        if (query != null) {
            query.close();
        }
        if (conn != null) {
            conn.close();
        }
    }

    return response;

我已经在任何地方见过我已经用谷歌搜索我必须关闭结果集,准备好的声明和连接(按顺序)但是一旦我关闭了连接,我就可以&# 39;重新打开它。

这是我的DbUtil类:

    private static Connection connection = null;

    public static Connection getConnection() {

    if (connection != null) {
        return connection;
    }
    else {
        try {
            Properties prop = new Properties();
            InputStream inputStream = DbUtil.class.getClassLoader().getResourceAsStream("/db.properties");
            prop.load(inputStream);
            String driver = prop.getProperty("driver");
            String url = prop.getProperty("url");
            String user = prop.getProperty("user");
            String password = prop.getProperty("password");

            Class.forName(driver);

            connection = DriverManager.getConnection(url, user, password);
        }
        catch (IOException e) {
            e.printStackTrace();
        } 
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    return connection;
    }

知道是什么导致了这个问题吗?

由于 奥马尔:)

1 个答案:

答案 0 :(得分:2)

这个答案只是为了让您的代码正常运行。但最好的方法是配置连接池。你应该看看它。

你的条件是:

if (connection != null) {
        return connection; It's returning a closed connection
    }

尝试将其更改为:

if (connection != null && !connection.isClosed()) {
        return connection; 
    }