[211217] 교육 47일차

oxllz·2022년 2월 19일
0

교육

목록 보기
32/41
DELIMITER $$
INSERT INTO temp14_T VALUES ( 1,'A' )$$

$$ 로 끝날때 해당 SQL 을 컴파일하고 실행한다.
프로시저를 만들때 프로시저 안에 ; 로 끝나는 문장이 들어가는데 이게 보이면 컴파일 & 실행을 하기에 ; 이 보여도 컴파일 하지 않도록 미리 바꾸어 놓아야 한다.

FUNCTION

프로시저와 유사하지만 활용도가 적은 개념으로 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 으로 설정되어 있다.


DataSource & BasicDataSource

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 을 확보하고 있다가 - 대여하고 - 반납받고 - 대여한다. ( 끊지 않는 상황에서 반납받는 것이 키 포인트 ) 연결을 끊고 다시 만드는 오버헤드가 없어진다.

0개의 댓글