JDBC Лучшая практика - PullRequest
6 голосов
/ 29 мая 2011

Я собираюсь создать класс, который будет работать с базой данных. Класс будет иметь функции addRecord (), getAllRecords (), и тому подобное. Я ищу хороший подход к дизайну класса. Должен ли я: 1) создать новое соединение для каждой функции. Как это:

void readRecords(){
    try {
        Connection con = DriverManager.getConnection (connectionURL);

        Statement stmt = con.createStatement();

        ResultSet rs = stmd.executeQuery("select moviename, releasedate from movies");

        while (rs.next())
            System.out.println("Name= " + rs.getString("moviename") + " Date= " + rs.getString("releasedate");
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        con.close();
    }
}

или

2) лучше иметь одно соединение как переменную memeber

class MyClass{
     private  Connection con;

     public MyClass(){
          con = DriverManager.getConnection (connectionURL);
     }
}

и создайте только оператор для каждой функции.

3) или что-то еще ...

Ответы [ 3 ]

11 голосов
/ 29 мая 2011

Оба подхода плохие.Первый не позволит вам реализовать правильное управление транзакциями, так как вы не можете вызвать несколько методов внутри одной транзакции.Последний требует ненужного создания нескольких объектов.

Наилучшим подходом было бы введение понятия текущего соединения, которое можно получить из некоторого транзакционного контекста.По сути, это должно выглядеть так:

beginTransaction(...); // Opens connection and starts transaction

readRecords(...); // Uses the current connection
addRecord(...);
...

commitTransaction(...); // Commits transaction and closes connection

Самая простая, но не очень элегантная реализация - открыть Connection внутри вызывающего метода (который определяет границы транзакции) и передать его в ваши методы какпараметр.

Более сложным решением является создание static ThreadLocal хранилища для текущего Connection, размещение его там при запуске транзакции и получение его из этого хранилища внутри ваших методов.Некоторые платформы неявно реализуют этот подход, например, Spring Framework .

Обратите внимание, что пул соединений полностью ортогонален этим вопросам.

6 голосов
/ 29 мая 2011

При частых регулярных вызовах jdbc используйте базу данных пул соединений .

3 голосов
/ 29 мая 2011

Пул подключений это путь.Основная причина в том, что в среднем время, необходимое для доступа к БД (DML и т. Д.), Намного меньше, чем время, необходимое для создания соединения и его закрытия.Кроме того, не забудьте закрыть переменные ResultSet, PreparedStatement и Connection после завершения транзакции.

Вы можете использовать классы пула соединений tomcat или apache.Эти классы определены, например, в пакете

org.apache.commons.dbcp. *;

org.apache.tomcat.dbcp.dbcp. *;

, гдеdbcp обозначает пул соединений с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...