在 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: expected' 它指向 'ingredientDelete' 的末尾,就在 = 之前签名。 【参考方案1】:

这不是有效的 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-with-resources 语法简介

是否存在不应在常规 try 块上使用 try-with-resources 的情况?

try-with-resources 调用 close() 失败

在 System.in 中使用 try-with-resources [重复]