6. API-JDBC 사용법
6.1. 개요
6.1.1. JDBC버전
IRIS 2.1에서 사용되는 JDBC는 버전은 mobigen-iris-jdbc-2.1.0.2.jar파일이며, 다른 버전에서 사용중인 JDBC와는 호환이 안될 수 있습니다.
6.1.2. 필요 파일
IRIS JDBC를 사용하기 위해서 다음 jar 파일이 제공 됩니다.
mobigen-iris-jdbc-2.1.0.2.jar 다운로드
이 jar 파일을 java의 class path 에 설정하여 사용하시면 됩니다.
6.1.3. 지원 쿼리
JDBC에서 지원하는 쿼리의 종류는 다음과 같습니다. - CREATE TABLE - CREATE INDEX - INSERT - UPDATE - DELETE - LOAD - SELECT - DROP INDEX - DROP TABLE
6.2. 기본 사용법
이 장에서는 쿼리를 사용하기 위해 JDBC를 이용한 IRIS의 접속 방법 및 예제 코드를 설명 합니다.
6.2.1. 기본 구조
String url = "jdbc:iris://{master_node_ip}:5050/{database_name}";
Properties info = /* 계정정보 입력 */;
try {
Class.forName("com.mobigen.iris.jdbc.IRISDriver");
} catch (java.lang.ClassNotFoundException e) {
e.printStackTrace();
return;
}
Connection conn = null;
try {
conn = DriverManager.getConnection(url, info);
Statement stmt = conn.createStatement();
boolean rs = stmt.execute();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
- Class.forName(“com.mobigen.iris.jdbc.IRISDriver”);
IRIS JDBC를 사용하기 위해 동적으로 클래스를 로딩합니다.
- DriverManager.getConnection(url, info);
IRIS에 접속하기 위해 host및 계정정보를 입력합니다.
계정정보는 다음과 같이 두가 지 방식으로 입력이 가능합니다.
getConnection(String url, Properties info): Connection - DriverManager
getConnection(String url, String user, String password): Connection - DriverManager
- Properties 클래스를 이용하는 방법
Properties info = new Properties(); info.setProperty("user", "test"); info.setProperty("password", "test"); info.setProperty("direct", "false"); DriverManager.getConnection("jdbc:iris://master_ip:port/database_name", info);
- 직접 입력하는 방법(direct접속은 불가능)
DriverManager.getConnection("jdbc:iris://master_ip:port/database_name", "id", "passwd");
6.2.2. MASTER_IP
IP는 IRIS의 Master IP를 의미한다.
6.2.3. PORT
IRIS에서 사용하는 Port는 일반 접속, Direct접속에 따라 다르게 설정을 해야 하며, 기본적인 Port는 다음과 같다.
- 일반 접속
5050: 일반 접속을 사용할 경우에 사용하는 Port
- Direct접속
5000 : Direct접속을 사용할 경우에 사용되는 Port
Direct접속을 시도할 경우에는setProperty(“direct”, “true”)를 꼭 사용해야 한다.
6.2.4. database name
접속하고자 하는 database name을 설정합니다.
6.3. 예제코드
이 장에서는 예제코드를 이용하여 JDBC 사용법을 설명합니다. 모든 쿼리들은 Exception이 발생하지 않을 경우 성공으로 간주합니다.
6.3.1. CREATE[table,index]/UPDATE/INSERT/DELETE/DROP[table,index]
Connection conn = null;
try {
conn = DriverManager.getConnection(url, info);
Statement stmt = conn.createStatement();
boolean rs = stmt.execute("QUERY");
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
6.3.2. INSERT
Insert 쿼리의 경우에는 위에서 사용한 createStatement를 이용하는 방법과 PreparedStatement를 이용하는 방법이 존재 합니다.
- createStatement
Connection conn = null; try { conn = DriverManager.getConnection(url, info); Statement stmt = conn.createStatement(); boolean rs = stmt.execute("QUERY"); stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); }
- PreparedStatement
Connection conn = null; try { conn = DriverManager.getConnection(url, info); PreparedStatement pstmt; pstmt = conn.prepareStatement( "INSERT INTO table (k, p, a) VALUES (?, ?, ?);" ); pstmt.setString(1, "1"); pstmt.setString(2, "20110616000000"); pstmt.setString(3, "aaaa"); conn.close(); } catch (SQLException e) { e.printStackTrace(); }
6.3.3. SELECT
Select 쿼리의 경우에는 위에서 사용한 createStatement를 이용하는 방법과 PreparedStatement를 이용하는 방법이 존재 합니다.
- CreateStatement
try { conn = DriverManager.getConnection(url, info); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "select k, p, a from table;" ); for( int i = 1 ; i <= rs.getRow() ; i++ ) { rs.next(); System.out.println( rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3) ); } rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); }
- PreparedStatement
try { conn = DriverManager.getConnection(url, info); PreparedStatement pstmt; pstmt = conn.prepareStatement( "select k, p, a from table where k = ?;" ); pstmt.setString(1, "k2"); ResultSet rs = pstmt.executeQuery(); for( int i = 1 ; i <= rs.getRow() ; i++ ) { rs.next(); System.out.println( rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3) ); } rs.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); }
6.3.4. LOAD
LOAD에 성공할 경우
+OK SUCCESS. success count : 4
와 같은 결과를 얻을 수 있습니다.
이 경우 마지막 4의 의미는 4개의 Record가 Load되었다는 의미 입니다.
Connection conn = null;
try {
conn = DriverManager.getConnection(url, info);
IRISStatement stmt = (IRISStatement)conn.createStatement();
stmt.SetFieldSep(",");
stmt.SetRecordSep("\n");
String table = "LOCAL_TEST_TABLE_JDBC";
String key = "K";
String partition = "20140101000000";
String control_file_path = "LOCAL_TEST_TABLE.ctl";
String data_file_path = "LOCAL_TEST_TABLE.dat";
String result = stmt.Load(
table,
key,
partition,
control_file_path,
data_file_path
);
System.out.println(result);
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
6.4. IRIS Query
IRIS에서는 기본적인 ANSI SQL의 거의 동일하게 지원을 하지만, CREATE TABLE의 경우에는 IRIS에서 사용하는 옵션을 추가로 적어 주어야 합니다.
6.4.1. CREATE TABLE
CREATE TABLE {table_name} (
{colnum_name} {type},
{colnum_name} {type},
{colnum_name} {type},
…
{colnum_name} {type}
)
datascope [ LOCAL | GLOBAL ]
ramexpire [ n > 0 | 0 ]
diskexpire [ n > 0 | 0 ]
partitionkey [ key_column_name | NONE ]
partitiondate [ part_column_name | NONE ]
partitiondate [ n > 0 | 0 ]
;
6.5. 주의사항
모든 JDBC의 Connection은 쿼리가 종료 후 재접속 해야 합니다.
즉, 두개의 쿼리를 실행할 경우 첫번째 쿼리의 결과를 얻은 후 Connection을 종료후, Connection을 재 접속 후 두번째 쿼리를 실행해야 합니다.
JDBC상에서 쿼리실행도중 에러가 발생할 경우 당시에 사용된 Connection은 강제로 종료가 됩니다. 따라서, 에러가 발생할 경우 재 접속을 해주어야 합니다.