programing

JDBC에서 접속 풀을 확립하려면 어떻게 해야 합니까?

shortcode 2022. 11. 24. 21:14
반응형

JDBC에서 접속 풀을 확립하려면 어떻게 해야 합니까?

JDBC 접속 풀을 확립하는 방법의 예나 링크를 제공할 수 있는 사람은 있습니까?

구글 검색에서 나는 이것을 하는 많은 다른 방법들을 보았고 그것은 다소 혼란스러웠다.

궁극적으로, 나는 그 코드를 반환해야 한다.java.sql.Connection이라도 환영합니다.이치노

업데이트: 하지 않음javax.sql ★★★★★★★★★★★★★★★★★」java.sql링된 접접 ?장 장? ???왜이이 쓰는 ?? ???

스탠드아론 접속 풀이 필요한 경우 DBCP보다 C3P0이 우선입니다(의 답변에서 설명한 바와 같이). 부하가 높은 상태에서 DBCP에 문제가 너무 많았습니다.C3P0의 사용은 매우 간단합니다.매뉴얼에서 다음 항목을 참조하십시오.

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "org.postgresql.Driver" ); //loads the jdbc driver
cpds.setJdbcUrl( "jdbc:postgresql://localhost/testdb" );
cpds.setUser("swaldman");
cpds.setPassword("test-password");

// the settings below are optional -- c3p0 can work with defaults
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);

// The DataSource cpds is now a fully configured and usable pooled DataSource 

그러나 애플리케이션 서버 내에서 실행 중인 경우 내장된 연결 풀을 사용하는 것이 좋습니다.이 경우 이를 구성하고(어플리케이션서버의 메뉴얼을 참조), JNDI 경유로 DataSource 를 취득할 필요가 있습니다.

DataSource ds = (DataSource) new InitialContext().lookup("jdbc/myDS");

HikariCP

현대적이고 빠르고 간단합니다.새로운 프로젝트 때마다 사용합니다.나는 C3P0보다 더 좋아, 다른 수영장은 잘 몰라.

일반적으로 연결 풀이 필요한 경우 일부 관리되는 환경에서 실행되는 응용 프로그램, 즉 응용 프로그램 서버 내에서 실행 중인 응용 프로그램을 씁니다.이 경우 다른 옵션을 시도하기 전에 애플리케이션 서버에서 제공하는 연결 풀링 기능을 확인하십시오.

즉시 사용할 수 있는 솔루션은 다른 애플리케이션 서버 시설과 가장 잘 통합됩니다.그러나 애플리케이션 서버 내에서 실행 중이 아닌 경우 Apache Commons DBCP Component권장합니다.이 기능은 널리 사용되며 대부분의 응용 프로그램에 필요한 모든 기본 풀링 기능을 제공합니다.

수레바퀴를 재발명하지 마세요.

즉시 사용할 수 있는 서드파티 컴포넌트 중 하나를 시험합니다.

  • Apache DBCP - 이것은 Tomcat에 의해 내부적으로 사용되고 있으며, 실제로 사용 중인 것에 의해 사용됩니다.
  • c3p0

Apache DBCP에는 풀링 javax.sql을 설정하는 다른 예가 포함되어 있습니다.데이터 소스여기 시작할 때 도움이 되는 샘플이 있습니다.

commons-dbcp 라이브러리를 사용하는 것을 추천합니다.사용방법에는 수많은 예가 나열되어 있습니다.여기서는 간단한 이동에 대한 링크가 나와 있습니다.사용법은 매우 간단합니다.

 BasicDataSource ds = new BasicDataSource();
 ds.setDriverClassName("oracle.jdbc.driver.OracleDriver")
 ds.setUsername("scott");
 ds.setPassword("tiger");
 ds.setUrl(connectURI);
 ...
 Connection conn = ds.getConnection();

데이터 원본을 한 번만 생성하면 되므로 방법을 모를 경우 설명서를 읽어 보십시오.리소스를 유출하지 않도록 JDBC 문을 올바르게 쓰는 방법을 모르는 경우 Wikipedia 페이지를 읽어보십시오.

