BoneCP DB Pooling

개발자세상 2016. 11. 22. 07:33

아침에 출근한 이후에 우리 팀의 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


근데 이렇게 되면 Traffic이 많아 져서 Connection이 더 필요할 때 문제가 생길 소지가 다분하다.

뭐.. 이거 두고 왈과왈부 하고 있느데 , John이 "maxConnectionAge = 15 minutes"를 넣어 달라고 하면서 이 구문이 이유없이 생겨 있는 Connection 을 Clean up시켜 준다고 한다.

그래서 해보니 처음 Initial할때 일단 2개의 Connection이 생성되지만, 15분이 지나자 Config내용대로 하나의 Connection만 남고 다른 하나는 Clean up되어 버렸다.

        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를 해 봐야 할 듯 싶다.

'개발자세상' 카테고리의 다른 글

Mobile세상 ....  (0) 2017.06.03
JavaScript polling  (0) 2017.03.17
Rotating Linux Log file  (0) 2016.03.10
Continuous Integration with Jenkins  (0) 2016.03.04
Hibernate interceptor  (0) 2015.05.20
Posted by headiron
,