in core/src/main/scala/org/apache/pekko/persistence/r2dbc/ConnectionFactoryProvider.scala [108:145]
private def createConnectionPoolFactory(settings: ConnectionFactorySettings): ConnectionPool = {
val connectionFactory = createConnectionFactory(settings)
val evictionInterval = {
import settings.{ maxIdleTime, maxLifeTime }
if (maxIdleTime <= Duration.Zero && maxLifeTime <= Duration.Zero) {
JDuration.ZERO
} else if (maxIdleTime <= Duration.Zero) {
JDuration.ofMillis((maxLifeTime / 4).toMillis)
} else if (maxLifeTime <= Duration.Zero) {
JDuration.ofMillis((maxIdleTime / 4).toMillis)
} else {
JDuration.ofMillis((maxIdleTime.min(maxIdleTime) / 4).toMillis)
}
}
val poolConfiguration = ConnectionPoolConfiguration
.builder(connectionFactory)
.initialSize(settings.initialSize)
.maxSize(settings.maxSize)
// Don't use maxCreateConnectionTime because it can cause connection leaks, see issue #182
// ConnectionFactoryOptions.CONNECT_TIMEOUT is used instead.
.maxAcquireTime(JDuration.ofMillis(settings.acquireTimeout.toMillis))
.acquireRetry(settings.acquireRetry)
.maxIdleTime(JDuration.ofMillis(settings.maxIdleTime.toMillis))
.maxLifeTime(JDuration.ofMillis(settings.maxLifeTime.toMillis))
.backgroundEvictionInterval(evictionInterval)
if (settings.validationQuery.nonEmpty)
poolConfiguration.validationQuery(settings.validationQuery)
val pool = new ConnectionPool(poolConfiguration.build())
// eagerly create initialSize connections
pool.warmup().asFutureDone() // don't wait for it
pool
}