SQL_기초 공부

[Oracle] 표준 DB 연결

메타듀 2023. 2. 20. 11:31
728x90
반응형

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. 한국어 확인을 위해
반응형

'SQL_기초 공부' 카테고리의 다른 글

SQL에서 중복 쿼리를 제거 하는 방법  (0) 2023.03.08
[sql] 데이터 모델링의 이해  (0) 2023.02.21
[sql] sql문 종류/작성  (0) 2023.02.21
[sql] Group By 에 대해  (0) 2023.02.15