当前位置: 首页 > 面试题库 >

如何在JDBC池中强制重用连接?

薄伟彦
2023-03-14
问题内容

我有一个Runnable,它从如下所示的连接池中获得连接,并有60秒的时间对连接进行处理:

private static ConnectionPoolDataSource cpds; // MysqlConnectionPoolDataSource

public void run(){
    while((System.currentTimeMillis()-created)<60000){
        try(Connection conn = cpds.getPooledConnection().getConnection()){  
            //do something
        }catch(SQLException sqle){}
    }
}

当线程在60s之后死掉时,我假定连接已返回到池中,并且当创建新线程时,可以重新使用该连接。但是当我列出我的网络连接时,随着创建更多线程,该列表会不断增长。如上创建的连接是否正确返回到池中,如果可以,我如何强制重新使用连接?


问题答案:

您实际上并没有使用连接池。A
ConnectionPoolDataSource不能直接使用。其目的是作为一个(特殊)DataSourcePooledConnection对象,然后由一个(正常)保存在连接池DataSource的实现,提供了连接池。

普通开发人员不应ConnectionPoolDataSource直接使用它,而是应将其与Application
Server提供的连接池一起使用,或包装到DataSource提供连接池的通用用途中。

Connection从连接池中PooledConnection请求a时,它将检出一个现有的(或从中请求一个新的ConnectionPoolDataSource),检索a
Connection并将其返回给用户。当用户关闭时ConnectionPooledConnection将会向连接池发出信号,表明该连接池再次可用。

在这种情况下,您要创建一个PooledConnectionConnection从中获取一个,然后丢弃PooledConnection。这意味着PooledConnection被抛弃,而到数据库的物理连接,不能重复使用,将被关闭/丢弃,当它终于垃圾收集(通常是当连接池要关闭物理连接,它会调用close()PooledConnection)。

您或者需要使用Application Server提供的连接池,或者使用诸如DBCP,c3p0或BoneCP之类的通用连接池。



 类似资料:
  • 我有一个问题,在通过tomcat web应用程序应用户请求重置MySQL数据库后,我会收到tomcat异常。到目前为止,我已尝试将其分解为设置、问题和我的分析,以帮助任何试图阅读本文的人。 重置基本上包括从java代码调用bash脚本以: 删除根mysql用户密码 加载数据库的旧版本 在上面运行一些脚本 恢复所有密码 这是一个用户启动的过程,通常将数据库恢复到以前的状态,但它也用于从另一个系统导入

  • 问题内容: 有人可以提供有关如何建立JDBC连接池的示例或链接吗? 从搜索谷歌,我看到这样做的许多不同方式,这相当令人困惑。 最终,我需要代码来返回一个对象,但是我在入门时遇到了麻烦。欢迎任何建议。 更新: 没有或没有池连接实现?为什么不最好使用这些? 问题答案: 如果你需要一个独立的连接池,那么我首选的是C3P0而不是DBCP(我在上一个答案中已经提到),在重负载下我对DBCP的问题太多了。使用

  • 问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager

  • 嗨,我使用micronaut数据和各种jdbc连接池。我第一次有hikari,也尝试了tomcat的一个。 我假设将数据源设置为10 会导致最多 10 个打开连接。但似乎有很多开场和闭幕正在进行。再加上同时处理大量请求,它使用的不仅仅是 10 个连接。问题是,Azure postgresql 总共只允许 100 个连接。 目前我有7个应用程序在访问这个数据库。我希望最多能有70个连接。但实际上要多

  • 问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager

  • 问题内容: 我试图确定我是否实际上正在使用JDBC连接池。经过研究后,实现似乎太容易了。实际上比常规连接容易,所以我想验证一下。 这是我的连接类: } 这是真正的连接池吗?我在另一个类中使用连接是这样的: 问题答案: 假设它是来自DBCP的,那么是的,您正在使用连接池。但是,您将在每次获取连接时重新创建另一个连接池。您并不是真正地在同一个池中合并连接。您只需在应用程序启动时创建一次连接池,并从中获