2009-11-10 2 views
7

데이터베이스에 관계없이 데이터베이스에 연결 풀을 만드는 데 필요한 정보와 그 효율성은 무엇입니까? 성능을 향상시킬 수있는 조건은 무엇입니까?데이터베이스 연결 풀 만들기

명시 적으로 만드는 방법은 무엇입니까?

답변

3

Apache DBCP에 대한 소개 페이지가 멋지게 그것을 요약 :

데이터베이스를 수행하기 위해, 시간이 소요 (종종 시계 시간의 여러 초를 요구)를 될 수있는 각 사용자에 대한 새 연결 만들기 트랜잭션이 밀리 초가 걸릴 수 있습니다. 사용자 당 연결을 열면 공개적으로 호스팅되는 인터넷 응용 프로그램 의 수가 매우 클 수있는 공용 인터넷 응용 프로그램에서 실행할 수 없습니다. 따라서 개발자는 응용 프로그램의 현재 사용자 중 사이에 열린 연결의 "풀"을 개 공유하고 싶어합니다. 실제로 주어진 시간 에 요청을 수행하는 사용자의 수는 일반적으로 데이터베이스 연결 요구 인지 만 시간 요청을 처리하는 동안 매우 작은 비율 활성 사용자의 수 및 이다. 응용 프로그램 자체는 을 DBMS에 기록하고 모든 사용자 계정 문제를 내부적으로 처리합니다.

얼마나 효율적입니까? 구현에 따라 다릅니다. 일반적으로 시작 또는 요청시 연결 풀을 인스턴스화 할 것으로 예상됩니다. 첫 번째 연결에는 데이터베이스에 대한 실제 연결이 필요하며 연결을 요청하면 풀링 된 연결이 제공됩니다. 그래서 첫 번째 연결 요청은 가장 많은 시간이 걸릴 것이고, 이후에는 콜렉션에서 객체를 가져 오는 것입니다 (매우 빠름).

+1

에서

public class MyConnectionFactory { private static String module = "[ QuoteConnectionFactory ]"; private static QuoteConnectionFactory connectionFactory; protected QuoteConnectionFactory() { } /** * * @return=>getInstance() is a static method which will return the instance * of its own class */ public static QuoteConnectionFactory getInstance() { if (connectionFactory == null) connectionFactory = new QuoteConnectionFactory(); return connectionFactory; } /** * * @param jndiName */ public Connection getConnection(String jndiName) { System.out.println("jndiName=======" + jndiName); Connection conn = null; InitialContext cxt = null; DataSource dataSource = null; try { cxt = new InitialContext(); Context envContext = (Context)cxt.lookup("java:/comp/env"); dataSource = (DataSource)envContext.lookup(jndiName); } catch (NamingException e) { } catch (Exception e) { } if (dataSource == null) { try { conn = dataSource.getConnection(); } catch (Exception e) { } System.out.println("connection===================" + conn); return conn; } } 

3. 편집 web.xml 파일

<resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/jndiName</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> 

4.

이후를 생성하는 클래스를 생성 Sachin은 구체적으로 풀이 성능을 처리 할 수있는 곳을 물었고 일반적으로 cli에서만 의미가 있다고 덧붙였습니다. 엔트 - 서버 응용 프로그램으로 사용자보다 연결 수가 적습니다. 특히 하나의 사용자가 데이터베이스에 연결되어있는 두꺼운 클라이언트 응용 프로그램에서는 의미가 없습니다. –

1

데이터베이스에 대한 연결을 만드는 것은 매우 비용이 많이 드는 작업입니다. 연결 풀은 작성되고 캐시 된 데이터베이스 연결의 인스턴스입니다. 데이터베이스에 대한 새 연결이 필요할 때마다 새 연결을 만드는 대신 풀의 연결이 사용됩니다. .NET + SQL Server와 같은 일부 플랫폼은 기본적으로 연결 풀을 사용합니다 (직접 만들 필요는 없습니다). 따라서 기본적으로 새 연결을 만들 때 시간을 절약하여 성능을 향상시킵니다.

1

연결 풀을 사용하면 연결이 이미 설정되어 있으므로 모든 액세스 시간을 절약 할 수 있습니다.

또한 오라클에서는 컴파일 된 문을 연결에 연결하여 동일한 SQL 문을 반복적으로 실행하는 것이 훨씬 빠릅니다.

당신이 당신의 수영장에서 너무 많은 유휴 연결, 관련 능숙 (귀하의 측면과 데이터베이스)를 지킬 때

카운터 성능의 유일한 위험이 (자바/JDBC에있는 경우의 PreparedStatement 참조)

낭비된다 .

+0

연결은 또한 서버의 리소스 (스레드, 버퍼)를 잠그는 것을 명심하십시오. 그리고 설정된 연결은 항상 특정 사용자/암호 쌍을 통해 인증됩니다. 따라서 연결 풀링 만 작동하는 경우 모든 연결에서 동일한 데이터베이스 계정을 사용할 때 –

+0

예, 고유 한 데이터베이스 계정 문제는 완전히 맞습니다. (예 : C/S 응용 프로그램에서 웹으로 마이그레이션 할 때 권한이 DB에있는 경우 연결된 사용자를 기준으로 문제가 될 수 있습니다.) – Fouteier

0

데이터베이스 연결을 만드는 것은 환경 및 사용자가 수행하려는 작업에 따라 값 비싼 작업 일 수도 있고 아닐 수도 있습니다.

매우 간단한 단일 쿼리를 실행하려는 경우 연결에 쿼리보다 오래 걸리는 것이 좋습니다.

일부 데이터베이스는 다른 데이터베이스보다 연결 오버 헤드가 훨씬 큽니다. 정확하게 튜닝을했다면, mysql은 TCP 연결을 만들고 프로토콜 핸드 셰이크를 할 시간보다 약간의 시간을 가져야한다. 그러나 서버 대기 시간이 매우 길면이 작업도 상당히 중요 할 수 있습니다 (특히 몇 가지 쿼리 만 수행하려는 경우).

예를 들어 100 개의 쿼리 또는 몇 가지 매우 느린 쿼리를 수행하려는 경우 연결 시간이 중요하지 않게 사라집니다.

일반적으로 나는 실제 성능 문제임을 입증 할 수있을 때까지 매번 새로운 연결을 열어 보겠습니다. 연결 풀링을 사용하면 우리가 좋아하지 않는 버그로 이어질 수 있습니다