내가 일하는 곳에서 사용하는 앱 서버(기억하기로는 Oracle Application Server 10g)에서는 풀링이 앱 서버에서 처리됩니다.에서 JNDI 룩업을 사용하여를 취득합니다.

그것은 이와 같은 일을 했다.

try {     
   context = new InitialContext();
   jdbcURL = (DataSource) context.lookup("jdbc/CachedDS");
   System.out.println("Obtained Cached Data Source ");
}
catch(NamingException e)   
{  
    System.err.println("Error looking up Data Source from Factory: "+e.getMessage());
}

(이 코드는 저희가 작성한 것이 아닙니다.이 매뉴얼에서 복사한 것입니다).

수영장

  • 풀링 메커니즘은 개체를 미리 만드는 방법입니다.클래스가 로드된 경우.
  • 어플리케이션이 향상됩니다.[오브젝트 데이터에 대한 액션을 수행하기 위해 같은 오브젝트를 다시 사용함으로써]및 [많은 오브젝트를 할당 및 할당 해제하면 메모리 관리의 오버헤드가 크게 발생합니다.
  • 동일한 개체를 사용하고 있으므로 개체를 정리할 필요가 없으므로 가비지 컬렉션 로드를 줄일 수 있습니다.

§ 풀링 [풀, 상수 풀, 풀, 접속 풀]

문자열 상수 풀

  • 문자열 리터럴 풀에서는 각 개별 문자열 값의 복사본이 1개만 유지됩니다.불변해야 합니다.
  • intern 메서드가 호출되면 equal 메서드를 사용하여 풀에서 동일한 콘텐츠를 가진 객체의 가용성을 체크합니다.§ String-copy가 풀에서 사용 가능한 경우 참조를 반환합니다.그렇지 않으면 String 객체가 풀에 추가되어 참조가 반환됩니다.

예:풀에서 원하는 개체를 확인하는 문자열입니다.

public class StringPoolTest {
    public static void main(String[] args) { // Integer.valueOf(), String.equals()
        String eol = System.getProperty("line.separator"); //java7 System.lineSeparator();

        String s1 = "Yash".intern();
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s1, s1.hashCode(), System.identityHashCode(s1));
        String s2 = "Yas"+"h".intern();
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s2, s2.hashCode(), System.identityHashCode(s2));
        String s3 = "Yas".intern()+"h".intern();
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s3, s3.hashCode(), System.identityHashCode(s3));
        String s4 = "Yas"+"h";
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s4, s4.hashCode(), System.identityHashCode(s4));
    }
}

타입 4 드라이버를 사용한 접속 풀 서드파티 라이브러리 사용[ , , ]

Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora]. 위키

Connection Pool 메커니즘에서는 클래스가 로드되면 클래스가 오브젝트를 취득하여 사용자에게 래핑된 물리 접속 오브젝트를 제공합니다.PoolableConnection 는 실제 접속을 둘러싼 래퍼입니다.

  • getConnection()는 connection 객체 풀에서 무료 랩 연결 중 하나를 선택하여 반환합니다.
  • close()이치

예:Java try-with-resources7에서 ~ DBCP2 연결 풀 사용 []

public class ConnectionPool {
    static final BasicDataSource ds_dbcp2 = new BasicDataSource();
    static final ComboPooledDataSource ds_c3p0 = new ComboPooledDataSource();
    static final DataSource ds_JDBC = new DataSource();

