JDBC PreparedStatements vs Objects - Где поставить инициализацию - PullRequest
0 голосов
/ 23 сентября 2011

Как лучше всего поместить инициализацию PreparedStatement, когда я хочу использовать ее для всех экземпляров данного класса?

Мое решение пока заключается в создании статических методов для открытия и закрытия, но я неЭто не совсем правильный выбор:

class Person {
    protected static PreparedStatement stmt1;
    protected static PreparedStatement stmt2;

    protected static void initStatements(Connection conn) {
        stmt1 = conn.PrepareStatement("select job_id from persons where person_id=:person_id");
        stmt2 = conn.PrepareStatement("update persons set job_id=:job_id where person_id=:person_id");
    }

    protected static void closeStatements() {
        stmt1.close();
        stmt2.close();
    }
    public void increaseSalary() {
        stmt1.execute(); // just a example 
        stmt2.execute();
    }
}

void main {
    // create prepared statements
    Person.initStatements(conn);

    // for each person, increase do some action which require sql connection
    for (Person p : getAllPersons()) {
        p.increaseSalary();
    }

    // close statements
    Person.closeStatements();
}

Нет ли другого способа использовать PreparedStatements внутри нескольких экземпляров класса?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Будет ли человек вашим классом предметной логики? Тогда я рекомендую не помещать туда методы доступа к данным и PreparedStatements, а в отдельный объект доступа к данным.

Будут ли методы DAO вызываться асинхронно, например, в веб-приложении? Тогда я рекомендую вообще не использовать ни PreparedStatements, ни Connections между этими вызовами. Для соединений я бы использовал пул соединений. Подробнее о повторном использовании PreparedStatements: Повторное использование PreparedStatement несколько раз

0 голосов
/ 23 сентября 2011

Обычно лучше использовать ConnectionSurvivalPack и раздайте его всем участникам:

Class SurvivalPack {
    private Connection connection;
    private PreparedStatement st1;
    // add constructor and appropriate getter/setter
    // getter for PreparedStatements could create statements on demand
    void close(){
        st1.close();
        con.close();
    }
}

void main(...){
   SurvivalPack survivalPack = new SurvivalPack(conn);
   for(Person p: getAllPersons()){
       p.increaseSalary(survivalPack);
   }
   survivalPack.close();
}

Плюсы:

  • Многопоточность не является проблемой, поскольку ресурсы не распределяются между потоками.
  • Все ресурсы базы данных объединены в одном месте. Это делает управление ресурсами более простым и последовательным.
  • Гораздо проще следовать потоку кода и задействованных ресурсов, потому что не может возникнуть побочных эффектов от полуглобальных переменных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...