2012-06-06 1 views
0

У меня есть сервисная архитектура REST, которая маршрутизирует запросы к классу с помощью этого метода. Этот метод открывает соединение с базой данных, запрашивает значения и, наконец, закрывает соединение с базой данных. После этого JSON создается из значений базы данных и возвращается через REST.Это безопасный способ подключения и отключения к mysql через jdbc?

public HashMap<Integer, Artifact> queryDBValues(String userNo) { 

    DAO dao = getDAO(DB1); 
    Connection connection = dao.instantiateConnection(); 

    ResultSet resultSet = null; 
    Statement statement = null; 

    HashMap<Integer, Artifact> artifacts = new HashMap<Integer, Artifact>(); 

    try { 
     statement = connection.createStatement(); 

     String stmntStr = "select * from myTable"; 

     resultSet = statement.executeQuery(stmntStr); 
     int i = 0; 
     while (resultSet.next()) { 

      Artifact artifact = new Artifact(); 
      artifact.setArtifactId(resultSet.getString("id")); 

      artifacts.put(i, artifact); 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     dao.closeSQLComponents(resultSet, connection); 
    } 

    return artifacts; 
} 

DAO - это абстрактный класс, который создается на основе значения, полученного в getDAO(). Я делаю это, потому что я подключаюсь к нескольким базам данных, и я подключаюсь и отключается от классов, расширяющих этот класс.

я получил ошибку из базы данных MySQL после подключения, которая гласит: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Источник данных отвергнуты установление соединения, сообщение с сервера: «Слишком много соединений»

наконец, соединения закрываются. В долгосрочной перспективе я планирую использовать пул соединений c3p0. Достаточно ли этого достаточно для повторного использования соединений в настоящее время с низким уровнем использования?

ответ

3

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

Еще одна странная вещь заключается в том, что DAO должен быть объектом, который инкапсулирует код доступа к данным. Это DAO, который должен содержать логику JDBC.

Сказали, почему бы вам не сделать правильные вещи сейчас, вместо того, чтобы ждать 100 000 строк кода для рефакторинга? Используйте пул соединений как можно скорее. Это имело бы два огромных преимущества:

  • открытие соединения очень дорого. Вы бы сэкономили много времени, избегая постоянного открытия и закрытия соединений.
  • пул также позволяет ограничить количество подключений до разумного максимума в случае максимального использования. Это позволяет избежать открытия слишком большого количества подключений и доведения базы данных до колен.
+0

Рад, что я просмотрел ответы перед тем, как набирать текст, вы взяли слова изо рта. Пожалуйста, закройте элементы в том же блоке кода, в котором вы их открываете. Скрытие закрытия в методе DAO является нечетным, наличие DAO и не открытие их внутри DAO _even odder_. Выберите использовать DAO или нет, но не используйте его наполовину. Я голосую за то, что я открываю дверь в DAO. –