在 Try with Resources 中使用 PreparedStatement 显示 'unknown class' 错误
Using PreparedStatement in Try with Resources shows 'unknown class' error
我正在全局初始化一个准备好的语句(因此它不会在每次函数 运行 时预编译,仅在加载应用程序时),并尝试使用准备好的语句来尝试资源,但显示 'unknown class' 错误。这是代码:
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());
}
}
为清楚起见,连接是在另一种方法中打开的,并且也是全局声明的。
那是无效的 Java。 try 中声明的资源必须是局部变量,因此声明了它们的类型。参见 the JLS
Resource:
VariableModifiersopt Type VariableDeclaratorId = Expression
使它成为一个字段无论如何都没有意义,因为一个语句绑定到一个连接,并且由于每次调用该方法时您都在重新创建它,因此可能在多个中使用相同的语句线程。
你在进行预优化,这是万恶之源。数据库已经有准备好的语句的缓存。无需自己动手。而且您绝对应该也使用连接池,而不是为所有程序使用单个连接。
我正在全局初始化一个准备好的语句(因此它不会在每次函数 运行 时预编译,仅在加载应用程序时),并尝试使用准备好的语句来尝试资源,但显示 'unknown class' 错误。这是代码:
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());
}
}
为清楚起见,连接是在另一种方法中打开的,并且也是全局声明的。
那是无效的 Java。 try 中声明的资源必须是局部变量,因此声明了它们的类型。参见 the JLS
Resource:
VariableModifiersopt Type VariableDeclaratorId = Expression
使它成为一个字段无论如何都没有意义,因为一个语句绑定到一个连接,并且由于每次调用该方法时您都在重新创建它,因此可能在多个中使用相同的语句线程。
你在进行预优化,这是万恶之源。数据库已经有准备好的语句的缓存。无需自己动手。而且您绝对应该也使用连接池,而不是为所有程序使用单个连接。