    static Properties prop = new Properties();
    static {
        try {
            prop.load(ConnectionPool.class.getClassLoader().getResourceAsStream("connectionpool.properties"));

            ds_dbcp2.setDriverClassName( prop.getProperty("DriverClass") );
            ds_dbcp2.setUrl( prop.getProperty("URL") );
            ds_dbcp2.setUsername( prop.getProperty("UserName") );
            ds_dbcp2.setPassword( prop.getProperty("Password") );
            ds_dbcp2.setInitialSize( 5 );

            ds_c3p0.setDriverClass( prop.getProperty("DriverClass") );
            ds_c3p0.setJdbcUrl( prop.getProperty("URL") );
            ds_c3p0.setUser( prop.getProperty("UserName") );
            ds_c3p0.setPassword( prop.getProperty("Password") );
            ds_c3p0.setMinPoolSize(5);
            ds_c3p0.setAcquireIncrement(5);
            ds_c3p0.setMaxPoolSize(20);

            PoolProperties pool = new PoolProperties();
            pool.setUrl( prop.getProperty("URL") );
            pool.setDriverClassName( prop.getProperty("DriverClass") );
            pool.setUsername( prop.getProperty("UserName") );
            pool.setPassword( prop.getProperty("Password") );
            pool.setValidationQuery("SELECT 1");// SELECT 1(mysql) select 1 from dual(oracle)

            pool.setInitialSize(5);
            pool.setMaxActive(3);
            ds_JDBC.setPoolProperties( pool );
        } catch (IOException e) {   e.printStackTrace();
        } catch (PropertyVetoException e) { e.printStackTrace(); }
    }

    public static Connection getDBCP2Connection() throws SQLException {
        return ds_dbcp2.getConnection();
    }

    public static Connection getc3p0Connection() throws SQLException {
        return ds_c3p0.getConnection();
    }

    public static Connection getJDBCConnection() throws SQLException {
        return ds_JDBC.getConnection();
    }
}
public static boolean exists(String UserName, String Password ) throws SQLException {
    boolean exist = false;
    String SQL_EXIST = "SELECT * FROM users WHERE username=? AND password=?";
    try ( Connection connection = ConnectionPool.getDBCP2Connection();
          PreparedStatement pstmt = connection.prepareStatement(SQL_EXIST); ) {
        pstmt.setString(1, UserName );
        pstmt.setString(2, Password );

        try (ResultSet resultSet = pstmt.executeQuery()) {
            exist = resultSet.next(); // Note that you should not return a ResultSet here.
        }
    }
    System.out.println("User : "+exist);
    return exist;
}

jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName> jdbc:oracle:thin:@localhost:1521:myDBName jdbc:mysql://localhost:3306/myDBName

connectionpool.properties

URL         : jdbc:mysql://localhost:3306/myDBName
DriverClass : com.mysql.jdbc.Driver
UserName    : root
Password    :

응용 프로그램:모든 연결이 닫혀 있을 때 연결 문제를 방지하려면 [MySQL "wait_timeout" default 8 hours] 기본 DB와의 연결을 다시 여십시오.

TestOnBorrow = true 및 validation을 설정하여 Test Every Connection을 테스트할 수 있습니다.Query= "SELECT 1"을 조회하고 MySQL 서버에 대해 autoReconnect를 사용하지 마십시오. MySQL 서버는 더 이상 사용되지 않습니다.발행하다

===== ===== context.xml ===== =====
<?xml version="1.0" encoding="UTF-8"?>
<!-- The contents of this file will be loaded for a web application -->
<Context>
    <Resource name="jdbc/MyAppDB" auth="Container" 
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
        type="javax.sql.DataSource" 

        initialSize="5" minIdle="5" maxActive="15" maxIdle="10"

        testWhileIdle="true"
            timeBetweenEvictionRunsMillis="30000"

        testOnBorrow="true"
            validationQuery="SELECT 1"
            validationInterval="30000"


        driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://localhost:3306/myDBName" 
        username="yash" password="777"
    />
</Context>

===== ===== web.xml ===== =====
<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/MyAppDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
===== ===== DBOperations ===== =====
servlet «   init() {}
Normal call used by sevlet  « static {}

static DataSource ds;
static {
    try {
        Context ctx=new InitialContext();
        Context envContext = (Context)ctx.lookup("java:comp/env");
        ds  =   (DataSource) envContext.lookup("jdbc/MyAppDB");
    } catch (NamingException e) {   e.printStackTrace();    }
}

다음의 항목도 참조해 주세요.

