gpt4 book ai didi

java - 无法解决关闭preparedsStatement的SonarQube错误

转载 作者:行者123 更新时间:2023-12-02 00:39:18 25 4
gpt4 key购买 nike

我有一个 JDBCStreamTemplate 类,它调用类中的另外两个方法 - JDBCStreamRow 和 JDBCStreamResultSet。这两个类实现了 Autocloseable。

JDBCStreamTemplate类方法有connection和preparedStatement。 sql和connection的参数通过构造函数传递给JDBCStreamRow和JDBCStreamResultSet。

连接和 PreparedStatement 正在 JDBCStreamRow 和 JDBCStreamResultSet 类中关闭。但是 SONARQube 给出了需要在 JDBCStreamTemplate 类中关闭 Connection 和PreparedStatement 的错误。

您能否告诉我如何解决该错误?

我尝试通过将finally放入JDBCStreamTemplate来关闭PS和CON,但它在任何预期结果之前显示“Statement Closed”。下面的代码是 JDBCStreamTemplate 类方法,它调用 JdbcStreamResultSet 构造函数

try {
Connection connection = DataSourceUtils.getConnection(this.getDataSource());
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setFetchSize(5000);
this.newArgPreparedStatementSetter(args).setValues(preparedStatement);
jdbcStreamResultSet = new JdbcStreamResultSet(qRef, connection, preparedStatement);
} catch (SQLException sqle) {
logger.error("{} JdbcStreamTemplate::streamResultSet: {}", qRef, JdbcUtilities.formatException(sqle));
throw sqle;
} catch (CannotGetJdbcConnectionException ce) {
SQLException sqle = new SQLException(ce.getMostSpecificCause());
logger.error("{} JdbcStreamTemplate::streamResultSet: {}", qRef, Helpers.getExceptionMessage(sqle));
throw sqle;
}

return jdbcStreamResultSet;
}

最佳答案

But the SONARQube is giving bug that Connection and PreparedStatement need to be closed in JDBCStreamTemplate class.

是的,打开某些东西的代码也应该负责关闭它,这是一种很好的做法!在调用树中上下拆分该责任(即在一种方法中“创建/打开”,在另一种方法中关闭)会导致难以遵循控制流程,因此会带来麻烦。

The connection and PresparedStatement are being closed in JDBCStreamRow and JDBCStreamResultSet classes.

另一件事是我没有看到您的代码中有任何内容被“关闭”。你说连接和准备好的语句在你的其他类中被关闭,但是

a)您也永远不会关闭其他类,并且

b)我们没有这些代码,

所以......我将忽略您的其他类,而只是确保在此代码中关闭连接和preparedStatement。

JDBCStreamRow and JDBCStreamResultSet. These two classes implements Autoclosable.

connection 和 preparedStatement 也都实现了 AutoCloseable,所以希望您能够将我将要使用的相同思想应用到您自己的类中。

了解如何使用 Autocloseable 非常重要。这并不意味着 JVM 在关闭对象时会自行做出任意决定。相反,它意味着该对象在 try-with-resources block 的“资源”部分中使用时将被关闭。

对于连接和准备好的语句,这意味着我们可以更改您的代码以使用 try-with-resources,这样:

    try ( Connection connection = DataSourceUtils.getConnection(this.getDataSource());
PreparedStatement preparedStatement = connection.prepareStatement(sql);
)
{
connection.setAutoCommit(false);
preparedStatement.setFetchSize(5000);
this.newArgPreparedStatementSetter(args).setValues(preparedStatement);
jdbcStreamResultSet = new JdbcStreamResultSet(qRef, connection, preparedStatement);
} catch (SQLException sqle) {
logger.error("{} JdbcStreamTemplate::streamResultSet: {}", qRef,
JdbcUtilities.formatException(sqle));
throw sqle;
} catch (CannotGetJdbcConnectionException ce) {
SQLException sqle = new SQLException(ce.getMostSpecificCause());
logger.error("{} JdbcStreamTemplate::streamResultSet: {}", qRef, Helpers.getExceptionMessage(sqle));
throw sqle;
}

return jdbcStreamResultSet;
}

使用此布局,无论发生什么(并且以正确的顺序),连接和准备好的语句都保证关闭 - 并且 SONARQube 应该很高兴。

关于java - 无法解决关闭preparedsStatement的SonarQube错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57955425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com