Использование PreparedStatement в Try with Resources показывает ошибку «неизвестный класс»

Я инициализирую подготовленный оператор глобально (поэтому он не компилируется предварительно каждый раз при запуске функции, только когда приложение загружается) и пытаюсь использовать подготовленный оператор в попытке с ресурсами, но он показывает «неизвестный класс ' ошибка. Это код:

private PreparedStatement ingredientDelete;

public void deleteIngredient(String name) {
    try(ingredientDelete = con.prepareStatement(DELETE_INGREDIENT_BY_NAME)){
        ingredientDelete.setString(1, name);
        ingredientDelete.execute();

    }catch(SQLException e){
        System.out.println("Delete failed - " + e.getMessage());

    }
}

Для ясности соединение открывается другим методом и также объявляется глобально.


person Johnny B.    schedule 08.07.2017    source источник
comment
Пожалуйста, покажите полное сообщение об ошибке.   -  person Hovercraft Full Of Eels    schedule 09.07.2017
comment
Все, что я получаю в нижнем меню intellij, это «Ошибка: (142, 29) java: ожидается идентификатор», который указывает на конец «ingredientDelete» непосредственно перед знаком =.   -  person Johnny B.    schedule 09.07.2017


Ответы (1)


Это недопустимая Java. Ресурсы, объявленные в попытке, должны быть локальными переменными, и поэтому их тип должен быть объявлен. См. JLS

Resource:
    VariableModifiersopt Type VariableDeclaratorId = Expression

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

Вы проводите предварительную оптимизацию, которая является корнем всех зол. В базе данных уже есть кеш подготовленных операторов. Не нужно делать это самостоятельно. И вам определенно следует использовать пул соединений, а не использовать одно соединение для всей вашей программы.

person JB Nizet    schedule 08.07.2017
comment
Это имеет смысл, я только что посмотрел видео, в котором говорится, что было бы хорошей практикой сделать подготовленный оператор полем из-за его прироста производительности по сравнению с обычным оператором, потому что он предварительно скомпилирован, и поэтому предварительная компиляция его при каждом вызове метода будет отрицать это улучшение. Также не могли бы вы связать меня с учебником или статьей, в которой объясняется, как использовать пулы соединений, пожалуйста, не слышал об этом. - person Johnny B.; 09.07.2017
comment
Try-with автоматически закрывает ресурсы. Таким образом, если код try работает правильно и вызывается close, то любой код после try завершится ошибкой, поскольку ресурс закрыт. Поэтому имеет смысл ограничить область действия try ? - person Java Impatient; 10.03.2020