当前位置: 首页 > 知识库问答 >
问题:

连接未关闭

堵彬彬
2023-03-14
 org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30002ms.
DEBUG - HikariPool-1 - Pool stats (total=10, active=9, idle=1, waiting=0)
spring.datasource.hikari.leakDetectionThreshold=2000
java.lang.Exception: Apparent connection leak detected
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
at com.clarivate.singularity.chemworkbench.dcrws.database.ReadFromDb.readStructureSearch(ReadFromDb.java:187)

给出错误的方法如下:

public class myClass(){
@Autowired
 NamedParameterJdbcTemplate  jdbcTemplate;  

@Transactional
public List<DcrData> readStructureSearch(String sqlStr,  String fileData) throws SQLException  {
    List<DcrData> dcrDataList = null;
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
try {
    conn =  this.jdbcTemplate.getJdbcTemplate().getDataSource().getConnection().unwrap(OracleConnection.class); // <<<< This is line 187 mentioned above which is giving the error
    Clob myClob =  conn.createClob();

    int ret = myClob.setString( 1, fileData);

    ps = conn.prepareStatement(sqlStr);
    ps.setClob(1,myClob);       // This works, Types.CLOB doesn't work.

    rs = ps.executeQuery();

    ResultSetHandler<List<DcrData>> handler = 
            new BeanListHandler<DcrData>(DcrData.class, new BasicRowProcessor(new GenerousBeanProcessor()));

    dcrDataList = handler.handle(rs);
    return  dcrDataList;
}finally {
    if (rs != null) {
        rs.close();
    }
    if (ps != null) {
        ps.close();
    }
    if (conn != null) {
        conn.close();
    }
    logger.info("DSxxx4");
}
}

如何创建一个没有泄漏的连接?为什么Hikari认为我的conn.close()方法没有关闭连接?任何想法都很欣赏。

共有1个答案

汪天宇
2023-03-14

我对函数在做什么有点困惑。它似乎在CLOB上运行select约束,但我可能错了。我在不知道的情况下很难重现这个问题。

也就是说,这里有几件事可以尝试。首先,您不需要NamedParameterJdbcTemplate,只需要一个数据源。试着自动取而代之。其次,似乎没有理由获取原始Oracle连接本身,您可以直接使用数据源返回的连接。第三,try with resources模式使代码更容易遵循Java将自动处理关闭资源。它在Java8中可用。最后,释放CLOB可能会有所帮助。

下面是我提到的一个示例:

public class MyClass {

    @Autowired
    DataSource dataSource;

    @Transactional
    public List<DcrData> readStructureSearch(String sqlStr, String fileData) throws SQLException {

        try (Connection conn = this.dataSource.getConnection()) {
            Clob myClob = conn.createClob();

            myClob.setString(1, fileData);

            try (PreparedStatement ps = conn.prepareStatement(sqlStr)) {
                ps.setClob(1, myClob);

                try (ResultSet rs = ps.executeQuery()) {
                    ResultSetHandler<List<DcrData>> handler =
                            new BeanListHandler<>(DcrData.class, new BasicRowProcessor(new GenerousBeanProcessor()));

                    List<DcrData> dcrDataList = handler.handle(rs);

                    myClob.free();

                    return dcrDataList;
                }
            }
        }
    }
}
 类似资料:
  • 版本 上下文 我只是想在核心示例io中运行http客户端。维特斯。实例果心http。易于理解的客户运行此示例时,its发现已建立的连接在请求完成后未关闭。 服务器端我没有看到任何问题。因为在尝试使用jmeter和服务器时,它工作得很好。所以我认为问题在于HttpClient。 有人能帮我吗? 提前谢谢。复制的步骤 额外的 即使在请求和响应结束后,仍会显示以下内容。在给LINUX 窗户 在LINUX

  • 我有一个带有数据库连接池的grails/groovy web应用程序。设置如下所示: 我使用java melody进行诊断和监控,并注意到一些奇怪的行为。例如,当执行查询数据库的作业时,连接可以超越maxActive属性。为什么这是可能的? 我需要显式关闭Grails连接吗?该作业调用一个服务方法,该方法通过withCriteria Grails调用简单地执行DB查询,如: 似乎每次运行这个程序,

  • 我正在使用DBCP连接池,并创建了一个MBean来在Jconsole中显示连接池的统计信息。我观察到的是,即使应用程序上没有活动(意味着没有页面点击等),连接池统计数据也会显示活动连接。 我们在上面看到的16个虚拟连接并没有降到零。我不知道为什么?有人能解释一下吗? 谢谢

  • 我的连接器类: 连接器。JAVA 这是我的DAO类(简化):UserDAO. java 在这里,我发现了关于Hikari的一些事实的问题: 您必须在HikariCP为您提供的连接实例上调用关闭() 可能是我的不起作用,因为它只是Hikari在方法中提供给我的连接的副本。

  • 我将spring data mongodb(1.7.0.RELEASE)与spring webmvc框架一起用于我的web应用程序。我使用mongoRepository使用基本的CRUD函数,但我没有在代码中关闭mongo连接,因为我以为spring data mongodb会自己关闭它,但它会继续打开新连接,而不是关闭它们。这些太多的连接导致我的应用程序崩溃,我必须一次又一次(每天两次)重新启动

  • 我正在尝试使用Springboot反应式webclient进行HTTP调用。远程服务器错误导致连接关闭。 请查找以下使用Webclient进行rest调用的代码。 Webclient创建的代码: 第一次通话后,我收到以下日志: 当我在一段时间后(比如10分钟)拨打电话时,连接将变为非活动状态。我正在获取以下日志: 我发现连接没有正确返回到池。配置中是否缺少任何内容?我是否已正确关闭连接?我想这应该