【问题标题】:Sonar squid:S2095 when method return Connection声纳鱿鱼:方法返回连接时的S2095
【发布时间】:2019-07-01 07:03:19
【问题描述】:

使用方法返回Connection是一种常见的做法, 例如在 Hikari 的HikariConnectionProvider

public Connection getConnection() throws SQLException
   {
      Connection conn = null;
      if (this.hds != null) {
         conn = this.hds.getConnection();
      }   
      return conn;
   }

但声纳警告关闭连接

实现 Closeable 接口或其超接口 AutoCloseable 的连接、流、文件和其他类在使用后需要关闭。此外,关闭调用必须在 finally 块中进行,否则异常可能会阻止调用。

我想返回一个以后可以使用的连接,所以我无法在这些方法中关闭它

如何/如果我可以避免在 main 方法上返回有效连接的警告?

编辑 在 Sonar 社区中添加了一个误报错误:S2095 report on method return Connection

EDIT 2问题在最新版本上无法重现

【问题讨论】:

    标签: java sonarqube database-connection sonarlint


    【解决方案1】:

    我在创建与 mongodb 的连接时遇到了类似的问题。所以,我刚刚在使用 spring 时创建了连接对象Autowired

    这样连接对象的生命周期由spring管理,我们不必显式关闭连接。

    【讨论】:

    • 感谢您的回答,但问题更多的是关于 Sonar 及其误报警告,并且问题在最新版本上无法重现
    【解决方案2】:

    从技术上讲,SonarQube(在本例中是 SonarJava 分析器)无法保证此方法返回的连接最终会关闭 - 因此存在问题。

    如果您确信您的代码库已在其他地方放置了所有必需的资源清理代码,我的建议是在 SonarQube UI 中将此特定问题标记为 Won't fix

    【讨论】:

    • 我可以忽略这个警告(例如使用//NOSONAR),但是如果一个方法返回Connection,为什么声纳希望关闭它
    • 因为 Connection 对象很昂贵并且占用系统资源,所以如果调用此方法的代码从不关闭它,则资源仍在使用中 - 分析器不可能检查所有客户端代码致电#close。但是,我建议您在 community.sonarsource.com 提出这一点 - 关于返回 Connection 对象的工厂方法是否应排除在此规则范围之外的潜在有趣讨论。
    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    相关资源
    最近更新 更多