2017년 말 Proxool, BoneCP, C3P0, DBCP는 현재 대부분 사용되지 않습니다.HikariCP(2012년 창간)는 유망할 것 같으며, 제가 아는 다른 것은 모두 날려버립니다.http://www.baeldung.com/hikaricp

프록시쿨
- 부하가 높은 경우 최대 연결 수를 초과하여 최대 연결 수 미만으로 돌아가지 않을 수 있습니다.
- 이 만료된 않을 수 - 연결 만료 후에도 최소 연결로 돌아가지 않습니다.
하지 않음 HouseKeeper 스레드 중 접속에 가 있는 풀 및 모든 스레드 수
스레드는 이 설정되어 있는 HouseKeeper는 조건할 수 있습니다.- HouseKeeper는 이 스레드에 접속 재작성을 요구합니다(스위프)을 요구합니다.이러한 메서드 호출에서는 마지막 파라미터는 루프 중 항상 sweep:false여야 하며 그 아래 sweep:true만 있어야 합니다.
스위프만 더 ]- HouseKeeper의 프로토타입 가 있습니다.
될 수 있는 을 확인하기 방화벽 등의 DB에 될 수 하는 일부 - HouseKeeper는 다음과 같이 합니다.[기한이 만료된 접속은 방화벽 내의 DB에 다른 타임아웃을 통해 끊어지거나 종료될 수 있습니다]
- 이에는 미완성 코드(하지 않는 가 있습니다 미완성 코드(미완성 코드(미완성 코드.
되지 않은 경우 최대 - 4시간입니다.
- HouseKeeper 5초마다 실행(초과)

코드를 수정하여 다음과 같이 개선할 수 있습니다.그러나 2003년에 작성되어 2008년에 갱신되었기 때문에 hikaricp와 같은 솔루션이 활용하는 자바 개선은 10년 가까이 부족했습니다.

다른 사람의 답변에 따르면 Apache Dbcp 또는 c3p0만족할 수 있습니다.둘 다 인기가 많아서 잘 작동합니다.

당신의 의문에 대해서

javax.sql 또는 java.sql은 풀링된 연결 구현이 없습니까?왜 이걸 쓰는 게 좋지 않을까?

이들은 구현, 인터페이스 및 일부 지원 클래스를 제공하지 않으며, 서드파티 라이브러리(풀 또는 드라이버)를 구현하는 프로그래머에게만 즐거움을 줍니다.보통은 그런 것도 안 보잖아요코드는 풀에서 "일반" 연결인 것처럼 투명하게 연결을 처리해야 합니다.

Vibur DBCP는 이러한 목적을 위한 또 다른 라이브러리입니다.Hibernate, Spring+Hibernate 또는 프로그램용으로 설정하는 예를 몇 가지 소개합니다.http://www.vibur.org/

, 여기를 참조해 주세요.

Apache Commons에는 DBCP라는 라이브러리가 있습니다.수영장 주변에 이상한 요구 사항이 없는 한 도서관은 당신이 원하는 것보다 더 까다롭고 미묘하기 때문에 저는 도서관을 이용하겠습니다.

UCP 사용을 검토해야 합니다.Universal Connection Pool(UCP; 유니버설 연결 풀)은 Java 연결 풀입니다.풍부한 기능을 갖춘 연결 풀로 오라클의 RAC(Real Application Clusters), ADG, DG 데이터베이스와 긴밀하게 통합됩니다.

UCP 의 상세한 것에 대하여는, 이 페이지를 참조해 주세요.

MiniConnectionPoolManager 임베디드 가능한 솔루션을 찾고 있고 성능에 대해 크게 염려하지 않는 경우(그 점에 대해서는 테스트하지 않았지만)는 1자바 파일 구현입니다.

멀티 라이선스 EPL, LGPL, MPL입니다.

이 문서에서는 (DBCP 및 C3P0에 더해) 확인할 필요가 있는 대체 수단도 제공하고 있습니다.

언급URL : https://stackoverflow.com/questions/2835090/how-to-establish-a-connection-pool-in-jdbc

반응형