声纳:“关闭这个PreparedStatement”

2024-03-16

Why is 声纳Qube http://docs.sonarqube.org/如果我在finally块中关闭它,Jenkins的插件会抱怨打开的语句?

(我需要在单独的函数中验证数据库连接。)

final String PING = "SELECT 1 from dual";

public boolean validateConnection(Connection conn) { 

    PreparedStatement statement = null;
    try{
        if(conn == null){
            LOGGER.log( LogEntries.PingError, "Null connection on PING. Reached max # of connections or network issue. Stats: "+getCacheStatistics() );
            return false;
        }

        if(conn.isClosed()){
            // logger
            return false;   
        } 

        statement = conn.prepareStatement( PING ); //%%%%%% SONAR: Close this "PreparedStatement".
        statement.setQueryTimeout(QUERY_TIMEOUT);

        try( ResultSet rs = statement.executeQuery() ){
            if ( rs != null && rs.next() ) {
                return true;
            }
        }catch(Exception exRs){
            // logger
            throw exRs;
        }
    }catch(Exception ex){
        // logger
    }finally{
        try{
            statement.close();
        }catch(Exception excpt){
            // logger
        }
    }
    return false;
}

我已经按照 @TT 和声纳的建议以这种方式重构了我的代码停止抱怨.

public boolean validateConnection(Connection conn) {

    LOGGER.log( LogEntries.PingConn );

    try{

        if(conn == null){
            LOGGER.log( LogEntries.PingError, "Null connection on PING. Reached max # of connections or network issue. Stats: "+getCacheStatistics() );
            return false;
        }

        if(conn.isClosed()){
            LOGGER.log( LogEntries.PingError, "Found closed connection during validation PING." );
            return false;   
        } 

        try( PreparedStatement statement = conn.prepareStatement( PING ) ){

             statement.setQueryTimeout(QUERY_TIMEOUT);

             try( ResultSet rs = statement.executeQuery() ){

                if ( rs != null && rs.next() ) {
                    return true;
                }
            }
        }

    }catch(Exception ex){
        LOGGER.log( LogEntries.PingError, ex );
    }

    return false;
}

如果没有“try-with-resource”,代码可以通过以下方式重构,但在本例中为 Sonar仍然抱怨:

