2016-04-08 2 views
0

Я определяю Подготовленное заявление первоначально черезJava PreparedStatements IsClosed производительность

  prepstmt=conn.prepareStatement("..."); 

, а затем использовать его (с помощью функции) в различных частях кода

prepstmt.setDouble(1,x); 
    prepstmt.execute(); 

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

Теперь, очевидно, я мог бы просто попробовать/поймать ошибку и сбросить prepstmt тогда, но это сделало бы «перезапустив» запрос более громоздкий, поэтому было интересно, как «дорого» это, чтобы не проверить первое с чем-то вроде

if (prepstmt.isClosed()) 
      prepstmt=conn.prepareStatement("..."); 
    prepstmt.setDouble(1,x); 
    prepstmt.execute(); 

т.е. проверка того, закрыт ли подготовленный отчет до каждый его использование. Угадайте, что это должно повлиять на производительность, но не знаю, насколько это важно. Оценивая, что для моего конкретного приложения его закрыто менее 0,1% времени.

ответ

5

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

Однако isClosed() не является дорогостоящей операцией, он просто возвращает логическое значение, которое отслеживает состояние оператора. Это, конечно, конкретный драйвер, но я был бы удивлен, если бы какой-либо драйвер реализовал его менее эффективным способом.

+0

Не уверен, что это явно проблема дизайна. Для производительности я использую статические соединения, т. Е. Создаю соединение в начале и использую его в течение многих часов. Тем не менее, производительность запросов (в некоторой степени) случайная, и если это приводит к удалению соединения (например, из-за таймаута), то все связанные операторы также закрываются. Это происходит в другом месте кода, и я могу поймать это и (повторно) открыть соединение, но почему я хотел бы воссоздать все PreparedStatements в одно и то же время? Кажется более эффективным и намного более чистым, чтобы делать это, когда и где они необходимы. – Rob

+0

Я понимаю, что функция возвращает, но не как она это делает. Отсюда вопрос о производительности. – Rob

+0

Ну, лучший способ был бы с пулом соединений и созданием и закрытием заявлений, когда они будут использоваться, а не поддерживать их навсегда и обходить. Вы также, похоже, используете 'execute()' вместо 'executeQuery()' и 'executeUpdate()', возможно, захотите также проверить их, так как вы (должны) знать, какой запрос вы выполняете. – Kayaman

Смежные вопросы