【问题标题】:C3P0 settings impact on Thread.sleep() methodC3P0 设置对 Thread.sleep() 方法的影响
【发布时间】:2019-11-06 20:19:44
【问题描述】:

我已将 c3PO 设置如下

hibernate.c3p0.min_size = "20";
hibernate.c3p0.max_size = "30";
hibernate.c3p0.maxConnectionAge = "10";
hibernate.c3p0.timeout = "15";

然后我的代码如下

@Transactional
void m1(){
    for(int i = 0; i<10; i++){
        fetch(); // fetches db entry
        Thread.sleep(20000);
        update(); // updates db entries
     }
}

在这里,我让线程休眠 20 秒(> maxConnectionAge 和超时)。然后代码成功执行没有关闭任何数据库连接。为什么会这样?

谁能帮我理解

  1. 一个事务是否只执行一个线程? 如果是这样,为什么我们没有遇到任何数据库超时问题?

  2. 什么所有 C3P0 参数/DB 参数导致 db 连接关闭?。另外,@Transactional 是否对这个问题起作用?

【问题讨论】:

    标签: hibernate transactions threadpool c3p0 thread-sleep


    【解决方案1】:

    当一个连接被检出时,一般来说,c3p0 不会弄乱它。它在客户手中。你可以睡一百万年,c3p0 不会 close() 那个 Connection 直到它被检查回 c3p0 的控制。

    此规则有一个主要例外,即 c3p0 不会与签出的 Connection 混淆——c3p0 设置 unreturnedConnectionTimeout。即intended specifically 用于解决和/或调试具有Connection 泄漏的客户端应用程序。也许这就是您正在寻找的设置。

    一般来说,c3p0 根据您的设置管理物理Connections 的生命周期。 maxConnectionAgemaxIdleTimemaxIdleTimeExcessConnections,连接测试设置和测试结果都可能导致物理连接在close()ed 当它们在池中,而不是在客户端中时。客户端负责close()ing 他们签出的连接(实际上并不会破坏物理的Connection,而是将其返回到池中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      相关资源
      最近更新 更多