public boolean validateConnection(Connection conn) {

    LOGGER.log( LogEntries.PingConn );

    PreparedStatement statement = null;
    ResultSet rs = null;
    try{

        if(conn == null){
            LOGGER.log( LogEntries.PingError, "Null connection on PING. Reached max # of connections or network issue. Stats: "+getCacheStatistics() );
            return false;
        }

        if(conn.isClosed()){
            LOGGER.log( LogEntries.PingError, "Found closed connection during validation PING." );
            return false;   
        } 

        statement = conn.prepareStatement( PING );
        statement.setQueryTimeout( QUERY_TIMEOUT );
        rs = statement.executeQuery();

        if ( rs != null && rs.next() ) {
            return true;
        }

    }catch(Exception ex){
        LOGGER.log( LogEntries.PingError, ex );
    }finally{
        try {
            if(rs!=null){
                rs.close();
            }
        } catch (SQLException eClosing1) {
            LOGGER.log( LogEntries.PingError, eClosing1 );
        }finally{
            try {
                if(statement!=null){
                    statement.close();
                }
            }catch (SQLException eClosing2) {
                LOGGER.log( LogEntries.PingError, eClosing2 );
            }   
        }
     }

    return false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

声纳:“关闭这个PreparedStatement” 的相关文章

随机推荐

  • 根据概率分布得到结果

    在浏览器游戏中 我们有根据其概率发生的项目 P i1 0 8 P i2 0 45 P i3 0 33 P i4 0 01 我们如何在 php 中实现一个根据概率返回随机项的函数 edit 这些物品有一个称为稀有度的属性 其范围从 1 到 1
  • 如何在 Django 中将当前日期设置为输入类型 = 日期形式

    我一直在尝试使表单中的日期字段在呈现时显示当前日期 但我未能找到解决这个问题的正确方法 请找到下面的代码 HTML 文件
  • 捆绑程序:不支持在使​​用系统 gem 时使用自定义路径

    我在用GitLab CI CD建立我的Rails应用 我注意到我的构建失败了Using a custom path while using system gems is unsupported错误 之前工作得很好 尝试检查较新的更新版本 但
  • 在 Google Colab 上安装 Spark 时出错

    我在 Google Colab 上安装 Spark 时遇到错误 它说 tar spark 2 2 1 bin hadoop2 7 tgz 无法打开 没有这样的文件或目录tar 错误不可恢复 立即退出 这是我的步骤 apt get insta
  • 如何删除具有特定行号的数据(sqlite)

    我有一个表人员 姓名 地址 电话 我的表有 2000 多行 我想删除 1000 行 查询情况如何 我假设您想要删除 前 1000 行 因为 select 查询结果的未排序顺序没有排序参数 也没有条件 在这种情况下您做错了 但是 作为一项学术
  • Google Mirror API 视频

    google glassmirror API 上的视频路线图是什么 API 是否允许将视频传输到设备或从设备传输视频 如 glass 演示视频所示http www youtube com watch v v1uyQZNg2vE http w
  • CMD 不在 Dockerfile 中的 ENTRYPOINT 之后运行

    所以我有一个 docker 文件 它可以执行以下操作 ENV ENV ENV ENV SERVICE NAME SERVICE NAME USER app ENV HOME home app COPY target home app tar
  • Xcode 4 中的活动构建配置在哪里设置

    我的项目中有 3 个配置 Debug Distribution AdHoc 和 Distribution AppStore 在 Xcode 3 中 我们有一个列表可以在构建和运行之前选择设备 版本 配置和目标 现在 对于 Xcode 4 我
  • 使用正则表达式删除字符之前或之后的空格

    我是正则表达式的新手 我想找到一个很好的解决方案来替换之前或之后的空格 我的子字符串中的 char 我有类似的字符串 Path01 Some folder folder 2 我检查了正则表达式 s s 但这对我来说是不正确的 我必须输入输出
  • 如何在 Tensorflow 2.0 中制作不规则批处理?

    我正在尝试从由一维数值数据张量组成的 Tensorflow 数据集创建数据输入管道 我想创建一批不规则的张量 我不想填充数据 例如 如果我的数据采用以下形式 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 我希望我的数据集由以下
  • JList 的自定义组件而不仅仅是字符串

    我一直在尝试更新我的 Java 知识 并且一直在构建一个小型 GUI 程序 但遇到了一些问题 基本上 我有一个JList我目前正在使用来自我的一个类的对象中的字符串填充该类 该类实现了AbstractListModel我们可以称之为我的It
  • 在 Windows 中将多个文件的前缀重命名或删除为每个文件的编号

    我正在尝试更改当前文件夹中的所有文件名 并且我正在尝试通过删除文件前缀 每个文件都有一个公共前缀 或将其名称更改为其计数 如果有 5 个文件 则文件名将是 1 txt 2 txt 3 txt 4 txt 5 txt 现在我在cmd中找到了r
  • 如何使用jquery一键选中复选框(3)

    这里我有一堆复选框 比如说 如果我单击任何复选框 我也希望选中接下来的两个复选框 即在两个复选框旁边 table border 1 cellspacing 0 width 450 tr td td tr table
  • 无法通过 group_send 向 Django 通道发送消息

    我想使用 Django Channels 通过通道发送消息 我就是这样做的 我首先创建一个消费者 我能够回显收到的消息 但是 无法将消息发送到特定频道 组 class Consumer AsyncJsonWebsocketConsumer
  • 获取Android中虚拟键盘的高度

    如何获取Android中虚拟键盘的高度 是否可以 我尝试从主窗口获取它 但它给了我应用程序的完整高度 但我想得到键盘的高度 您无法获取键盘高度 但可以获取 View 的高度 这是您真正想要的 并且您将获得提供给当前视图的 onLayout
  • PL/SQL 在整个数据库中搜索字符串

    这不仅仅是一个问题 它还是一个信息共享帖子 我今天遇到一个情况我需要在应用程序的整个数据库中寻找一个刺痛 但不知道它属于哪个表 列 下面是我编写并用于帮助我提出建议的 PL SQL 块 希望它能帮助其他有类似需求的人 Declare i N
  • 如何远程访问Spring-boot JMX

    我知道 spring 自动公开 JMX beans 我能够使用 VisualVM 在本地访问它 但是在产品上我如何使用它的 JMX beans 远程连接到应用程序 是否有默认端口或者我应该另外定义什么 谢谢 射线 默认情况下 JMX 可在本
  • -m32 选项不适用于 gcc,但适用于 g++

    我试图在 x86 64 ubuntu 12 04 机器上编译 32 位目标的应用程序 我使用安装了所需的包 sudo apt get install gcc multilib g multilib libc6 i386 libc6 dev
  • 错误:安装 ruby​​-debug-ide

    事实上 我是 ruby on Rails 开发的新手 并不是说我无法在 aptana studio 3 上安装 gem install ruby debug ide gem install ruby debug ide Temporaril
  • 声纳:“关闭这个PreparedStatement”

    Why is 声纳Qube http docs sonarqube org 如果我在finally块中关闭它 Jenkins的插件会抱怨打开的语句 我需要在单独的函数中验证数据库连接 final String PING SELECT 1 f