2015-01-08 2 views
0

У меня есть раздражающая ошибка на Java. Я подключаюсь к базе данных MySQL и использую Tomcat в Eclipse. Он работает блестяще, но только в первый раз. Если я снова загружу страницу или запустил страницу, я получаю com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: после закрытия соединения никаких действий не разрешено.Невозможно повторно открыть соединение MySQL в Java

Это мой код:

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; 

Я видел везде я Гугл, что я должен закрыть набор результатов, подготовленное заявление, и соединение (в таком порядке), но как только я закрыл соединение, я не могу его снова открыть.

Это мой 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; 
    } 

Любая идея, что является причиной этой проблемы?

Благодаря Омар :)

+0

http://stackoverflow.com/questions/7565143/com-mysql-jdbc-exceptions-jdbc4-mysqlnontransientconnectionexception- no-operati – suiterdev

+0

Похоже, вам нужно смотреть на уровень сеанса, а не на уровень соединения. Ваш код не выбрасывается, он вызывается MySQL из драйвера JDBC. – suiterdev

ответ

2

Этот ответ только, чтобы ваш код работает. Но лучший способ - настроить пул соединений. Вы должны смотреть на это.

ваше состояние:

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

Попробуйте изменить его:

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

Я не могу вернуть соединение, так как он возвращает метод returnAllHosts –

+1

@OmarEbrahim Код здесь находится в вашем методе getConnection(). – nos

+0

Спасибо, что сработало !! :) –

Смежные вопросы