Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > один PreparedStatement на один DAO


Автор: vogdb 15.12.2011, 10:23
   Здравствуйте! Интересно имеет ли право на жизнь вот такая вот реализация работы с PreparedStatement.
Далее псевдокод
Код

public class SimpleDao {
    private PreparedStatement pstmt;

    public SimpleDao(Connection connection) throws SQLException {
        pstmt = connection.prepareStatement("select * from where params...");
    }

    public Simple get(long id){
        pstmt.setParams();
        ResultSet rs = pstmt.executeQuery();
        pstmt.clearParameters();
        rs.close();
    }
}


Нужно ли будет синхронизировать доступ к методу get(long id)? Если да, то как?

Автор: danilych 15.12.2011, 10:38
Если к классу будут обращаться несколько потоков одновременно, т.е. вызывать ваш метод public Simple get(long id), то однозначно будут траблы. Поэтому лучше в этом методе создавать объект класса PreparedStatement. 
Если же вы сделаете синхронизацию по вашему методу get, то потеряете в производительности, т.к. если запрос будет очень тяжелый и будет выполняться скажем 5 секунд, все остальные потоки будут ждать это время.

Автор: LSD 15.12.2011, 11:41
Цитата(danilych @  15.12.2011,  11:38 Найти цитируемый пост)
Если к классу будут обращаться несколько потоков одновременно, т.е. вызывать ваш метод public Simple get(long id), то однозначно будут траблы. Поэтому лучше в этом методе создавать объект класса PreparedStatement. 

Чтобы это сработало, нужно использовать тред пул, а не одно соединение.

Добавлено через 3 минуты и 47 секунд
Если вам нужно генерировать ключи для БД для большого количества потоков. Сделайте сиквенс с шагом N. Затем в синхронизированном методе читаете его значение в некий AtomicLong и треды получают свой ID уже из него. Когда все N значений израсходуются, идете в базу за новым значением или пусть это делает фоновый поток который будет создавать такие интервалы.

Автор: Старовъръ 11.2.2012, 09:51
vogdb, разберись что такое Prepared Statement и как он работает. Когда ты вызываешь connection.prepareStatement("select * from where params..."), то объект не создается новый, а возвращается из кеша. У каждого соединения есть такой кеш, то бишь если это одно и то же соединение, то все сработает по плану. Если же у тебя несколько соединений, то для использования кеша, нужно подключить Connection Pool как уже сказал товарищ LSD. Подробней о PreparedStatement и их кешировании можешь почитать http://www.javatalks.ru/sutra126142.php#126142.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)