[Oracle]標準DB接続
close()の重要性
DB接続時に必ずしも()をオフにする必要がない場合は、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();
}
}
パフォーマンスの向上
データベースへの高速接続方法
パフォーマンス向上のため
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);
}
接続プール
Webコンテナ(WAS)の実行時に、データベースと予め接続が確立されているオブジェクトをpoolに格納し、クライアント要求時に接続を借用し、処理が完了したら接続に戻り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の欠点として,インスタンスの最初の実行時に例外を投げ出すと,処理が困難である.Reference
この問題について([Oracle]標準DB接続), 我々は、より多くの情報をここで見つけました https://velog.io/@mils333/Oracle-표준-DB-연결テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol