在 Try with Resources 中使用 PreparedStatement 显示“未知类”错误
Posted
技术标签:
【中文标题】在 Try with Resources 中使用 PreparedStatement 显示“未知类”错误【英文标题】:Using PreparedStatement in Try with Resources shows 'unknown class' error 【发布时间】:2017-07-08 21:12:57 【问题描述】:我正在全局初始化一个准备好的语句(因此它不会在每次运行函数时预编译,仅在加载应用程序时),并尝试在尝试资源时使用准备好的语句,但它显示了一个“未知类”错误。这是代码:
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());
为清楚起见,连接以另一种方法打开,并在全局范围内声明。
【问题讨论】:
请显示完整的错误信息。 我在 intellij 的底部菜单中得到的只是这个 'Error:(142, 29) java:这不是有效的 Java。在 try 中声明的资源必须是局部变量,因此需要声明它们的类型。见the JLS
Resource:
VariableModifiersopt Type VariableDeclaratorId = Expression
无论如何,让它成为一个字段是没有意义的,因为一个语句绑定到一个连接,并且因为每次调用该方法时都要重新创建它,因此可能会在多个线程中使用相同的语句。
您正在预先优化,这是万恶之源。数据库已经有准备好的语句的缓存。没必要自己做。而且您绝对应该使用连接池,而不是为所有程序使用单个连接。
【讨论】:
这是有道理的,我刚刚看了一个视频,它说将preparedStatement作为一个字段是一种很好的做法,因为它的性能优于常规Statement,因为它是预编译的,因此预先- 在每次方法调用时编译它会否定这种改进。另外,您能否将我链接到解释如何使用连接池的教程或文章,请没有听说过。 Try-with 自动关闭资源。因此,如果 try 代码正常工作并调用了 close ,那么 try 之后的任何代码都将失败,因为资源已关闭。这就是限制 try 范围有意义的原因吗?以上是关于在 Try with Resources 中使用 PreparedStatement 显示“未知类”错误的主要内容,如果未能解决你的问题,请参考以下文章
在 try-with-resources 中声明的变量的注释?
如何在 Java 中对接口对象使用 try-with-resources 语句
是否存在不应在常规 try 块上使用 try-with-resources 的情况?