Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用try with resources或在“finally”子句中关闭此“PreparedStatement”。春天的JDBC_Java_Spring_Jdbc_Sonarqube_Spring Jdbc - Fatal编程技术网

Java 使用try with resources或在“finally”子句中关闭此“PreparedStatement”。春天的JDBC

Java 使用try with resources或在“finally”子句中关闭此“PreparedStatement”。春天的JDBC,java,spring,jdbc,sonarqube,spring-jdbc,Java,Spring,Jdbc,Sonarqube,Spring Jdbc,我从声纳那里得到以下问题: java null使用try with resources或在finally子句中关闭此PreparedStatement 我使用Spring JDBC,代码如下: ResponseObject user = jdbcTemplate.query(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Conn

我从声纳那里得到以下问题: java null使用try with resources或在finally子句中关闭此PreparedStatement

我使用Spring JDBC,代码如下:

ResponseObject user = jdbcTemplate.query(new PreparedStatementCreator() {
        @Override
        public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
            PreparedStatement ps = con.prepareStatement(MY_QUERY);
            ps.setLong(1, parameter);
            return ps;
        }
    }, new MyResultSetExtractor());
我的问题是,我认为我不需要关闭连接,因为我有一个连接池,所以你认为我必须做什么,忽略声纳问题?或者我还能做什么


谢谢

这似乎是一个问题,因为您正在创建一个匿名内部类,sonar希望关闭在常规方法中创建的prepare语句

如果您使用的是Java8,请尝试用labmda表达式替换匿名内部类

ResponseObject user = jdbcTemplate.query(coneection -> {
        PreparedStatement ps = con.prepareStatement(MY_QUERY);
        ps.setLong(1, parameter);
        return ps;
    }
}, new MyResultSetExtractor());

连接池通常为您提供一个实现,在关闭时将连接释放回池。遵循Liskov替换规则,您不应该假设您的连接的实现,并且如果它的契约如此,您应该始终关闭它。Spring JdbcTemplate将确保PreparedStatement对象根据需要关闭,因此您需要告诉SonarQube不要警告您此实例。请参阅。@sturcotte06如果您的代码没有分配连接,那么您不应该是关闭连接的人,除非有明确的文档记录。因为这里是Spring分配连接,所以应该是Spring关闭连接,除非Spring明确说明需要关闭连接。@MarkrotVeel是的,你是对的,我读了问题,但没有检查代码。为什么这有助于Sonar代码分析?代码仍在创建PreparedStatement对象,但未将其关闭。此外,代码错误。太多了}和接触!=骗局