DELIMITER $$
INSERT INTO temp14_T VALUES ( 1,'A' )$$
$$
로 끝날때 해당 SQL 을 컴파일하고 실행한다.
프로시저를 만들때 프로시저 안에 ;
로 끝나는 문장이 들어가는데 이게 보이면 컴파일 & 실행
을 하기에 ;
이 보여도 컴파일 하지 않도록 미리 바꾸어 놓아야 한다.
프로시저와 유사하지만 활용도가 적은 개념으로 FUNCTION 이 있다.
FUNCTION 선언
DELIMITER // CREATE FUNCTION func_apple() RETURNS INT BEGIN RETURN 100; END; // DELIMITER ;
FUNCTION 호출 ( 주로 SELECT절에서 호출 )
SELECT func_apple();
테이블 생성
CREATE TABLE temp16_T ( data INT ); INSERT INTO temp16_T VALUES ( 100 ); INSERT INTO temp16_T VALUES ( 200 ); INSERT INTO temp16_T VALUES ( 300 );
func_apple2 가 존재한다면 삭제
DROP FUNCTION IF EXISTS func_apple2;
func_apple2 선언
DELIMITER // CREATE FUNCTION func_apple2( v_data INT ) RETURNS INT BEGIN IF v_data <= 100 THEN RETURN 1; ELSEIF v_data <= 200 THEN RETURN 3; ELSE RETURN 7; END IF; END; // DELIMITER ;
func_apple2 실행
SELECT func_apple2( data ) , data FROM temp16_T;
+---------------------+------+ | func_apple2( data ) | data | +---------------------+------+ | 1 | 100 | | 3 | 200 | | 7 | 300 | +---------------------+------+
DROP FUNCTION IF EXISTS func_apple2;
DELIMITER // CREATE FUNCTION func_apple2( v_data INT ) RETURNS INT DETERMINISTIC BEGIN IF v_data <= 100 THEN RETURN 1; ELSEIF v_data <= 200 THEN RETURN 3; ELSE RETURN 7; END IF; END; // DELIMITER ;
동일한 입력 발생
SELECT func_apple( 100 ); -> 1 SELECT func_apple( 100 ); -> SELECT 1 SELECT func_apple( 100 ); -> SELECT 1
RETURNS INT DETERMINISTIC
: 동일한 입력이 일어났을때 함수를 호출하지 않고 결과를 재사용한다. 속도를 빠르게 하기 위해서 특정 입력에 대한 결과를 저장했다가 재활용하도록 지시하는 문장. 기본적으로는 매번 함수를 호출하는 NOT DETERMINISTIC
으로 설정되어 있다.
BasicDataSource(Connection Pool)
: 한번 연결되면 끊지 않고 연결된 Connection 보유, 다른 사람이 빌려달라고 하면 빌려주는 개념
public class Test312 { public static void main(String[] args) throws Exception { BasicDataSource dbcp = new BasicDataSource(); dbcp.setDriverClassName("org.mariadb.jdbc.Driver"); dbcp.setUrl("jdbc:mariadb://..."); dbcp.setUsername("..."); dbcp.setPassword("..."); // DataSource 는 BasicDataSource 의 부모 클래스 DataSource ds = dbcp; Connection old = null; for( int i = 0 ; i < 10 ; i++ ) { Connection conn = ds.getConnection(); System.out.println( conn.getClass().getName() ); // 한 꺼풀 씌운 형태 // Connection 이 재활용되고 있다는 증거 Connection conn2 = conn.unwrap( MariaDbConnection.class ); // 알맹이 꺼냈다. System.out.println( old == conn2 ); // true old = conn2; conn.close(); } dbcp.close(); } }
java 에서 정하길 모든 Connection Pool
은 반드시 DataSouce
라는 인터페이스를 상속하여 만든다. DataSouce 는 getConnection
함수로 DB에 대한 Connection 을 제공한다.
이렇게 제공된 Connection 의 close() 는 소켓을 끊는게 아니라 재사용을 위해 적재되는 것을 의미한다.
Connection Pool
은 미리 연결된 Connection 을 확보하고 있다가 - 대여하고 - 반납받고 - 대여한다. ( 끊지 않는 상황에서 반납받는 것이 키 포인트 ) 연결을 끊고 다시 만드는 오버헤드가 없어진다.