BoneCP создает слишком много соединений. Статистика дает отрицательные числа
[BoneCP Version : 0.8.0.RELEASE]
[Guava Version : 11.0.2]
я использую guice-mybatis
с bonecp
в качестве источника данных-провайдера. Я завернул драйвер MySQL с getConnection()
перевернутый, чтобы вращаться через MySQL хозяина и раба. Я вижу, что boneCP создает слишком много соединений, чем требуется приложением. Учитывая QPS, у нас должно быть достаточно 10 активных соединений, но оно создает более 30. Кроме того, статистика bonecp дает отрицательные числа:
[Format]
Cluster = pool.getTotalCreatedConnections()|pool.getTotalFree()|pool.getTotalLeased()
[ Data ]
cluster[1]=10|44|-34,
cluster[2]=10|50|-40,
cluster[3]=-28|0|-28,
cluster[4]=10|45|-35,
cluster[5]=10|49|-39,
cluster[6]=10|50|-40,
cluster[7]=10|46|-36,
cluster[8]=10|34|-24,
Following are my bonecp configurations :
bonecp.connectionTestStatement = "SELECT now()"
bonecp.partitionCount = 1
bonecp.maxConnectionsPerPartition = 50
bonecp.minConnectionsPerPartition = 10
bonecp.acquireIncrement = 1
bonecp.idleConnectionTestPeriod = 60
bonecp.timeUnit = SECONDS
bonecp.idleMaxAge = 10
bonecp.poolAvailabilityThreshold = 1
bonecp.maxConnectionAgeInSeconds = 10
bonecp.acquireRetryDelayInMs = 500
bonecp.acquireRetryAttempts = 10
Из netstat я вижу, что общее количество УСТАНОВЛЕННЫХ соединений равно сумме pool.getTotalFree()
всех кластеров.
ПРИМЕЧАНИЕ: у меня есть другой db [oracle], для которого я использую bonecp, не сталкиваясь с этой проблемой. Разница лишь в том, что мы не обернули драйвер, и нет необходимости выполнять ротацию на разных хостах для getConnection()
запрос.
Я использовал C3P0 до перехода на BoneCP, где у нас были проблемы с производительностью, но статистика была в порядке. Я читаю исходный код, чтобы определить причину.