Если я закрою PreparedStatement, будет ли потеряно кэширование в базе данных? - PullRequest
0 голосов
/ 21 января 2019
PreparedStatment ps = null;
public void executeQueries(){
    try{
        ps = conn.prepareStatement(Query1);
        // Execute Query1 here and do the processing.           

        ps = conn.prepareStatement(Query2);
        // Execute Query2 here and do the processing.

        //... more queries
    }catch(){}
    finally{
        ps.close(); // At this point would the caching of queries in DB be lost?
    }
}

В моем приложении я часто вызываю метод executeQueries().

У меня вопрос: если я закрою PreparedStatement в блоке finally внутри метода (который я часто использую), удалит ли система базы данных кэширование? Если ДА, могу ли я сделать глобальный PreparedStatement для всего приложения, поскольку в моем приложении есть множество JAVA CLASSES, которые запрашивают базу данных.

Спасибо!

Обновление: Вопрос был помечен как дубликат, но связанная ветка вообще не отвечает на мой вопрос. AFAIK, система баз данных хранит выполненные запросы в кеш-памяти. Он также хранит их план выполнения. Здесь PreparedStatement лучше, чем Statement. Однако я не совсем уверен, удаляется ли информация, относящаяся к запросу, после закрытия PreparedStatement.

1 Ответ

0 голосов
/ 21 января 2019

В частности, в отношении MySQL, согласно

8.10.3 Кэширование подготовленных операторов и хранимых программ

Сервер поддерживает кэши для подготовленных операторов ихранимые программы для каждой сессии.Выражения, кэшированные для одного сеанса, недоступны для других сеансов.Когда сеанс заканчивается, сервер отбрасывает все кэшированные для него операторы.

Таким образом, закрытие PreparedStatement не приведет к удалению оператора (ов) из кэша, но, по-видимому, закрытие Connection будет.

... если только приложение не использует пул соединений, в этом случае закрытие Connection может не обязательно завершить сеанс базы данных;он может оставить сеанс открытым и просто вернуть соединение с пулом.

Тогда возникает также вопрос о том, действительно ли операторы ПОДГОТОВЛЯЮТСЯ на сервере.Это контролируется атрибутом строки соединения useServerPrepStmts.IIRC, по умолчанию, подготовленные операторы на стороне сервера не включены.

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