[Oracle] 표준 DB 연결
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 작업은 항상 현재 시간 부터 체크 해본다!
- 연결 확인을 위해
- 데이터 베이스가 외국에 있을 경우 표준시간이 차이가 나기 때문에
- 한국어 확인을 위해
Author And Source
이 문제에 관하여([Oracle] 표준 DB 연결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mils333/Oracle-표준-DB-연결저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)