[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の欠点として,インスタンスの最初の実行時に例外を投げ出すと,処理が困難である.
  • DBの仕事はいつも今からチェック!
  • 接続チェック
  • データベースは海外での標準時間に差があるため、
  • 韓国語確認