1. JDBC 연결 풀이란 무엇입니까?
기존 JDBC 연결에서 연결 연결을 얻을 때마다 다음 코드와 같은 복잡한 코드를로드해야합니다.
public static connection getConn () {Connection conn = null; 문자열 URL = "jdbc : mysql : // localhost : 3306/test"; 문자열 사용자 = "루트"; 문자열 암호 = "루트"; try {class.forname ( "com.mysql.jdbc.driver"); conn = drivermanager.getConnection (URL, 사용자, 암호); } catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return conn; }이러한 복잡한 작업은 연결을 얻기위한 것입니다. 물론, 우리는이를 도구 클래스로 캡슐화하여 액세스 할 수 있지만 (위의 그림은 연결의 연결을 캡슐화합니다), 각 연결을로드하는 것이 성능 낭비입니까? 성능을 최적화하기 위해 연결 풀이 나타납니다.
연결 풀이 초기화되면 사용할 수 있도록 몇 가지 연결이 생성됩니다. 연결해야 할 때는 연결 풀에서 기존 연결 만 얻기 만하면됩니다. 초기화 된 연결이 없으면 연결이 재현됩니다. 연결을 사용하면 연결이 파괴되지 않지만 나중에 사용하기 위해 연결 풀로 되돌아갑니다. (물론 연결 풀링은 단순한 것이 아니라 소개가 있습니다)
일반적으로 사용되는 연결 풀에는 DBCP 및 C3P0이 포함됩니다. 가장 주류는 이제 Alibaba의 Druid Connection Pool과 Tomcat 자체 JNDI Connection Pool입니다.
2. 간단한 연결 풀을 사용자 정의하십시오
사용자 정의 연결 풀 분석 :
1.2. 연결 풀이기 때문에 DataSource 인터페이스를 구현하고 메소드를 구현해야합니다. 우리의 상황에 따라, 우리는 getConnection () 메소드에 관한 것입니다.
2. 여러 연결 객체를 저장하려면 컬렉션을 사용하여 저장합니다. 추가 및 삭제의 빈번한 작업을 기반으로 LinkedList를 사용하십시오.
3. 연결의 파괴는 연결을 파괴하는 것이 아니라 연결 풀에 연결을 반환하는 것입니다.
코딩 :
1. 클래스 MyDatasource를 만들고 DataSource 인터페이스를 구현하십시오.
이 클래스가로드되면 연결을 저장할 컨테이너가 있어야하므로 정적 속성을 정의해야합니다.
개인 정적 목록 <conn
2. 데이터베이스 연결을 얻어야하므로 데이터베이스 연결을 얻는 메소드를 캡슐화합니다.
공개 연결 getoneConnection () {Connection Conn = null; {// 여기에서 얻은 데이터는 외부 속성 파일을 통해 얻습니다.이 파일은 더 유연합니다. inputStream in = myDatasource.class.getClassLoader (). getResourceasStream ( "JDBC/JDBC.Properties"); 속성 pro = 새로운 속성 (); pro.load (in); 드라이버 = pro.getProperty ( "드라이버"); url = pro.getProperty ( "url"); username = pro.getProperty ( "사용자"); password = pro.getProperty ( "password"); class.forname (드라이버); conn = drivermanager.getConnection (URL, 사용자 이름, 비밀번호); } catch (예외 e) {e.getStackTrace (); } return conn; }속성 파일을 통해 얻은 데이터는 실제 상황에 따라 선택할 수 있습니다.
3. 여러 연결을 초기화하여 컨테이너에 넣습니다. 정적 코드 블록을 사용하여 구현할 수 있지만이 데이터 소스가 사용되지 않으면 자원 폐기물이 발생하므로 여러 연결을 그의 생성자에 초기화하는 구현을 고려했습니다. 다음과 같이 :
public mydatasource () {for (int i = 0; i <5; i ++) {connection conn = getoneConnection (); }}4. 이제 getConnection ()의 외부 메소드를 덮어 쓰기 시작 하여이 연결 풀에서 연결을 얻으십시오.
@override public connection getConnection ()는 sqlexception {connection conn = null; if (connectionList == null || connectionList.Size () <= 0) {Connection Connection = getConnection (); ConnectionList.Add (Connection); } conne = connectionList.remove (0); CONN을 반환; }5. 객체 리턴 메소드 생성, 사용 된 연결을 연결 풀에 넣습니다.
public void backconnection (Connection Conn) {ConnectionList.Add (Conn); }좋아, 이것은 간단한 사용자 정의 연결 풀을 완성하고 테스트 코드는 다음과 같습니다.
public static void main (String [] args)은 sqlexception {mydatasource dataSource = new MyDatasource (); 연결 conn = dataSource.getConnection (); 문자열 sql = "사용자에서 u_id =?"; 준비된 상태 ps = null; resultSet rs = null; try {ps = conn.preparestatement (SQL); ps.setint (1, 1); rs = ps.ExecuteQuery (); while (rs.next ()) {system.out.println ( "id ="+rs.getint (1)); System.out.println ( "username ="+rs.getstring (2)); System.out.println ( "password ="+rs.getstring (3)); }} catch (sqlexception e) {e.printstacktrace (); } 마침내 {dataSource.backConnection (conn); }}무시하기 때문에 내 코드에 다른 두 객체가 없어야합니다.
이제 연결 풀 방법을 통해 결산 연결이 달성되는 작은 문제가 있습니다. 그러나 사용자가 연결 객체의 가까운 메소드를 호출하면 연결이 파괴되고 연결 풀로 되돌아 가지 않습니다. 그런 다음 사용자가 연결을 파괴하지 않고 연결을 반환하도록 최적화합니다.
그중에는 많은 솔루션이 있으며 여기에는 장식 모델이 있습니다.
최적화 :
1. 새 클래스 myConnection을 만듭니다. 연결 인터페이스를 구현하여 속성 유형이 Connection Conn 및 liis <connection>입니다.
비공개 연결 Conn; 비공개 목록 <connection> 풀; public myConnection (Connection Conn, List <connection> 풀) {this.conn = conn; this.pool = 수영장; }2. 그런 다음 인터페이스의 긴밀한 메소드를 구현하십시오
@override public void close ()는 sqlexception {system.out.println ( "Recycle Connection"); pool.add (conn); }3. 그런 다음 진술을 얻는 방법을 구현하십시오. 구현되지 않으면이 명령문을 얻을 때 널 포인터 오류가 발생합니다. 준비된 상태를 얻는 방법 만 구현합니다.
@override public propubledstatement reparestatement (String SQL)는 sqlexception {system.out.println ( "get state"); Conn.preparestatement (SQL)를 반환합니다. }4. 그런 다음 MyDatasource 클래스의 메소드 백 연결을 삭제하여 연결을 반환하고 다음과 같이 연결을 얻기위한 생성자와 메소드를 수정합니다.
public mydatasource2 () {for (int i = 0; i <5; i ++) {connection conn = getoneConnection (); myConnection myConn = 새로운 myConnection (Conn, ConnectionList); ConnectionList.Add (MyConn); }} @override public connection getConnection ()는 sqlexception {connection conn = null; if (connectionList == null || connectionList.Size () <= 0) {Connection Connection = getConnection (); myConnection myConn = 새로운 myConnection (Connection, ConnectionList); ConnectionList.Add (MyConn); } conne = connectionList.remove (0); CONN을 반환; }자, 사용자가 연결을 닫는 메소드를 직접 호출하여 연결을 파괴하지 않도록하고 연결 풀에 올바르게 반환합니다. 테스트 코드를 약간 수정하여 테스트 할 수 있습니다.
위의 기사는 내가 당신과 공유 한 전체 컨텐츠입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.