[C3P0设置对Thread.sleep()方法的影响

问题描述 投票:1回答:1

我已经按照如下方式设置了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个回答
1
投票
通常,当Connection被检出时,c3p0不会弄乱它。它掌握在客户手中。您可以睡一百万年,直到c3p0重新回到c3p0的控制之下,它才close()变为Connection

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

通常,c3p0根据您的设置管理物理Connections的生命周期。 maxConnectionAgemaxIdleTimemaxIdleTimeExcessConnections,连接测试设置和测试结果都可能导致物理连接被close()

当它们在池中而不是在客户端中时

。客户端负责close()检出他们的连接(实际上,这并不会破坏物理Connection,而是将其返回到池中)。
© www.soinside.com 2019 - 2024. All rights reserved.