2012-08-29 4 views
1

Java 응용 프로그램에서 데이터베이스 연결을 만드는 가장 좋은 방법은 무엇입니까? Singleton, Static Method, Service Locator, Connection Pool 또는 다른 것을 사용합니까?데이터베이스 연결을 만드는 가장 좋은 방법

각 접근법의 장단점을 알려주십시오.

+0

연결 풀링을 위해 다음과 같은 도구를 사용할 수 있습니다. http://commons.apache.org/dbcp/ – dbalakirev

답변

2

앱이 여러 연결에서 작동하는 경우 연결 풀을 사용하는 것이 좋습니다. 이미 Java로 구현되었으므로 쉽게 사용할 수 있습니다. 은 (당신이 웹 응용 프로그램은 또한 바람둥이의 풀을 사용하여 작성하고, 더 나은 것 경우) Tomcat을 사용하는 웹 응용 프로그램에서 풀을 사용하여이 예를

package usepool; 

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

/** 
* 
* @author brainless 
*/ 
public class ConnectionPool { 

private static DataSource datasource; 
public static String dbURL = "jdbc:mysql://localhost:3306/" 
       + "<YourDataBase>?useUnicode=true&useEncoding=true&characterEncoding=UTF-8"; 
public static String driverClass = "com.mysql.jdbc.Driver"; 
public static String userName = "root"; 
public static String password = "password"; 
public static boolean jmx = true; 
public static boolean testIdle = false; 
public static boolean testBorrow = true; 
public static boolean testReturn = false; 
public static int validationInterval = 30000; 
public static int timeBetweenEviction = 30000; 
public static int maxActive = 100; 
public static int initialSize = 10; 
public static int maxWait = 10000; 
public static int removeAbandonedTimeout = 60; 
public static int minEvictableIdle = 30000; 
public static int minIdle = 10; 
public static boolean logAbandoned = true; 
public static boolean removeAbandoned = true; 
public static String jdbcInterceptors = "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" 
     + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"; 

private ConnectionPool() { 
} 

public static synchronized DataSource getInstance() { 
    if (datasource == null) { 
     PoolProperties p = new PoolProperties(); 
     p.setUrl(dbURL); 
     p.setDriverClassName(driverClass); 
     p.setUsername(userName); 
     p.setPassword(password); 
     p.setJmxEnabled(jmx); 
     p.setTestWhileIdle(testIdle); 
     p.setTestOnBorrow(testBorrow); 
     p.setTestOnReturn(testReturn); 
     p.setValidationInterval(validationInterval); 
     p.setTimeBetweenEvictionRunsMillis(timeBetweenEviction); 
     p.setMaxActive(maxActive); 
     p.setInitialSize(initialSize); 
     p.setMaxWait(maxWait); 
     p.setRemoveAbandonedTimeout(removeAbandonedTimeout); 
     p.setMinEvictableIdleTimeMillis(minEvictableIdle); 
     p.setMinIdle(minIdle); 
     p.setLogAbandoned(logAbandoned); 
     p.setRemoveAbandoned(removeAbandoned); 
     p.setJdbcInterceptors(jdbcInterceptors); 
     datasource = new DataSource(); 
     datasource.setPoolProperties(p); 
    } 
    return datasource; 
} 

public static synchronized void closePool() { 
    if (datasource != null) { 
     datasource.close(); 
    } 
} 

}

이 클래스는 싱글이다. 코드에서 연결을 얻으려면 취급 연결에이 개 방법이 있습니다이

import usepool.ConnectionPool; 
/* 
* code 
*/ 
connect = ConnectionPool.getInstance().getConnection(); 
0

대부분의 Java 응용 프로그램에서 연결 풀을 사용하는 것보다 덜 중요합니다. 연결을 수동으로 관리하는 대신 연결 풀을 사용하지 않아도되는 편리함과 이득에 비해 개인의 취향에 따라 문제가 더 많습니다.

2

같은 것을 사용할 필요가 : 요청에 따라

  • 하나의 연결
  • 주문형
  • 연결

요청 당 하나의 연결은 프로세스 시작시 연결을 가져오고 마지막에 연결을 반환한다는 것을 의미합니다. 이는 웹 요청에 좋은 아이디어가 아닙니다. 응용 프로그램이 사용할 수있는 db 연결 수만큼의 동시 웹 요청 만 처리 할 수 ​​있기 때문입니다. 그러나 일괄 처리의 경우 N 연결 만 있으면됩니다.

요청시 연결은 db 호출을하려고 할 때 연결을 얻은 다음 db 호출이 끝나 자마자이를 반환한다는 것을 의미합니다.

두 경우 모두 연결 풀을 사용하는 것이 좋지만 연결을 열 때 상당한 오버 헤드가 있기 때문에 연결이 반환 된 후에도 열려 있기를 원하는대로 주문형 연결에 특히 중요합니다. .

  • 컨테이너 관리
  • 응용 프로그램이 컨테이너 관리

응용 프로그램 서버가 JNDI를 통해 응용 프로그램에 대한 연결 풀을 제공하는 것을 의미 관리 :

는 일반적으로 연결 풀을 처리하는 방법은 두 가지가 있습니다. 이것이 JBoss가 일반적으로하는 일입니다. 그것이 있으면이 접근법을 사용할 수도 있습니다. 그렇지 않으면 응용 프로그램 관리 풀을 사용해야합니다.

대부분의 DI 프레임 워크는 약간의 구성만으로 연결 풀을 제공합니다. 연결 풀을 사용할 때 심각한 단점은 없습니다. 자바에서 가장 일반적인 두 가지는 DBCP와 C3P0이며, 둘 다 매우 성숙한 라이브러리입니다.DI 프레임 워크를 사용하지 않는다면, 해당 libs의 시작 안내서를 검토하고 제안 사항을 구현해야합니다.

관련 문제