2010-03-01 5 views
12

MysqlConnectionPoolDataSource() 개체를 사용하고 있으므로 Java와 풀링 된 연결을 사용하고 싶습니다 (스레드 당 하나의 연결을 만드는 것이 비용이 많이 들기 때문에). 나는 스레드를 통해 내 데이터 소스를 유지합니다. 그래서, 난 단지 같은 응용 프로그램 전체에서 하나의 데이터 소스를 사용하고 있습니다 :Java PooledConnections를 올바르게 사용하고 있습니까?

PooledConnection connect = dataSource.getPooledConnection(); 
    Connection sqlConnection = connect.getConnection(); 

    Statement state = sqlConnection.createStatement(); 

    ResultSet result = state.executeQuery("select * from someTable"); 
    // Continue processing results 

것 같아요 : 지금은 내 데이터 소스가 만든 것을

startRegistry(); // creates an RMI registry for MySQL 
    MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource(); 
    dataSource.setUser("username"); 
    dataSource.setPassword("password"); 
    dataSource.setServerName("serverIP"); 
    dataSource.setPort(3306); 
    dataSource.setDatabaseName("dbname"); 

    InitialContext context = createContext(); // Creates a context 
    context.rebind("MySQLDS", dataSource); 

, I는 각각 별도의 스레드에서 다음을하고 있어요 내가 혼동스러워하는 것은 dataSource.getPooledConnection();의 전화 번호입니다.
정말 풀링 된 연결을 가져 오나요? 그리고이 스레드는 안전합니까? PooledConnection에 notify() 및 wait()와 같은 메서드가 있다는 것을 알았습니다. 내가 생각하는대로 수행하고 있다고 생각하지 않는다는 것을 의미합니다.

또한 어떻게해야합니까? 연결?

나는 내 자신을 굴리는 것이 더 유익한 지 궁금해 지지만 모든 것에 익숙해지기 때문에이 경우 휠을 재발 명하고 싶지는 않습니다. :)

감사합니다.

+0

모든 Java 클래스는 java.lang.Object에서 상속되므로 알림 및 대기를 갖습니다. 그것들을 실제로 사용하는 것은 매우 드뭅니다. –

+0

그래, 내가 자바 롤백에 조금 익숙해 ... 나는 그것에게 소용돌이를주고있다. – Polaris878

+0

다음은 Apache DBCP의 예제이다 : http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/ doc/PoolingDataSourceExample.java?view = co –

답변

15

이것은 올바른 방법이 아닙니다. 데이터 소스는 응용 프로그램을 실행중인 컨테이너에 의해 관리되어야합니다. MysqlConnectionPoolDataSource이 아니고 연결 풀입니다. 이것은 javax.sql.DataSource 인터페이스의 단순한 구현입니다. 일반적으로 JNDI 컨텍스트에서 정의하고 거기에서 가져옵니다. 또한 MySQL 자체는 모두 명시 적으로 their documentation에 명시되어 있습니다.

이제 사용 방법은 응용 프로그램의 용도에 따라 다릅니다. 웹 응용 프로그램 인 경우 해당 servletcontainer/appserver의 JNDI 자원 설명서를 참조해야합니다. 예를 들어 Tomcat 인 경우 here을 찾을 수 있습니다. 클라이언트 응용 프로그램을 실행중인 경우 (연결 풀의 가치에 대해 매우 의문 스러울 것입니다), 다음과 같이 MySQL이 제공하는 연결 풀링 된 데이터 소스를 사용할 수있는 연결 풀링 프레임 워크를 찾아야합니다. C3P0.

당신이 게시 된 코드와 다른 문제는 PooledConnection#getConnection() 따라서 하지 풀링 된 연결입니다 기본 연결을 반환 할 것입니다. close를 호출하면 연결은 풀로 반환되지 않지만 실제로 닫습니다. 풀은 매번 새로운 연결을 만들어야합니다.

그런 다음 스레드 안전 스토리는 실제 연결 풀링 프레임 워크에 따라 달라집니다. 당신이 즉 는 JDBC 인터페이스를 사용하고 가까운 모든 자원 (Connection, StatementResultSet)를 을 획득, 표준 관용구를 따라 JDBC 코드를 작성할 때 C3P0는 년 만에 견고 함을 입증했다, 당신은 오랫동안 그것에 대해 걱정하지 마십시오 가능한 가장 짧은 범위에서.

+0

RESTlet 독립 실행 형 응용 프로그램 ... 응용 프로그램 서버가 없으므로 JNDI – Polaris878

+0

C3P0을 사용하십시오. – BalusC

+0

C3P0은 PooledConnection을 작업에 사용하면 클래스 파일 하나에 들어갈 수있는 무언가에 꽤 큰 도구입니다. – Trejkaz

관련 문제