2013-07-04 3 views
1

공장에서 제품을로드 할 자동차 대기열 목록을 표시하는 Java 애플리케이션을 만듭니다. 이번에는 루프를 사용하여 매초마다 (MySQL) 데이터베이스에서 읽기로 디스플레이를 업데이트하고 "너무 많은 연결"오류가 발생했습니다.자바가 MySQL과 연결이 너무 많음

이렇게하는 것이 효율적인 다른 방법이 있습니까? 나는 데이터베이스의 방아쇠를 고글 렀지 만 나는 아직도 그것을 이해하지 못했다.

+0

그래서 여러 번 연결을 사용하지 않으시겠습니까? [pooling] (http://arashmd.blogspot.com/2013/06/java-threading.html#trpool) –

답변

3

정적 연결 개체를 사용하거나 연결 풀링을 사용하십시오. 여기

http://commons.apache.org/proper/commons-dbcp/

http://www.mchange.com/projects/c3p0/

또는

는 u는 즉시 자신의 목적을 역임 한로의 연결을 죽일 수 있는지 확인 C3P0 API를

package com.chetan.dbconnection; 

import java.beans.PropertyVetoException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.util.Properties; 

import javax.sql.DataSource; 

import com.mchange.v2.c3p0.ComboPooledDataSource; 


public class ConnectionProvider { 
private static String SERVER = "localhost"; 
private static String PORT = "3306"; 
private static String DATABASE = "yourdb"; 
private static String UID = "root"; 
private static String PWD = "password"; 
private static Connection conn; 
private static DataSource ds; 

public static Connection getConnection() { 

    try { 
     if (ds == null) { 
      ds = setupDataSource(); 
     } 
     if (conn == null || conn.isClosed()) { 
      conn = ds.getConnection(); 
     } 

     return conn; 
    } catch (SQLException e) { 

     e.printStackTrace(); 
    } 
    return null; 

} 

private static DataSource setupDataSource() { 
    ComboPooledDataSource cpds = new ComboPooledDataSource(); 
    try { 

     String server = prop.getProperty("SERVER", SERVER); 
     String port = prop.getProperty("PORT", PORT); 
     String db = prop.getProperty("DATABASE", DATABASE); 
     String uid = prop.getProperty("UID", UID); 
     String pwd = prop.getProperty("PWD", PWD); 

     log.info("Getting new database connection"); 
     String driver = "com.mysql.jdbc.Driver"; 
     String dbUrl = "jdbc:mysql://" + server + ":" + port + "/" + db 
       + "?autoReconnect=true"; 

     try { 
      cpds.setDriverClass(driver); 
     } catch (PropertyVetoException e) { 
      e.printStackTrace(); 
     } 
     cpds.setJdbcUrl(dbUrl); 
     cpds.setUser(uid); 
     cpds.setPassword(pwd); 
     cpds.setMinPoolSize(1); 
     cpds.setInitialPoolSize(1); 
     cpds.setAcquireIncrement(1); 
     cpds.setMaxPoolSize(20); 
     //cpds.setUnreturnedConnectionTimeout(100); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

    return cpds; 

} 
} 
+0

감사합니다. 어떻게 든이 코드를 사용하려고합니다. – user2549814

0

를 사용하여 간단한 예이다. 이 클래스 주위에 결과 집합을 움직이면 약간 까다로워 질 수 있습니다. 결과 세트를 쿼리하는 하나의 클래스를 얻고, 멋진 다차원 arraylist 나 컬렉션에 u를 할당하여 사용하기 쉽고 연결을 끊고 데이터가 살아있을 수있는 범위까지. 그런 식으로하면 많은 연결을 다루지 않는다.

나는 기본적으로 최대 하나의 연결만으로 전체 애플리케이션을 구현했다. 건배!

관련 문제