2. 기본 기능#
Altibase JDBC 드라이버를 사용해서 데이터베이스의 객체를 다루는 기본 방법은 JDBC 표준 인터페이스를 사용하는 방법과 다르지 않다.
이 장에서는 IPv6 주소를 사용해서 데이터베이스 서버에 접속하는 방법과 JDBC 응용 프로그램에서 사용할 수 있는 세 가지 Statement를 비교 설명한다.
IPv6 접속#
Altibase의 JDBC 드라이버는 JDBC URL에 IPv6 주소와 IPv6 주소로 바뀌어지는 호스트명의 사용을 지원한다.
개요#
URL에 IPv6 주소를 명시하려면, 사각 괄호 ("[ ]")로 주소를 에워싸야 한다. 예를 들어 localhost를 IP주소로 지정할 때, IPv4 주소 127.0.0.1를 쓸 때는 괄호를 사용하지 않는다. 반면 IPv6 주소 [::1]를 사용하려면 괄호를 반드시 사용해야 한다. IPv6 주소 표기법에 대한 자세한 설명은 Administrator's Manual을 참고하기 바란다.
전제 조건#
java.net.preferIPv4Stack#
IPv6 주소를 사용해서 접속하려면, 클라이언트 실행시 java.net.preferIPv4Stack 속성을 FALSE로 지정해야 한다.
이 속성을 TRUE로 지정하면, 클라이언트 응용프로그램은 IPv6 주소를 사용해서 데이터베이스 서버에 접속할 수 없다.
$ java -Djava.net.preferIPv4Stack=false sample [::1]
java.net.preferIPv6Addresses#
java.net.preferIPv6Addresses 속성은 TRUE 또는 FALSE 어느 것을 지정하여도 Altibase JDBC 드라이버에 아무런 영향을 주지 않는다.
PREFER_IPV6#
URL의 server_ip 속성에 호스트명을 입력하면, PREFER_IPV6 속성에 지정한 값에 따라 JDBC 드라이버가 호스트명을 IPv4 주소 또는 IPv6주소로 변환한다.
이 속성이 TRUE이고 server_ip프로퍼티에 호스트명이 입력되면, 클라이언트 응용프로그램은 먼저 호스트명을 IPv6주소로 바꾼다.
그러나 이 속성을 생략하거나 FALSE로 설정하면, 클라이언트 응용프로그램은 먼저 호스트명을 IPv4주소로 바꾼다.
클라이언트 응용프로그램이 처음 접속에 실패하면, 처음과 다른 버전의 IP 주소를 사용해서 접속을 다시 시도할 것이다.
사용법#
IPv6 포맷의 IP 주소의 경우 주소값 그대로 지정할 수 있다.
호스트명을 JDBC 드라이버가 IPv4 주소로 변환할지 IPv6주소로 변환할 것인지는 PREFER_IPV6 속성에 지정할 수 있다.
Properties sProps = new Properties();
...
sProps.put( "PREFER_IPV6", "FALSE");
위와 같이 PREFER_IPV6 속성을 FALSE로 지정하면, JDBC 드라이버는 호스트명을 IPv4 주소형으로 변환한다. 만약 PREFER_IPV6 속성이 TRUE이고 호스트명이 주어지면, 클라이언트 응용프로그램은 먼저 호스트명을 IPv6주소로 바꾼다.
이 속성을 생략하거나 FALSE로 설정하면, 클라이언트 응용프로그램은 먼저 호스트명을 IPv4주소로 바꾼다. JDBC드라이버의 기본 동작은 호스트명을 IPv4주소로 바꿔서 시도하는 것이다.
클라이언트 응용프로그램이 선호하는 버전의 IP주소를 사용해서 처음 접속에 실패하면, 다른 버전의 IP주소를 사용해서 접속을 재시도한다.
예제#
Connection sCon = null;
Properties sProps = new Properties();
sProps.put( "user", "SYS");
sProps.put( "password", "MANAGER");
sProps.put( "PREFER_IPV6", "FALSE");
String sURL = "jdbc:Altibase://localhost:20300/mydb";
Connection sCon = DriverManager.getConnection( sURL, sProps );
Statement, PreparedStatement 및 CallableStatement#
JDBC에는 직접 SQL 구문 실행 여부 또는 SQL문에 IN/OUT 파라미터 사용 여부에 따라 사용 가능한 명령문(Statement) 객체가 따로 존재한다. 아래는 각 Statement별 PREPARE 가능 여부와 입/출력 파라미터 사용 가능 여부를 표로 나타낸 것이다.
PREPARE | IN 파라미터 | OUT 파라미터 | |
---|---|---|---|
Statement | X | X | X |
PreparedStatement | O | O | X |
CallableStatement | O | O | O |
Statement#
Statement는 정적인 SQL문을 직접 수행할 때 주로 사용된다.
PreparedStatement#
PreparedStatement는 SQL구문을 먼저 준비(PREPARE)해 두고, 수행하고자 할 때 주로 사용된다. 같은 구문을 여러 번 수행할 때, Statement 대신 PreparedStatement를 사용하면 성능 향상을 기대할 수 있다.
Altibase JDBC 드라이버는 PreparedStatement 객체가 생성될 때 서버에서 구문을 PREPARE할 것을 지시한다. 이 때 서버가 PREPARE에 실패하면 에러를 반환하고, JDBC 드라이버는 예외를 던진다.
PreparedStatement의 경우 Statement와 달리 입력 파라미터를 사용할 수 있다. 파라미터는 SQL문 내에서 "?" 문자로 나타내며, setXXX() 메소드를 이용해서 값을 설정할 수 있다.
예제#
아래는 IN 파라미터와 함께 PreparedStatement를 사용하는 코드 예제이다.
PreparedStatement sPrepStmt = sConn.prepareCall("INSERT INTO t1 VALUES (?, ?)");
sPrepStmt.setInt(1, 1);
sPrepStmt.setString(2, "string-value");
sPrepStmt.execute();
sPrepStmt.close();
CallableStatement#
CallableStatement는 입력 또는 출력 파라미터를 함께 사용할 수 있다. CallableStatement는 저장 프로시저 또는 저장 함수 호출에 주로 사용된다.
예제#
아래는 입력 파라미터와 출력 파라미터를 함께 CallableStatement를 사용하는 코드 예제이다.
CallableStatement sCallStmt = connection().prepareCall("{call p1(?, ?)");
sCallStmt.setInt(1, 1);
sCallStmt.registerOutParameter(2, Types.VARCHAR);
sCallStmt.execute();
String sOutVal = sCallStmt.getString(2);
// todo something ...
sCallStmt.close();
내셔널 캐릭터 셋 사용#
여기에서는 JDBC에서 NCHAR 및 NVARCHAR 타입 같은 유니코드 타입에 내셔널 캐릭터 문자열을 사용하는 방법을 설명한다.
데이터 조회 및 변경#
JDBC를 이용하여 NCHAR, NVARCHAR 타입의 데이터를 조회 및 변경하는 방법은 CHAR, VARCHAR 타입과 동일하다. 즉 CHAR 타입에서 사용했던 getString, setString 등의 메소드를 그대로 사용하면 된다.
상수 문자열 사용#
SQL 구문에서 내셔널 캐릭터를 가지는 상수 문자열을 사용하는 방법은 다음과 같다.
-
서버와 연결할 때 NcharLiteralReplace 속성을 true로 설정한다.
-
내셔널 캐릭터의 문자열을 SQL 구문에서 상수 문자열로 사용하기 위해서는 해당 문자열 바로 앞에 'N'을 붙인다.
예제#
// create table t1 (c1 nvarchar(1000));
Properties sProps;
sProps.put( "user", "SYS");
sProps.put( "password", "MANAGER");
sProps.put( "NcharLiteralReplace", "true");
Connection sCon = DriverManager.getConnection( sURL, sProps );
Statement sStmt = sCon.createStatement();
sStmt.execute("insert into t1 values (N'AB가나')");
ResultSet sRS = sStmt.executeQuery( "select * from t1 where c1 like N'%가나%'");