2013. 7. 30. 15:01

출처 : http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html


데이터 소스를 사용하는 간단한 예 : 

package com.sp.jakarta;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

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



public class SimplePOGOExample {

	public static void main(String[] args) throws Exception{
		PoolProperties p =new PoolProperties();
		p.setUrl("jdbc:mysql://localhost:3306/mysql");
		p.setDriverClassName("com.mysql.jdbc.Driver");
		p.setUsername("root");
		p.setPassword("1234");
		p.setJmxEnabled(true);
		p.setTestWhileIdle(false);
		p.setTestOnBorrow(true);
		p.setValidationInterval(30000);
		p.setTimeBetweenEvictionRunsMillis(30000);
		p.setMaxActive(100);
		p.setInitialSize(10);
		p.setMaxWait(10000);
		p.setRemoveAbandonedTimeout(60);
		p.setMinEvictableIdleTimeMillis(30000);
		p.setMaxIdle(10);
		p.setLogAbandoned(true);
		p.setRemoveAbandoned(true);
		p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState" +
							  "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
		DataSource dataSource = new DataSource();
		dataSource.setPoolProperties(p);
		
		Connection conn = null;
		try {
			conn = dataSource.getConnection();
			Statement st = conn.createStatement();
			ResultSet rs = st.executeQuery("select * from user");
			int cnt = 1;
			while (rs.next()){
				System.out.println((cnt++) + ". HOST:" + rs.getString("HOST") + 
						" User:" + rs.getString("User") + " Password:" + rs.getString("Password"));
			}
			rs.close();
			st.close();
		} finally {
			if(conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				}
		}
	}
}

JNDI조회를 위한 resource를 구성하는 방법(<br/> 제외)


          auth="Container"
          type="javax.sql.DataSource"          
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          testWhileIdle="true"
          testOnBorrow="true"
          testOnReturn="false"
          validationQuery="SELECT 1"
          validationInterval="30000"
          timeBetweenEvictionRunsMillis="30000"
          maxActive="100"
          minIdle="10"
          maxWait="10000"
          initialSize="10"
          removeAbandonedTimeout="60"
          removeAbandoned="true"
          logAbandoned="true"
          minEvictableIdleTimeMillis="30000"
          jmxEnabled="true"          
          jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;            
          org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
          username="root"
          password="password"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/mysql"/>


Asyncronous Connection Retrieval (비동기 연결 검색)


톰캣 JDBC pool connection은 라이브러리에 스레드를 추가하지 않고도 비동기 연결 검색을 지원한다.

이것은 추후의 <Connection> getConnectionAsync() </Connection>을 호출하여 데이터 소스에 메서드를 추가하는 작업을 수행한다.

이러한 비동기 검색을 사용하기 위해서는 두가지 조건이 충족되어야 한다.


fairQueue property를 true로 하고, org.apache.tomcat.jdbc.pool.DataSource 데이터 소스를 캐스팅 해야한다.


비동기 기능을 사용하는 예 : 


Connection con = null;
  try {
    Future future = datasource.getConnectionAsync();
    while (!future.isDone()) {
      System.out.println("Connection is not yet available. Do some background work");
      try {
        Thread.sleep(100); //simulate work
      }catch (InterruptedException x) {
        Thread.currentThread().interrupt();
      }
    }
    con = future.get(); //should return instantly
    Statement st = con.createStatement();
    ResultSet rs = st.executeQuery("select * from user");


'DBMS' 카테고리의 다른 글

Virtual Hosting and Tomcat (가상 호스팅과 톰캣) - (직역)  (0) 2013.07.30
JDBC Connection Pool  (1) 2013.07.30
Posted by 1+1은?