2012-11-16 4 views
1

나는 항상 동일한 예외를 얻고 있습니다. 솔루션을 얻으려면 검색을하지만 이점이 없으면 최선을 다했습니다.Tomcat JDBC Exception PoolExhausted

내 예외입니다 : 내가 MySQL의 DB에 연결의 최대 수를 늘리기 위해 노력했다

SEVERE: Exception : org.apache.tomcat.jdbc.pool.PoolExhaustedException: [pool-2-thread-1] Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[size:100; busy:100; idle:0; lastwait:30000]. 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:672) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:187) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128) 
    at com.xxxxx.dbmanager.utils.DBManager.getConnection(DBManager.java:81) 
    at com.xxxxx.dbmanager.utils.SQLManager.<init>(SQLManager.java:36) 
    at ... 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

.

서블릿이 백그라운드에서 실행 중이고 스레드를 만드는 것이 문제가 될 수 있는지 궁금합니다. 그리고 작업이 끝나면 어떻게 스레드를 죽일 수 있습니까?

감사합니다!

답변

0

연결 풀의 용량이 최대입니다. JDBC 연결의 긴 수명을 피하십시오. 연결 방법을 범위로 유지하고 풀링 속성이있는 Datasource을 연결 팩토리로 사용하십시오.

예제 코드.

import java.sql.Connection; 
     import java.sql.ResultSet; 
     import java.sql.Statement; 

     import org.apache.tomcat.jdbc.pool.DataSource; 
     import org.apache.tomcat.jdbc.pool.PoolProperties; 

     public class SimplePOJOExample { 

      public static void main(String[] args) throws Exception { 
       PoolProperties p = new PoolProperties(); 
       p.setUrl("jdbc:mysql://localhost:3306/mysql"); 
       p.setDriverClassName("com.mysql.jdbc.Driver"); 
       p.setUsername("root"); 
       p.setPassword("password"); 
       p.setJmxEnabled(true); 
       p.setTestWhileIdle(false); 
       p.setTestOnBorrow(true); 
       p.setValidationQuery("SELECT 1"); 
       p.setTestOnReturn(false); 
       p.setValidationInterval(30000); 
       p.setTimeBetweenEvictionRunsMillis(30000); 
       p.setMaxActive(100); 
       p.setInitialSize(10); 
       p.setMaxWait(10000); 
       p.setRemoveAbandonedTimeout(60); 
       p.setMinEvictableIdleTimeMillis(30000); 
       p.setMinIdle(10); 
       p.setLogAbandoned(true); 
       p.setRemoveAbandoned(true); 
       p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ 
        "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); 
       DataSource datasource = new DataSource(); 
       datasource.setPoolProperties(p); 

       Connection con = null; 
       try { 
        con = datasource.getConnection(); 
        Statement st = con.createStatement(); 
        ResultSet rs = st.executeQuery("select * from user"); 
        int cnt = 1; 
        while (rs.next()) { 
         System.out.println((cnt++)+". Host:" +rs.getString("Host")+ 
         " User:"+rs.getString("User")+" Password:"+rs.getString("Password")); 
        } 
        rs.close(); 
        st.close(); 
       } finally { 
        if (con!=null) try {con.close();}catch (Exception ignore) {} 
       } 
      } 

     } 

예제는 생산 환경을위한 것이 아닙니다. init app 및 다른 최상의 방법으로 한 번만 인스턴스화 된 JNDI 데이터 소스를 사용해야합니다.

관련 문제