我的hibernate配置是:
.... <hibernate config of username,password etc> ...
hibernate.c3p0.min_size = 75;
hibernate.c3p0.max_size = 100;
hibernate.c3p0.timeout = 3600;
hibernate.c3p0.idle_test_period = 300;
hibernate.c3p0.acquireRetryAttempts = 5;
hibernate.c3p0.acquireRetryDelay = 10;
hibernate.c3p0.checkoutTimeout = 50;
我最近添加了最后三个配置(acquireRetryAttempts,acquireRetryDelay,checkoutTimeout)。
没有这些配置,我没有看到任何问题。
但是,使用这些配置,我只能看到写入数据库的操作的StaleStateException(对于任何其他数据库操作都没有例外)。
我想要checkoutTimeout,以便在连接池没有空闲连接时跟踪所有实例。没有checkoutTimeout我的应用程序将无限期地等待连接 - 即使池没有空闲连接。我想特别避免这种情况。
我通过测量getEntityManager()执行所需的时间,将checkoutTimeout设置为50ms。 p99.99小于10ms。 p100低于1250米;然而,这些是罕见的异常值(可能是12个数据点)。请求量平均为3000tps。
我注意到将超时值设置为更高,在500毫秒或1000毫秒时不会导致StaleStateException。我不明白为什么。