Java 如何关闭准备好的报表

Java 如何关闭准备好的报表,java,spring,jdbc,try-catch,prepared-statement,Java,Spring,Jdbc,Try Catch,Prepared Statement,我有下面的代码,我想在上面关闭preparedStatement对象,因为它是作为一个来自sonar的bug提出的 public myfunction() throws SQLException { PreparedStatementCreator preparedStatementCreator = new PreparedStatementCreator() { String query = "&q

我有下面的代码,我想在上面关闭preparedStatement对象,因为它是作为一个来自sonar的bug提出的

  public myfunction() throws SQLException {
            
           PreparedStatementCreator preparedStatementCreator = new PreparedStatementCreator() {
                String query = "";//let us assume a query
                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                    PreparedStatement preparedStatement= connection.prepareStatement(query);
                    preparedStatement.setString();
                    preparedStatement.setString();
                }
            };
    int rows;
    try
    {
    rowNumbers = jdbcTemplate.update(preparedStatementCreator);
    }
    catch(....)
    {
    }
    catch(....)
    {
    }
    catch(....)
    {
    }
    }
如何关闭preparedStatement对象? 我看到的大多数示例大多使用try/finally或try with resources,然后创建对象并使用它try and close in finally。然而,在这里,对象是在单独的函数中创建的,从那里返回,然后使用它。所以创造和使用发生在两个不同的地方。所以我想知道处理这件事的两种方法

Java 8之前 使用Java8,请尝试使用资源
在本例中,您不需要关闭语句,因为Spring的JdbcTemplate将为您完成这项工作。换句话说,这是声纳的假阳性

如emphasis mine的javadoc所述:

在此连接中创建一个语句。允许实现使用 准备好的报表。JdbcTemplate将关闭创建的 声明


我认为这是一个糟糕的设计选择,不管怎么说,调用方负责关闭相关的资源——这是如何通过调用方法实现的?OOPS……我看到JDCB模板。我想你用的是Spring,JdbcTemplate会处理这个问题:我的理解是,如果语句没有关闭,也会导致参数不起作用,整个事情都会崩溃。因此,在实践中,这不是一个问题。但是sonar当然没有看到。这是我正在处理的一些旧代码库。你共享的链接,我已经查看过了,但没有找到。由于createPreparedStatement可能在执行过程中的某个时刻被jdbc调用,所以我认为它应该只负责关闭。由于我没有访问preparedStatement对象的权限,所以似乎不可能在我拥有的应用程序代码中关闭。在您在最终解决方案中共享的链接中,他们假设我们拥有preparedStatementobject i thinlk。是的,我刚刚读到了。但是如果jdbc不这么做,那么处理这个问题的最佳方法是什么?或者使用PreparedStatementCreator的更好方法是什么?@rahulsharma对于没有在问题中提出的假设情况,不可能猜测或提供建议。您的问题中呈现的情况是明确的:没有必要关闭Springs JDBC而不是JDBC!,为您关闭它。一般来说,建议是使用try with resource,但这种情况是该建议的一个例外。好的。非常感谢。因为我是第一次尝试,所以我很想问。得到了澄清。非常感谢