BoneCP DB Pooling
아침에 출근한 이후에 우리 팀의 Fireglass ( Play 2.3 ) App때문에 DB Connection 이슈가 발생했다가 이 부분을 Fix해 달라는 요청이 왔다.
Connection관련해서 FG팀에서 권장(?) 했던 기본 설정을 사용했었는데 마침 Skinny ORM의 Cross DB access 이슈로 인해서 사용되는 Database개수 만큼 Connection을 생성하고 4 Host가 돌아 가다 보니 이슈가 발생한듯 했다.
일단
driver = com.mysql.jdbc.Driver
url = "jdbc:mysql://DBHOST:3306/api?autoReconnect=true"
user = "DB_USER"
password = "DB_PASSWORD"
connectionTestStatement = "/* ping */ select 1"
idleConnectionTestPeriod = 1 minute
idleMaxAge = 10 minute
connectionTimeout = 20000
partitionCount = 2
minConnectionsPerPartition = 2
maxConnectionsPerPartition = 5
이런 설정을 DB 개수 마다 했더니 한 Host에서 16 개의 DB Poolling이 계속 가지고 있었던 것이다.
참고로 우리는 4개 Host를 가지고 있었으니 16 * 4 = 64 개의 DB Connection이 그냥 이유없이 낭비 되고 있었던 것 ..
일단 원인은 알고 있으니 우선 partitionCount를 1로 줄이고, minConnectionsPerPartition을 1로 줄여서 테스트를 해 보았는데 Pool당 Connection이 하나가 아닌 둘이 Initial되는 것이다...
이것 저것 해 보다 maxConnectionsPerPartition 도 아래와 같이 1로 해보니, 그제서야 1개의 Connection만 생긴다.
partitionCount = 1
minConnectionsPerPartition = 1
maxConnectionsPerPartition = 1
driver = com.mysql.jdbc.Driver
url = "jdbc:mysql://DBHOST:3306/api?autoReconnect=true"
user = "DB_USER"
password = "DB_PASSWORD"
connectionTestStatement = "/* ping */ select 1"
idleConnectionTestPeriod = 1 minute
idleMaxAge = 10 minute
maxConnectionAge = 15 minutes
connectionTimeout = 20000
partitionCount = 1
minConnectionsPerPartition = 1
maxConnectionsPerPartition = 10
조금 이상하게 돌아가기는 하는데 어쨋든 원하는 해결책은 찾은 듯 싶다.
그나저나 Play 2.4이후로는 HikariCP라고 좀더 향상된 DB Pooling을 쓴다고 하는데 언제 시간 될떄 한 번 Upgrade를 해 봐야 할 듯 싶다.