기술지원 문의

컨넥션풀 문제
박성진 / 2007-06-15 15:36

com.caucho.sql.SQLExceptionWrapper: javax.resource.ResourceException: Connection pool is full.  Cant allocate connection.
 at com.caucho.sql.DataSourceImpl.getConnection(DataSourceImpl.java:75)
 at com.caucho.sql.DBPool.getConnection(DBPool.java:581)
 at kr.co.sampc.common.BaseDAO.getConn(BaseDAO.java:36)
 at kr.co.sampc.common.admin.popup.dao.PopupDAO.selList(PopupDAO.java:272)
 at _jsp._garak._index__jsp._jspService(_index__jsp.java:42)
 at com.caucho.jsp.JavaPage.service(JavaPage.java:60)
 at com.caucho.jsp.Page.pageservice(Page.java:570)
 at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:159)
 at com.caucho.server.cache.CacheFilterChain.doFilter(CacheFilterChain.java:175)
 at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:163)
 at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:208)
 at com.caucho.server.hmux.HmuxRequest.handleRequest(HmuxRequest.java:396)
 at com.caucho.server.port.TcpConnection.run(TcpConnection.java:363)
 at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:490)
 at com.caucho.util.ThreadPool.run(ThreadPool.java:423)
 at java.lang.Thread.run(Thread.java:534)
Caused by: javax.resource.ResourceException: Connection pool is full.  Cant allocate connection.
 at com.caucho.jca.ConnectionPool.create(ConnectionPool.java:771)
 at com.caucho.jca.ConnectionPool.allocatePool(ConnectionPool.java:672)
 at com.caucho.jca.ConnectionPool.allocate(ConnectionPool.java:619)
 at com.caucho.jca.ConnectionPool.allocateConnection(ConnectionPool.java:516)
 at com.caucho.sql.DataSourceImpl.getConnection(DataSourceImpl.java:65)
 ... 15 more
com.caucho.sql.SQLExceptionWrapper: javax.resource.ResourceException: Connection pool is full.  Cant allocate connection.
 at com.caucho.sql.DataSourceImpl.getConnection(DataSourceImpl.java:75)
 at com.caucho.sql.DBPool.getConnection(DBPool.java:581)
 at kr.co.sampc.common.BaseDAO.getConn(BaseDAO.java:36)
 at kr.co.sampc.admin.statistic.StatDAO.doInsertCnt(StatDAO.java:159)
 at kr.co.sampc.admin.statistic.StatManager.doInsertCnt(StatManager.java:49)
 at kr.co.sampc.admin.statistic.mainmenu.StatVisitCnt.visitCntPlus(StatVisitCnt.java:20)
 at _jsp._youtong._index__jsp._jspService(_index__jsp.java:303)
 at com.caucho.jsp.JavaPage.service(JavaPage.java:60)
 at com.caucho.jsp.Page.pageservice(Page.java:570)
 at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:159)
 at com.caucho.server.cache.CacheFilterChain.doFilter(CacheFilterChain.java:175)
 at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:163)
 at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:208)
 at com.caucho.server.hmux.HmuxRequest.handleRequest(HmuxRequest.java:396)
 at com.caucho.server.port.TcpConnection.run(TcpConnection.java:363)
 at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:490)
 at com.caucho.util.ThreadPool.run(ThreadPool.java:423)
 at java.lang.Thread.run(Thread.java:534)
Caused by: javax.resource.ResourceException: Connection pool is full.  Cant allocate connection.
 at com.caucho.jca.ConnectionPool.create(ConnectionPool.java:771)
 at com.caucho.jca.ConnectionPool.allocatePool(ConnectionPool.java:672)
 at com.caucho.jca.ConnectionPool.allocate(ConnectionPool.java:619)
 at com.caucho.jca.ConnectionPool.allocateConnection(ConnectionPool.java:516)
 at com.caucho.sql.DataSourceImpl.getConnection(DataSourceImpl.java:65)
 ... 17 more
closing server

--------------------------------------------------------

위는 에러로그를 발췌한 것입니다.

며칠전 홈페이지가 죽어서 로그를 살펴보니 위와같이 메세지들이 수도없이 많이 뜨다가 결국 마지막 closing server라는 메세지가 있더라구요..

 

 <database>
   <jndi-name>jdbc/oracle</jndi-name>
   <driver>
     <type>oracle.jdbc.pool.OracleConnectionPoolDataSource</type>
     <url>jdbc:oracle:thin:@//165.213.123.25:1521/ORA8i</url>
     <user>xxxxx</user>
     <password>xxxxx</password>
   </driver>
            <prepared-statement-cache-size>8</prepared-statement-cache-size>
            <max-connections>15</max-connections>
 </database>
 <database>
   <jndi-name>jdbc/oracle-youtong</jndi-name>
   <driver>
     <type>oracle.jdbc.pool.OracleConnectionPoolDataSource</type>
     <url>jdbc:oracle:thin:@//165.213.123.25:1521/ORA8i</url>
     <user>xxxxxx</user>
     <password>xxxxx</password>
   </driver>
            <prepared-statement-cache-size>8</prepared-statement-cache-size>
            <max-connections>20</max-connections>
 </database>

 

이것의 저희 resin의 resin.conf파일의 DBPooL설정부분입니다.

-------------------------------------------------------------

홈페이지소스의 문제인지 아니면 conf파일 설정의 잘못인지 아직 잘 모르겠습니다.

 

max-connection의 수를 늘려야 할까요?

아니면 max-idle-time을 둬서 사용하지 않는 pool들을 닫아줘야 할가요?

 

관리자님 도와주세요

 

[답변]컨넥션풀 문제
기술지원팀 / 2007-06-19 00:22

기술팀 권용찬입니다.

 

일단 max-connection은 늘리세요

기본값 20개는 좀 적은 편입니다. 일반 홈페이지 같은경우에는 그다지 문제가 없지만 사용자가 어느정도 되는 사이트의 경우 적어도 40개 이상은 설정하실것을 권장합니다.

 

그리고 반대로 80~100개가 넘지 않도록 유지하는 것이 성능향상에 도움이 됩니다.

 

물론  Application의 형태나 서버이 자원에 따라 더 많은   connection을 사용하는 예도 있습니다만... 그러한 사항은 실제 시스템구성이나 부하정도, 자원상황을 살펴 보아야  쓸만한 답을 드릴 수 있겠습니다.

 

메시지로 보면 말 그대로 pool에서 사용가능한   connection이 다 사용되었다는 메시지이고   WAS가 정지되는 이유는 (다시 살아납니다.) connection을 얻지못한 Thread가 계속해서 누적되면서 JVM Heap공간을 모두 점유하는 사태가 벌어지고

Resin은 heap영역이 기준값 보다 적을 경우 시스템의 완전 정지를 방지하기 위해서 jvm을 스스로 정지했다가 다시 구동합니다.

 

위의 기준값은 기본으로 1M입니다. 즉 전체 heap이 256Mbyte인데 255Mbyte를 더 사용했다고 판단되는 순간 Resin이 재구동 됩니다.

 

connection갯수를 40이상 80개 정도까지 늘려보시고 그래도 계속 이런 증상이 나타나시면 적당한 수준에서 기술지원서비스를 받으시길 권장드립니다.

 

감사합니다.