  • 연결 상태가 완전히 풀의 이전 사용 후 초기화되지 않았습니다 - 그래서 일부 국가는 남아와 버그의 결과로 예기치 않은 동작을 생성
  • 연결이 감지 할 수없는 (아마도 상태 저장 방화벽 시간 제한에 의해) 어떤 방법으로 폐쇄되었다, 따라서 응용 프로그램은
+0

웹 환경의 경우 실제로 연결을 원하지 않습니다 풀에서 또는 다른 방법으로) 쿼리를 시작할 때 100 초 동안 쿼리를 수행 한 다음 닫습니다. 이는 효과적으로 데이터베이스 연결에 제한적인 리소스 인 연결을 잠그기 때문에 웹 사이트에서 지원할 수있는 사용자 수가 제한됩니다. 풀에서 가져오고, 사용하고, 풀에 넣는 것이 훨씬 좋습니다 (많은 시간이 소요되는 코드보다 먼저). 연결 풀을 지원하는 것이 몇 줄의 코드 (한 번만 데이터 원본 관리자 유틸리티 클래스에만 있음)를 고려하면이를 사용하지 않아도됩니다. – JeeBee

1

이 BoneCP에서보세요 긴 지연 또는 실패의 원인이 닫힌 연결을 사용하도록 (http://jolbox.com를) 시도 일부 숫자에 대한 벤치 마크 섹션. preparedStatements 등은 연결에 연결되어 있으므로 연결을 직접 처리하는 경우 다시 준비해야합니다 (연결 풀이 사용자를 위해 캐시됩니다).

내 최고의 솔루션을 지금까지 : 단지 당신이 정말 필요 연결을 제공하는 lazyDataSource를 사용 (예 : 맹목적 - 데이터는 데이터베이스 히트를 방지 할 수있는 캐시에서 올 수있는 경우)

6

귀하 질문이 약간 모호합니다.

homegrow 연결 풀 구현을 원하십니까? 그렇다면 이것은 좋은 출발점입니다 : http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html그러나 이것은 실제 환경에서는 권장하지 않습니다. DBCP 또는 C3P0과 같이 기존에 철저히 테스트 된 연결 풀링 API를 사용하는 것이 좋습니다.

또는 사용 방법을 알고 싶으신 분 연결 풀을 사용 하시겠습니까? 그렇다면 대답은 사용중인 연결 풀링 API에 따라 다릅니다. 다행스럽게도 일반적으로 문제의 API 웹 사이트에서 사용할 수 있습니다.

또는에 연결 풀을 사용하려면/을 알고 싶습니까? 그렇다면 수명이 긴 응용 프로그램 (예 : 웹 응용 프로그램)을 사용하고 데이터베이스를 자주 연결해야하는 경우 연결 성능이 향상됩니다. 정상적인 JDBC 실습은 즉 을 획득하면 , StatementResultSet가장 가까운 가능한 범위 (즉 매우 동일한 메소드 블록 내부)에 닫습니다. 연결은 상당히 비싸며 200 밀리 초 이상의 시간이 걸릴 수 있으므로 연결 풀을 사용하는 것이 훨씬 빠릅니다. 그것은 요구에 따라 연결을 제공하고 실제로 연결을 닫는 데주의를 기울입니다. 그렇다고해서 JDBC를 작성하는 방식을 바꿀 수도 있다는 의미는 아니지만 가능한 가장 좁은 범위에서 JDBC를 획득하고 종료해야합니다. 변경할 필요가있는 것은 연결을 얻는 방법뿐입니다. 예 :

connection = driverManager.getConnection(); 

에서

connection = connectionPool.getConnection(); 

더 이상 변경 한 당신의 JDBC 코드가 잘 기록 된대로 필요로 변경합니다.

1

바람둥이을 사용하여 데이터베이스 연결 풀 만들기

1. 톰캣 내부 자원 입력 :

<!-- jdbc/jndiName jndi --> 
<Resource name="jdbc/jndiName" auth="Container" type="javax.sql.DataSource" initialSize="1" maxActive="100" maxIdle="30" maxWait="10000" username="enter username" password="enter password" driverClassName="diver name" url="jdbc database url"/> 
: conf의/context.xml에

가의 context.xml 파일에 리소스 항목을 넣어


2. 연결 풀 코드

Connection con= QuoteConnectionFactory.getInstance(). getConnection("jndiName");