[Oracle] 표준 DB 연결

3981 단어 dbdb

close()의 중요성

DB 연결 시 close()를 반드시 해주지 않으면 많은 사람이 DB를 연결할 경우 에러가 날 수 있다.

혼자 공부를 할 때는 쉽게 에러가 나지 않아, 문제점을 알기 쉽지 않음

이 문제를 확인 하기 위한 예제)

public static void main(String[] args) throws Exception {
        System.out.println("Test..........................");
        Class.forName("oracle.jdbc.driver.OracleDriver");
        String url = "jdbc:oracle:thin:@192.168.0.0:1521:XE";

        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                try {
                    Connection con = DriverManager.getConnection(url,"user","password");
                    System.out.println(con);

                    //con.close(); -> close 없이 돌렸을 때 문제 확인
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }

성능 향상

DB가 빠르게 연결 되기 위한 방법
성능 향상을 위해
Hikaricp 라이브러리를 이용한다.

확인용 예제)

public static void main(String[] args) throws  Exception {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:oracle:thin:@192.168.0.0:1521:XE");
        config.setUsername("user");
        config.setPassword("password");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

        HikariDataSource ds = new HikariDataSource(config);

        long start = System.currentTimeMillis();

        for (int i = 0; i < 100; i++) {
            try {
                Connection con = ds.getConnection();
                System.out.println(i+": "+con);

                PreparedStatement pstmt = con.prepareStatement("select sysdate from dual");
                ResultSet resultSet = pstmt.executeQuery();
                resultSet.next();
                System.out.println(resultSet.getString(1));

                resultSet.close();
                pstmt.close();
                con.close();

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }//end for

        long end = System.currentTimeMillis();

        System.out.println(end-start);

    }

커넥션 풀(Connection pool)

웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection(연결)을 해놓은 객체들을 pool에 저장해두었다가 클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 반납받아 pool에 저장하는 방식

enum을 사용한 예제)

public enum TimeDAO {
	INSTANCE;  //객체를 여러개 만들지 않는다 - > 스프링 프레임 워크가 하는 일!
	public String getTime() throws Exception {
		@Cleanup Connection con = ConnectionUtil.INSTANCE.getConnection();
		@Cleanup PreparedStatement pstmt = con.prepareStatement("select sysdate from dual");
		@Cleanup ResultSet rs = pstmt.executeQuery();
		rs.next();
		return rs.getNString(1);
	}
}
public enum ConnectionUtil {
	INSTANCE;
	private HikariDataSource dataSource;
	ConnectionUtil() {
		try {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		HikariConfig config = new HikariConfig();
		config.setJdbcUrl("jdbc:oracle:thin:@192.168.0.4:1521:XE");
		config.setUsername("teamspring");
		config.setPassword("teamspring");
		config.addDataSourceProperty("cachePrepStmts", "true");
		config.addDataSourceProperty("prepStmtCacheSize", "250");
		config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
		dataSource = new HikariDataSource(config);
	}
		public Connection getConnection() throws Exception {
		return dataSource.getConnection();
	}
}

enum의 단점으로 처음에 instance할 때 예외를 던지면 그거에 대한 처리가 힘들어진다.

  • DB 작업은 항상 현재 시간 부터 체크 해본다!
  1. 연결 확인을 위해
  2. 데이터 베이스가 외국에 있을 경우 표준시간이 차이가 나기 때문에
  3. 한국어 확인을 위해

좋은 웹페이지 즐겨찾기