:meta-keywords: cubrid jdbc driver, cubrid jdbc api, jdbc programming, jdbc sample :meta-description: CUBRID JDBC driver (cubrid_jdbc.jar) implements an interface to enable access from applications in Java to CUBRID database server. ************* JDBC 드ë¼ì´ë²„ ************* .. _jdbc-overview: JDBC 개요 ========= CUBRID JDBC 드ë¼ì´ë²„(cubrid_jdbc.jar)를 사용하면 Java로 ìž‘ì„±ëœ ì‘ìš© 프로그램ì—서 CUBRID ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†í• 수 있다. CUBRID JDBC 드ë¼ì´ë²„는 <*CUBRID 설치 ë””ë ‰í„°ë¦¬*> **/jdbc** ë””ë ‰í„°ë¦¬ì— ìœ„ì¹˜í•œë‹¤. CUBRID JDBC 드ë¼ì´ë²„는 JDBC 2.0 ìŠ¤íŽ™ì„ ê¸°ì¤€ìœ¼ë¡œ 개발ë˜ì—ˆìœ¼ë©°, JDK 1.6ì—서 컴파ì¼í•œ ê²ƒì„ ê¸°ë³¸ìœ¼ë¡œ ì œê³µí•œë‹¤. .. FIXME: 별ë„로 JDBC 드ë¼ì´ë²„를 다운로드하거나 JDBC 드ë¼ì´ë²„ì— ëŒ€í•œ ìµœì‹ ì •ë³´ë¥¼ 확ì¸í•˜ë ¤ë©´ http://www.cubrid.org/wiki_apis/entry/cubrid-jdbc-driver\ ì— ì ‘ì†í•œë‹¤. **CUBRID JDBC 드ë¼ì´ë²„ ë²„ì „ 확ì¸** JDBC 드ë¼ì´ë²„ ë²„ì „ì€ ë‹¤ìŒê³¼ ê°™ì€ ë°©ë²•ìœ¼ë¡œ 확ì¸í• 수 있다. :: % jar -tf cubrid_jdbc.jar META-INF/ META-INF/MANIFEST.MF cubrid/ cubrid/jdbc/ cubrid/jdbc/driver/ cubrid/jdbc/jci/ cubrid/sql/ cubrid/jdbc/driver/CUBRIDBlob.class ... CUBRID-JDBC-11.2.0.0035 **CUBRID JDBC 드ë¼ì´ë²„ 등ë¡** JDBC 드ë¼ì´ë²„ 등ë¡ì€ **Class.forName** (*driver-class-name*) 메서드를 사용하며, 아래는 CUBRID JDBC 드ë¼ì´ë²„를 등ë¡í•˜ê¸° 위해 cubrid.jdbc.driver.CUBRIDDriver í´ëž˜ìŠ¤ë¥¼ 로드하는 ì˜ˆì œì´ë‹¤. .. code-block:: java import java.sql.*; import cubrid.jdbc.driver.*; public class LoadDriver { public static void main(String[] Args) { try { Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); } catch (Exception e) { System.err.println("Unable to load driver."); e.printStackTrace(); } ... JDBC 설치 ë° ì„¤ì • ================= **기본 환경** * JDK 1.6 ì´ìƒ * CUBRID 2008 R2.0(8.2.0) ì´ìƒ * CUBRID JDBC 드ë¼ì´ë²„ 2008 R1.0 ì´ìƒ **Java 설치 ë° í™˜ê²½ 변수 ì„¤ì •** ì‹œìŠ¤í…œì— Javaê°€ 설치ë˜ì–´ ìžˆê³ **JAVA_HOME** 환경 변수가 등ë¡ë˜ì–´ 있어야 한다. Java는 Developer Resources for Java Technology 사ì´íЏ( https://www.oracle.com/java/technologies/ )ì—서 ë‹¤ìš´ë¡œë“œí• ìˆ˜ 있다. **Windows 환경ì—서 환경 변수 ì„¤ì •** Java 설치 후 [ë‚´ 컴퓨터]를 마우스 오른쪽 버튼 í´ë¦í•˜ì—¬ [ì†ì„±]ì„ ì„ íƒí•˜ë©´ [시스템 ë“±ë¡ ì •ë³´] 대화 ìƒìžê°€ 나타난다. [ê³ ê¸‰] íƒì˜ [환경 변수]를 í´ë¦í•˜ë©´ 나타나는 [환경 변수] 대화 ìƒìžê°€ 나타난다. [시스템 변수]ì—서 [새로 만들기]를 ì„ íƒí•œë‹¤. [변수 ì´ë¦„]ì— **JAVA_HOME** ì„ ìž…ë ¥í•˜ê³ , 변수 값으로 Java 설치 경로(예: C:\Program Files\Java\jdk1.6.0_16)를 ìž…ë ¥í•œ 후 [확ì¸]ì„ í´ë¦í•œë‹¤. .. image:: /images/image51.png [시스템 변수] 중 Path를 ì„ íƒí•˜ê³ [편집]ì„ í´ë¦í•œë‹¤. [변수 ê°’]ì— **%JAVA_HOME%\\bin** 를 ì¶”ê°€í•˜ê³ [확ì¸]ì„ í´ë¦í•œë‹¤. .. image:: /images/image52.png ìœ„ì˜ ë°©ë²•ì„ ì‚¬ìš©í•˜ì§€ ì•Šê³ ë‹¤ìŒê³¼ ê°™ì´ ì…¸ì—서 **JAVA_HOME** ê³¼ **PATH** 환경 변수를 ì„¤ì •í• ìˆ˜ë„ ìžˆë‹¤. :: set JAVA_HOME= C:\Program Files\Java\jdk1.6.0_16 set PATH=%PATH%;%JAVA_HOME%\bin **Linux 환경ì—서 환경 변수 ì„¤ì •** 다ìŒê³¼ ê°™ì´ Javaê°€ ì„¤ì¹˜ëœ **JAVA_HOME** 환경 변수로 ë””ë ‰í„°ë¦¬ 경로(예: /usr/java/jdk1.6.0_16)를 ì„¤ì •í•˜ê³ , **PATH** 환경 ë³€ìˆ˜ì— **$JAVA_HOME/bin** ì„ ì¶”ê°€í•œë‹¤. :: export JAVA_HOME=/usr/java/jdk1.6.0_16 #bash export PATH=$JAVA_HOME/bin:$PATH #bash setenv JAVA_HOME /usr/java/jdk1.6.0_16 #csh set path = ($JAVA_HOME/bin $path) #csh **JDBC 드ë¼ì´ë²„ ì„¤ì •** JDBC를 ì‚¬ìš©í•˜ë ¤ë©´ CUBRID JDBC 드ë¼ì´ë²„ê°€ 존재하는 경로를 환경 변수 **CLASSPATH** ì— ì¶”ê°€í•´ì•¼ 한다. CUBRID JDBC 드ë¼ì´ë²„(**cubrid_jdbc.jar**)는 CUBRID 설치 ë””ë ‰í„°ë¦¬ ì•„ëž˜ì˜ jdbc ë””ë ‰í„°ë¦¬ì— ìœ„ì¹˜í•œë‹¤. .. image:: /images/image53.gif **Windows 환경ì—서 CLASSPATH 환경 변수 ì„¤ì •** :: set CLASSPATH=C:\CUBRID\jdbc\cubrid_jdbc.jar:. **Linux 환경ì—서 CLASSPATH 환경 변수 ì„¤ì •** :: export CLASSPATH=$HOME/CUBRID/jdbc/cubrid_jdbc.jar:. .. warning:: 만약 JREê°€ ì„¤ì¹˜ëœ ë¼ì´ë¸ŒëŸ¬ë¦¬ ë””ë ‰í„°ë¦¬(**$JAVA_HOME/jre/lib/ext**)ì— ì¼ë°˜ CUBRID JDBC 드ë¼ì´ë²„ê°€ 설치ë˜ì–´ 있다면, Java ì €ìž¥ í”„ë¡œì‹œì €ì—서 사용하는 서버 사ì´ë“œ JDBC 드ë¼ì´ë²„보다 ë¨¼ì € 로드ë˜ì–´ Java ì €ìž¥ í”„ë¡œì‹œì €ê°€ ë¹„ì •ìƒì 으로 구ë™ë 수 있다. Java ì €ìž¥ í”„ë¡œì‹œì €ë¥¼ 사용하는 환경ì—서는 JREê°€ ì„¤ì¹˜ëœ ë¼ì´ë¸ŒëŸ¬ë¦¬ ë””ë ‰í„°ë¦¬( **$JAVA_HOME/jre/lib/ext**)ì— ì¼ë°˜ CUBRID JDBC 드ë¼ì´ë²„를 설치하지 않ë„ë¡ ì£¼ì˜í•œë‹¤. JDBC í”„ë¡œê·¸ëž˜ë° =============== .. _jdbc-connection-conf: ì—°ê²° ì„¤ì • --------- **DriverManager** 는 JDBC 드ë¼ì´ë²„를 관리하기 위한 기본ì ì¸ ì¸í„°íŽ˜ì´ìФì´ë©°, ë°ì´í„°ë² ì´ìФ 드ë¼ì´ë²„를 ì„ íƒí•˜ê³ 새로운 ë°ì´í„°ë² ì´ìФ ì—°ê²°ì„ ìƒì„±í•˜ëŠ” ê¸°ëŠ¥ì„ í•œë‹¤. CUBRID JDBC 드ë¼ì´ë²„ê°€ 등ë¡ë˜ì–´ 있다면 **DriverManager.getConnection** (*db-url*, *user-id*, *password*) 메서드를 호출하여 ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†í•œë‹¤. **getConnection** 메서드는 **Connection** ê°ì²´ë¥¼ 반환한다. ê·¸ë¦¬ê³ ê·¸ê²ƒì€ ì§ˆì˜ ì‹¤í–‰ê³¼ ëª…ë ¹ë¬¸ 실행 ê·¸ë¦¬ê³ íŠ¸ëžœìžì…˜ì˜ 커밋 ë˜ëŠ” ë¡¤ë°±ì— ì‚¬ìš©ëœë‹¤. ì—°ê²° ì„¤ì •ì„ ìœ„í•œ *db-url* ì¸ìžì˜ êµ¬ì„±ì€ ë‹¤ìŒê³¼ 같다. :: jdbc:cubrid:<host>:<port>:<db-name>:[user-id]:[password]:[?<property> [& <property>] ... ] <host> ::= hostname | ip_address <property> ::= altHosts=<alternative_hosts> | rcTime=<second> | loadBalance=<bool_type> | connectTimeout=<second> | queryTimeout=<second> | charSet=<character_set> | zeroDateTimeBehavior=<behavior_type> | logFile=<file_name> | logOnException=<bool_type> | logSlowQueries=<bool_type>&slowQueryThresholdMillis=<millisecond> | useLazyConnection=<bool_type> | useSSL=<bool_type> | clientCacheSize=<unit_size> | usePreparedStmtCache=<bool_type> | preparedStmtCacheSize=<unit_size> | preparedStmtCacheSqlLimit=<unit_size> | hold_cursor=<bool_type> <alternative_hosts> ::= <standby_broker1_host>:<port> [,<standby_broker2_host>:<port>] <behavior_type> ::= exception | round | convertToNull <bool_type> ::= true | false <unit_size> ::= multiple of mega byte * *host*: CUBRID 브로커가 ë™ìž‘í•˜ê³ ìžˆëŠ” ì„œë²„ì˜ IP 주소 ë˜ëŠ” 호스트 ì´ë¦„ * *port*: CUBRID ë¸Œë¡œì»¤ì˜ í¬íЏ 번호(기본값: 33000) * *db-name*: ì ‘ì†í• ë°ì´í„°ë² ì´ìФ ì´ë¦„ * *user-id*: ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†í• ì‚¬ìš©ìž IDì´ë‹¤. 기본ì 으로 ë°ì´í„°ë² ì´ìФì—는 **dba** 와 **public** ë‘ ê°œì˜ ì‚¬ìš©ìžê°€ 존재한다. ì´ ê°’ì´ NULLì´ë©´ *db-url*\ì˜ ì‚¬ìš©ìž IDê°€ 사용ë˜ë©°, 빈 문ìžì—´("")ì´ë©´ **public**\ì´ ì‚¬ìš©ìž ID로 사용ëœë‹¤. * *password*: ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†í• 사용ìžì˜ 암호ì´ë‹¤. ì´ ê°’ì´ NULLì´ë©´ urlì˜ ì•”í˜¸ê°€ 사용ë˜ë©°, 빈 문ìžì—´("")ì´ë©´ 빈 문ìžì—´ì´ 암호로 사용ëœë‹¤. *db-url* ë‚´ì˜ ì•”í˜¸ì—는 ':'를 í¬í•¨í• 수 없다. * <*property*> * **altHosts**: HA 환경ì—서 ìž¥ì• ì‹œ fail-overí• í•˜ë‚˜ ì´ìƒì˜ standby ë¸Œë¡œì»¤ì˜ í˜¸ìŠ¤íŠ¸ IP와 ì ‘ì† í¬íЏì´ë‹¤. .. note:: ë©”ì¸ í˜¸ìŠ¤íŠ¸ì™€ **altHosts** ë¸Œë¡œì»¤ë“¤ì˜ **ACCESS_MODE**\ ì„¤ì •ì— **RW**\ 와 **RO**\ ê°€ 섞여 있다 하ë”ë¼ë„, ì‘ìš© í”„ë¡œê·¸ëž¨ì€ **ACCESS_MODE**\ 와 무관하게 ì ‘ì† ëŒ€ìƒ í˜¸ìŠ¤íŠ¸ë¥¼ ê²°ì •í•œë‹¤. ë”°ë¼ì„œ 사용ìžëŠ” ì ‘ì† ëŒ€ìƒ ë¸Œë¡œì»¤ì˜ **ACCESS_MODE**\ 를 ê°ì•ˆí•´ì„œ ë©”ì¸ í˜¸ìŠ¤íŠ¸ì™€ **altHosts**\ 를 ì •í•´ì•¼ 한다. * **rcTime**: 첫 번째로 ì ‘ì†í–ˆë˜ ë¸Œë¡œì»¤ì— ìž¥ì• ê°€ ë°œìƒí•œ ì´í›„ altHosts ì— ëª…ì‹œí•œ 브로커로 ì ‘ì†í•œë‹¤(failover). ì´í›„, rcTimeë§Œí¼ ì‹œê°„ì´ ê²½ê³¼í• ë•Œë§ˆë‹¤ ì›ëž˜ì˜ ë¸Œë¡œì»¤ì— ìž¬ì ‘ì†ì„ 시ë„한다(기본값 600ì´ˆ). ìž…ë ¥ ë°©ë²•ì€ ì•„ëž˜ URL ì˜ˆì œë¥¼ ì°¸ê³ í•œë‹¤. * **loadBalance**: ì´ ê°’ì´ trueë©´ ì‘ìš© í”„ë¡œê·¸ëž¨ì´ ë©”ì¸ í˜¸ìŠ¤íŠ¸ì™€ altHostsì— ì§€ì •í•œ í˜¸ìŠ¤íŠ¸ë“¤ì— ëžœë¤í•œ 순서로 연결한다(기본값: false). * **connectTimeout**: ë°ì´í„°ë² ì´ìФ ì ‘ì†ì— 대한 타임아웃 ì‹œê°„ì„ ì´ˆ 단위로 ì„¤ì •í•œë‹¤. ê¸°ë³¸ê°’ì€ 30ì´ˆì´ë‹¤. ì´ ê°’ì´ 0ì¸ ê²½ìš° 무한 대기를 ì˜ë¯¸í•œë‹¤. ì´ ê°’ì€ ìµœì´ˆ ì ‘ì† ì´í›„ ë‚´ë¶€ì ì¸ ìž¬ì ‘ì†ì´ ë°œìƒí•˜ëŠ” 경우ì—ë„ ì ìš©ëœë‹¤. **DriverManger.setLoginTimeout** () 메서드로 ì„¤ì •í• ìˆ˜ë„ ìžˆìœ¼ë‚˜, ì—°ê²° URLì— ì´ ê°’ì„ ì„¤ì •í•˜ë©´ 메서드로 ì„¤ì •í•œ ê°’ì€ ë¬´ì‹œëœë‹¤. * **queryTimeout**: ì§ˆì˜ ìˆ˜í–‰ì— ëŒ€í•œ 타임아웃 ì‹œê°„ì„ ì´ˆ 단위로 ì„¤ì •í•œë‹¤(기본값: 0, ë¬´ì œí•œ). ìµœëŒ€ê°’ì€ 2,000,000ì´ë‹¤. ì´ ê°’ì€ **DriverManger.setQueryTimeout** () ë©”ì„œë“œì— ì˜í•´ 변경ë 수 있다. executeBatch() 메서드를 수행하는 경우 한 ê°œì˜ ì§ˆì˜ì— 대한 íƒ€ìž„ì•„ì›ƒì´ ì•„ë‹Œ 한 ë²ˆì˜ ë©”ì„œë“œ í˜¸ì¶œì— ëŒ€í•œ íƒ€ìž„ì•„ì›ƒì´ ì ìš©ëœë‹¤. .. note:: executeBatch() 메서드를 수행하는 경우 한 ê°œì˜ ì§ˆì˜ì— 대한 íƒ€ìž„ì•„ì›ƒì´ ì•„ë‹Œ 한 ë²ˆì˜ ë©”ì„œë“œ í˜¸ì¶œì— ëŒ€í•œ íƒ€ìž„ì•„ì›ƒì´ ì ìš©ëœë‹¤. * **charSet**: ì ‘ì†í•˜ê³ ìž í•˜ëŠ” DBì˜ ë¬¸ìžì…‹(charSet)ì´ë‹¤. * **zeroDateTimeBehavior**: JDBCì—서는 java.sql.Date 형 ê°ì²´ì— ë‚ ì§œì™€ 시간 ê°’ì´ ëª¨ë‘ 0ì¸ ê°’ì„ í—ˆìš©í•˜ì§€ 않으므로 ì´ ê°’ì„ ì¶œë ¥í•´ì•¼ í• ë•Œ 어떻게 ì²˜ë¦¬í• ê²ƒì¸ì§€ë¥¼ ì •í•˜ëŠ” ì†ì„±. 기본 ë™ìž‘ì€ **exception** ì´ë‹¤. ë‚ ì§œì™€ 시간 ê°’ì´ ëª¨ë‘ 0ì¸ ê°’ì— ëŒ€í•œ ì„¤ëª…ì€ :ref:`date-time-type` ì„ ì°¸ê³ í•œë‹¤. ì„¤ì •ê°’ì— ë”°ë¥¸ ë™ìž‘ì€ ë‹¤ìŒê³¼ 같다. * **exception**: 기본 ë™ìž‘. SQLException 예외로 처리한다. * **round**: ë°˜í™˜í• íƒ€ìž…ì˜ ìµœì†Œê°’ìœ¼ë¡œ 변환한다. 단, TIMESTAMP íƒ€ìž…ì€ '1970-01-01 00:00:00'(GST)를 반환한다. * **convertToNull**: **NULL** 로 변환한다. * **logFile**: 디버깅용 로그 íŒŒì¼ ì´ë¦„(기본값: cubrid_jdbc.log). 별ë„ì˜ ê²½ë¡œ ì„¤ì •ì´ ì—†ìœ¼ë©´ ì‘ìš© í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ëŠ” ìœ„ì¹˜ì— ì €ìž¥ëœë‹¤. * **logOnException**: 디버깅용 예외 처리 로깅 여부(기본값: false) * **logSlowQueries**: 디버깅용 슬로우 쿼리 로깅 여부(기본값: false) * **slowQueryThresholdMillis**: 디버깅용 슬로우 쿼리 로깅 시 슬로우 쿼리 ì œí•œ 시간(기본값: 60000). 단위는 밀리 ì´ˆì´ë‹¤. * **useLazyConnection**: ì´ ê°’ì´ trueì´ë©´ 사용ìžì˜ ì—°ê²° ìš”ì² ì‹œ 브로커 ì—°ê²° ì—†ì´ ì„±ê³µì„ ë°˜í™˜(기본값: false)í•˜ê³ , prepare나 execute ë“±ì˜ í•¨ìˆ˜ë¥¼ í˜¸ì¶œí• ë•Œ ë¸Œë¡œì»¤ì— ì—°ê²°í•œë‹¤. ì´ ê°’ì„ true로 ì„¤ì •í•˜ë©´ ë§Žì€ ì‘ìš© í´ë¼ì´ì–¸íŠ¸ê°€ ë™ì‹œì— 재시작ë˜ë©´ì„œ ì—°ê²° í’€(connection pool)ì„ ìƒì„±í• 때 ì ‘ì†ì´ 지연ë˜ê±°ë‚˜ 실패하는 현ìƒì„ í”¼í• ìˆ˜ 있다. * **useSSL**: 패킷 암호화 여부 (기본값: false) * 패킷 암호화: useSSL = true * ì¼ë°˜ í‰ë¬¸: useSSL = false * **clientCacheSize**: 결과를 ìºì‹œí• í¬ê¸° * 단위는 메가 ë°”ì´íЏ * 범위는 1 ~ 1024 (1메가 ë°”ì´íЏì—서 1기가 ë°”ì´íЏ) * 기본 ê°’ì€ 1 (메가 ë°”ì´íЏ) * **usePreparedStmtCache**: Prepared Statement ìºì‹œ 여부 (기본값: false) * **preparedStmtCacheSize**: usePreparedStmtCacheê°€ TRUEì¼ ê²½ìš°, ìºì‹±í• 수 있는 갯수 (기본:25, 최소:1, 최대:2147483647) * **preparedStmtCacheSqlLimit**: usePreparedStmtCacheê°€ TRUEì¼ ê²½ìš°, ìºì‹±í• 수 있는 SQLì˜ ê¸¸ì´ (기본:256, 최소:1, 최대:2147483647) * **hold_cursor**: 커서 ìœ ì§€ 기능 ì„¤ì •(기본값: true). ì´ ê°’ì´ false ì´ë©´ CLOSE_CURSORS_AT_COMMITì´ ì„¤ì •ë˜ê³ , true ì´ë©´ HOLD_CURSORS_OVER_COMMITì´ ì„¤ì •ëœë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`cursor-holding`\ ì„ ì°¸ê³ í•œë‹¤. **ì˜ˆì œ 1** :: --connection URL string when user name and password omitted URL=jdbc:CUBRID:192.168.0.1:33000:demodb:public:: --connection URL string when zeroDateTimeBehavior property specified URL=jdbc:CUBRID:127.0.0.1:33000:demodb:public::?zeroDateTimeBehavior=convertToNull --connection URL string when charSet property specified URL=jdbc:CUBRID:192.168.0.1:33000:demodb:public::?charSet=utf-8 --connection URL string when queryTimeout and charSet property specified URL=jdbc:CUBRID:127.0.0.1:33000:demodb:public::?queryTimeout=1&charSet=utf-8 --connection URL string when a property(altHosts) specified for HA URL=jdbc:CUBRID:192.168.0.1:33000:demodb:public::?altHosts=192.168.0.2:33000,192.168.0.3:33000 --connection URL string when properties(altHosts,rcTime, connectTimeout) specified for HA URL=jdbc:CUBRID:192.168.0.1:33000:demodb:public::?altHosts=192.168.0.2:33000,192.168.0.3:33000&rcTime=600&connectTimeout=5 --connection URL string when properties(altHosts,rcTime, charSet) specified for HA URL=jdbc:CUBRID:192.168.0.1:33000:demodb:public::?altHosts=192.168.0.2:33000,192.168.0.3:33000&rcTime=600&charSet=utf-8 --connection URL string when useSSL property specified for encrypted connection URL=jdbc:CUBRID:192.168.0.1:33000:demodb:public::?useSSL=true --connection URL string when clientCacheSize property specified for result-cache URL=jdbc:CUBRID:192.168.0.1:33000:demodb:public::?clientCacheSize=1 --connection URL string when usePreparedStmtCache property specified for prepared stament cache URL=jdbc:CUBRID:192.168.0.1:33000:demodb:public::?usePreparedStmtCache=true&preparedStmtCacheSize=100&preparedStmtCacheSqlLimit=1024" --connection URL string when hold_cursor property specified for cursor holdability URL=jdbc:CUBRID:192.168.0.1:33000:demodb:public::?hold_cursor=true **ì˜ˆì œ 2** .. code-block:: java String url = "jdbc:cubrid:192.168.0.1:33000:demodb:public::"; String userid = ""; String password = ""; try { Connection conn = DriverManager.getConnection(url,userid,password); // Do something with the Connection ... } catch (SQLException e) { System.out.println("SQLException:" + e.getMessage()); System.out.println("SQLState: " + e.getSQLState()); } ... .. note:: * URL 문ìžì—´ì—서 ì½œë¡ (:)ê³¼ 물ìŒí‘œ(?)는 구분ìžë¡œ 사용ë˜ë¯€ë¡œ, URL 문ìžì—´ì— 암호를 í¬í•¨í•˜ëŠ” 경우 ì•”í˜¸ì˜ ì¼ë¶€ì— ì½œë¡ ì´ë‚˜ 물ìŒí‘œë¥¼ ì‚¬ìš©í• ìˆ˜ 없다. ì•”í˜¸ì— ì½œë¡ ì´ë‚˜ 물ìŒí‘œë¥¼ ì‚¬ìš©í•˜ë ¤ë©´ getConnection 함수ì—서 ì‚¬ìš©ìž ì´ë¦„(*user-id*)ê³¼ 암호(*password*)를 별ë„ì˜ ì¸ìžë¡œ ì§€ì •í•´ì•¼ 한다. * ìŠ¤ë ˆë“œ 기반 프로그램ì—서 ë°ì´í„°ë² ì´ìФ ì—°ê²°ì€ ê° ìŠ¤ë ˆë“œë§ˆë‹¤ ë…립ì 으로 사용해야 한다. * 트랜ìžì…˜ ë¡¤ë°±ì„ ìš”ì²í•˜ëŠ” rollback 메서드는 서버가 롤백 ìž‘ì—…ì„ ì™„ë£Œí•œ 후 종료ëœë‹¤. * ìžë™ 커밋 모드ì—서 SELECT 문 수행 ì´í›„ ëª¨ë“ ê²°ê³¼ ì…‹ì´ fetchë˜ì§€ 않으면 ì»¤ë°‹ì´ ë˜ì§€ 않는다. ë”°ë¼ì„œ, ìžë™ 커밋 ëª¨ë“œë¼ í•˜ë”ë¼ë„ 프로그램 ë‚´ì—서 ê²°ê³¼ ì…‹ì— ëŒ€í•œ fetch ë„중 ì–´ë– í•œ 오류가 ë°œìƒí•œë‹¤ë©´ 반드시 커밋 ë˜ëŠ” ë¡¤ë°±ì„ ìˆ˜í–‰í•˜ì—¬ 트랜ìžì…˜ì„ 종료 처리하ë„ë¡ í•œë‹¤. .. warning:: * useSSLì˜ flag는 **브로커 모드와 ì¼ì¹˜í•´ì•¼ 한다**. 아래와 ê°™ì´ ë¸Œë¡œì»¤ì˜ ì•”í˜¸í™” 모드와 다른 flag로 ì ‘ì†ì„ ìš”ì²í•˜ëŠ” 경우 **ì—°ê²°ë˜ì§€ 않는다**. * useSSL=true, 브로커 'ì¼ë°˜ 모드' ì¼ ë•Œ ì—°ê²° 불가 (**cubrid_broker.conf**: SSL = OFF) * useSSL=false, 브로커 '암호화 모드' ì¼ë•Œ ì—°ê²° 불가 (**cubrid_broker.conf**: SSL = ON) * **clientCacheSize** 는 브로커 파ë¼ë¯¸í„°ì¸ **JDBC_CACHE** í˜¹ì€ **JDBC_CACHE_ONLY_HINT** ê°€ **ON** 으로 ì„¤ì •ë˜ì–´ 있어야 ìœ íš¨í•˜ë‹¤. .. _jdbc-conn-datasource: DataSource ê°ì²´ë¡œ ì—°ê²° -------------------------- DataSource는 JDBC 2.0 확장 APIì— ì†Œê°œëœ ê°œë…으로, ì—°ê²° í’€ë§(connection pooling)ê³¼ ë¶„ì‚° 트랜ìžì…˜ì„ ì§€ì›í•œë‹¤. CUBRID는 ì—°ê²° í’€ë§ë§Œ ì§€ì›í•˜ë©°, ë¶„ì‚° 트랜ìžì…˜ê³¼ JNDI는 ì§€ì›í•˜ì§€ 않는다. CUBRIDDataSource는 CUBRIDì—서 구현한 DataSourceì´ë‹¤. **DataSource ê°ì²´ ìƒì„±í•˜ê¸°** DataSource ê°ì²´ë¥¼ ìƒì„±í•˜ë ¤ë©´ 다ìŒê³¼ ê°™ì´ í˜¸ì¶œí•œë‹¤. .. code-block:: java CUBRIDDataSource ds = null; ds = new CUBRIDDataSource(); **ì—°ê²° ì†ì„± ì„¤ì •í•˜ê¸°** **ì—°ê²° ì†ì„±**\ (connection properties)ì€ datasource와 CUBRID DBMS 사ì´ì— ì—°ê²°ì„ ì„¤ì •í•˜ëŠ”ë° ì‚¬ìš©ëœë‹¤. ì¼ë°˜ì ì¸ ì†ì„±ì€ DB ì´ë¦„, 호스트 ì´ë¦„, í¬íЏ 번호, ì‚¬ìš©ìž ì´ë¦„, 암호ì´ë‹¤. ì†ì„±(property) ê°’ì„ ì„¤ì •í•˜ê±°ë‚˜ 얻기 위해서는 cubrid.jdbc.driver.CUBRIDDataSourceì—서 êµ¬í˜„ëœ ë‹¤ìŒ ë©”ì„œë“œë“¤ì„ ì‚¬ìš©í•œë‹¤. .. code-block:: java public PrintWriter getLogWriter(); public void setLogWriter(PrintWriter out); public void setLoginTimeout(int seconds); public int getLoginTimeout(); public String getDatabaseName(); public String getDatabaseName(); public String getDataSourceName(); public String getDescription(); public String getNetworkProtocol(); public String getPassword(); public int getPortNumber(); public int getPort(); public String getRoleName(); public String getServerName(); public String getUser(); public String getURL(); public String getUrl(); public void setDatabaseName(String dbName); public void setDescription(String desc); public void setNetworkProtocol(String netProtocol); public void setPassword(String psswd); public void setPortNumber(int p); public void setPort(int p); public void setRoleName(String rName); public void setServerName(String svName); public void setUser(String uName); public void setUrl(String urlString); public void setURL(String urlString); 특히, URL 문ìžì—´ì„ 통해 ì†ì„±ì„ ì§€ì •í•˜ê³ ìž í•˜ëŠ” 경우 setURL() 메서드를 사용한다. URL 문ìžì—´ì— 대해서는 :ref:`jdbc-connection-conf`\ ì„ ì°¸ê³ í•œë‹¤. .. code-block:: java import cubrid.jdbc.driver.CUBRIDDataSource; ... CUBRIDDataSource ds = null; ds = new CUBRIDDataSource(); ds.setUrl("jdbc:cubrid:10.113.153.144:55300:demodb:::?charset=utf8&logSlowQueries=true&slowQueryThresholdMillis=1000&logTraceApi=true&logTraceNetwork=true"); DataSource로부터 ì—°ê²° ê°ì²´ë¥¼ 얻기 위해서는 getConnection 메서드를 호출한다. .. code-block:: java Connection connection = null; connection = ds.getConnection("dba", ""); CUBRIDConnectionPoolDataSource는 connectionpool datasource를 CUBRIDì—서 구현한 ê°ì²´ì¸ë°, CUBRIDDataSourceì˜ ë©”ì„œë“œë“¤ê³¼ ê°™ì€ ì´ë¦„ì˜ ë©”ì„œë“œë“¤ì„ í¬í•¨í•˜ê³ 있다. 보다 ìžì„¸í•œ ì˜ˆì œëŠ” :ref:`jdbc-examples`\ ì˜ **DataSource ê°ì²´ë¡œ ì—°ê²°**\ ì„ ì°¸ê³ í•œë‹¤. .. _jdbc-con-tostring: SQL LOG í™•ì¸ ------------ cubrid.jdbc.driver.CUBRIDConnection í´ëž˜ìŠ¤ì˜ toString() 메서드를 사용하여 다ìŒê³¼ ê°™ì€ ì—°ê²° ì •ë³´ë¥¼ ì¶œë ¥í• ìˆ˜ 있다. :: 예) cubrid.jdbc.driver.CUBRIDConnection(CAS ID : 1, PROCESS ID : 22922) 위ì—서 ì¶œë ¥ë˜ëŠ” CAS ID를 통해 해당 CASì˜ SQL 로그 파ì¼ì„ 쉽게 확ì¸í• 수 있다. 보다 ìžì„¸í•œ 사í•ì€ :ref:`sql-log-check`\ ì„ ì°¸ê³ í•œë‹¤. 외래 키 ì •ë³´ í™•ì¸ ----------------- **DatabaseMetaData** ì¸í„°íŽ˜ì´ìФì—서 ì œê³µë˜ëŠ” **getImportedKeys**, **getExportedKeys**, **getCrossReference** 메서드를 사용하여 외래 키 ì •ë³´ë¥¼ 확ì¸í• 수 있다. ê° ë©”ì„œë“œì˜ ì‚¬ìš©ë²• ë° ì˜ˆì œëŠ” 다ìŒê³¼ 같다. .. code-block:: java getImportedKeys(String catalog, String schema, String table) getExportedKeys(String catalog, String schema, String table) getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) * **getImportedKeys** 메서드: ì¸ìžë¡œ 주어진 í…Œì´ë¸”ì˜ ì™¸ëž˜ 키 ì¹¼ëŸ¼ë“¤ì´ ì°¸ì¡°í•˜ê³ ìžˆëŠ” 기본 키 ì¹¼ëŸ¼ë“¤ì˜ ì •ë³´ë¥¼ 조회한다. 결과는 **PKTABLE_NAME** ë° **KEY_SEQ** 순서로 ì •ë ¬ë˜ì–´ 반환ëœë‹¤. * **getExportedKeys** 메서드: 주어진 í…Œì´ë¸”ì˜ ê¸°ë³¸ 키 ì¹¼ëŸ¼ë“¤ì„ ì°¸ì¡°í•˜ëŠ” ëª¨ë“ ì™¸ëž˜ 키 ì¹¼ëŸ¼ë“¤ì˜ ì •ë³´ë¥¼ 조회하며, 결과는 **FKTABLE_NAME** ë° **KEY_SEQ** 순서로 ì •ë ¬ëœë‹¤. * **getCrossReference** 메서드: ì¸ìžë¡œ 주어진 í…Œì´ë¸”ì˜ ì™¸ëž˜ 키 ì¹¼ëŸ¼ë“¤ì´ ì°¸ì¡°í•˜ê³ ìžˆëŠ” 기본 키 ì¹¼ëŸ¼ë“¤ì˜ ì •ë³´ë¥¼ 조회한다. 결과는 **PKTABLE_NAME** ë° **KEY_SEQ** 순서로 ì •ë ¬ë˜ì–´ 반환ëœë‹¤. **반환 ê°’** 위 메서드를 호출하면 아래와 ê°™ì´ 14ê°œì˜ ì¹¼ëŸ¼ìœ¼ë¡œ êµ¬ì„±ëœ ResultSetì„ ë°˜í™˜í•œë‹¤. +---------------+----------+-------------------------------------------------------+ | name | type | ë¹„ê³ | +===============+==========+=======================================================+ | PKTABLE_CAT | String | í•ìƒ null | +---------------+----------+-------------------------------------------------------+ | PKTABLE_SCHEM | String | í•ìƒ null | +---------------+----------+-------------------------------------------------------+ | PKTABLE_NAME | String | 기본 키 í…Œì´ë¸” ì´ë¦„ | +---------------+----------+-------------------------------------------------------+ | PKCOLUMN_NAME | String | 기본 키 칼럼 ì´ë¦„ | +---------------+----------+-------------------------------------------------------+ | FKTABLE_CAT | String | í•ìƒ null | +---------------+----------+-------------------------------------------------------+ | FKTABLE_SCHEM | String | í•ìƒ null | +---------------+----------+-------------------------------------------------------+ | FKTABLE_NAME | String | 외래 키 í…Œì´ë¸” ì´ë¦„ | +---------------+----------+-------------------------------------------------------+ | FKCOLUMN_NAME | String | 외래 키 칼럼 ì´ë¦„ | +---------------+----------+-------------------------------------------------------+ | KEY_SEQ | short | 외래 키 ë˜ëŠ” 기본 키 ì¹¼ëŸ¼ë“¤ì˜ ìˆœì„œ(1부터 시작) | +---------------+----------+-------------------------------------------------------+ | UPDATE_RULE | short | 기본 키가 ì—…ë°ì´íЏë 때 외래 í‚¤ì— ëŒ€í•´ ì •ì˜ëœ 참조 | | | | ë™ìž‘ì— ëŒ€ì‘ë˜ëŠ” ê°’ | | | | Cascade=0, Restrict=2, No action=3, Set null=4 | +---------------+----------+-------------------------------------------------------+ | DELETE_RULE | short | 기본 키가 ì‚ì œë 때 외래 í‚¤ì— ëŒ€í•´ ì •ì˜ëœ 참조 | | | | ë™ìž‘ì— ëŒ€ì‘ë˜ëŠ” ê°’ | | | | Cascade=0, Restrict=2, No action=3, Set null=4 | +---------------+----------+-------------------------------------------------------+ | FK_NAME | String | 외래 키 ì´ë¦„ | +---------------+----------+-------------------------------------------------------+ | PK_NAME | String | 기본 키 ì´ë¦„ | +---------------+----------+-------------------------------------------------------+ | DEFERRABILITY | short | í•ìƒ 6 | | | | (DatabaseMetaData.importedKeyInitiallyImmediate) | +---------------+----------+-------------------------------------------------------+ **ì˜ˆì œ** .. code-block:: java import java.sql.*; import java.lang.*; import cubrid.jdbc.driver.*; public class Metadata_Sample { public static String getRuleName(String rule) { int r = Integer.parseInt(rule); switch(r) { case DatabaseMetaData.importedKeyCascade: return "cascade (" + rule + ")"; case DatabaseMetaData.importedKeyRestrict: return "restrict (" + rule + ")"; case DatabaseMetaData.importedKeySetNull: return "set null (" + rule + ")"; case DatabaseMetaData.importedKeyNoAction: return "no action (" + rule + ")"; case DatabaseMetaData.importedKeySetDefault: return "set default (" + rule + ")"; default: return "unknown (" + rule + ")"; } } public static String getDeferrabilityName(String deferrability) { int d = Integer.parseInt(deferrability); switch(d) { case DatabaseMetaData.importedKeyInitiallyDeferred: return "initially deferred (" + deferrability + ")"; case DatabaseMetaData.importedKeyInitiallyImmediate: return "initially immediate (" + deferrability + ")"; case DatabaseMetaData.importedKeyNotDeferrable: return "not deferrable (" + deferrability + ")"; default: return "unknown (" + deferrability + ")"; } } public static void printFkInfo(ResultSet rs) throws Exception { while(rs.next()) { System.out.println("\n<" + rs.getString("FK_NAME") + ">"); System.out.println("01. PKTABLE_CAT : " + rs.getString("PKTABLE_CAT")); System.out.println("02. PKTABLE_SCHEM : " + rs.getString("PKTABLE_SCHEM")); System.out.println("03. PKTABLE_NAME : " + rs.getString("PKTABLE_NAME")); System.out.println("04. PKCOLUMN_NAME : " + rs.getString("PKCOLUMN_NAME")); System.out.println("05. FKTABLE_CAT : " + rs.getString("FKTABLE_CAT")); System.out.println("06. FKTABLE_SCHEM : " + rs.getString("FKTABLE_SCHEM")); System.out.println("07. FKTABLE_NAME : " + rs.getString("FKTABLE_NAME")); System.out.println("08. FKCOLUMN_NAME : " + rs.getString("FKCOLUMN_NAME")); System.out.println("09. KEY_SEQ : " + rs.getString("KEY_SEQ")); System.out.println("10. UPDATE_RULE : " + getRuleName(rs.getString("UPDATE_RULE"))); System.out.println("11. DELETE_RULE : " + getRuleName(rs.getString("DELETE_RULE"))); System.out.println("12. FK_NAME : " + rs.getString("FK_NAME")); System.out.println("13. PK_NAME : " + rs.getString("PK_NAME")); System.out.println("14. DEFERRABILITY : " + getDeferrabilityName(rs.getString("DEFERRABILITY"))); } } public static void main (String args []) { Connection conn = null; Statement stmt; DatabaseMetaData dbmd; ResultSet rs; try { conn = (CUBRIDConnection)DriverManager.getConnection("jdbc:cubrid:localhost:33000:demodb:::", "dba", ""); stmt = conn.createStatement(); dbmd = conn.getMetaData(); stmt.executeUpdate("drop table if exists refer_1"); stmt.executeUpdate("drop table if exists refer_2"); stmt.executeUpdate("drop table if exists referred_1"); stmt.executeUpdate("drop table if exists referred_2"); stmt.executeUpdate("create table referred_1 (" + "pk1 int," + "pk2 int," + "primary key (pk1, pk2))"); stmt.executeUpdate("create table referred_2 (" + "pk int primary key)"); stmt.executeUpdate("create table refer_1 (" + "pk int primary key," + "fk1 int," + "fk2 int," + "fk3 int," + "constraint refer_1_fk1_2_fk foreign key (fk1, fk2) references referred_1(pk1, pk2)," + "constraint refer_1_fk3_fk foreign key (fk3) references referred_2(pk))"); stmt.executeUpdate("create table refer_2 (" + "pk int primary key," + "fk1 int," + "fk2 int," + "fk3 int," + "constraint refer_2_fk1_2_fk foreign key (fk1, fk2) references referred_1(pk1, pk2) " + "on update set null on delete no action," + "constraint refer_2_fk3_fk foreign key (fk3) references referred_2(pk) " + "on update restrict on delete cascade)"); System.out.println("\n============== getImportedKeys() =================="); rs = dbmd.getImportedKeys(null, null, "refer_1"); printFkInfo(rs); rs.close(); rs = dbmd.getImportedKeys(null, null, "refer_2"); printFkInfo(rs); rs.close(); System.out.println("\n=============== getExportedKeys() ================="); rs = dbmd.getExportedKeys(null, null, "referred_1"); printFkInfo(rs); rs.close(); rs = dbmd.getExportedKeys(null, null, "referred_2"); printFkInfo(rs); rs.close(); System.out.println("\n=============== getCrossReference() ================="); rs = dbmd.getCrossReference(null, null, "referred_1", null, null, "refer_1"); printFkInfo(rs); rs.close(); rs = dbmd.getCrossReference(null, null, "referred_1", null, null, "refer_2"); printFkInfo(rs); rs.close(); rs = dbmd.getCrossReference(null, null, "referred_2", null, null, "refer_1"); printFkInfo(rs); rs.close(); rs = dbmd.getCrossReference(null, null, "referred_2", null, null, "refer_2"); printFkInfo(rs); rs.close(); rs = dbmd.getCrossReference(null, null, "refer_1", null, null, "refer_2"); printFkInfo(rs); rs.close(); } catch (Exception e) { e.printStackTrace(); } } } OID와 ì»¬ë ‰ì…˜ 사용 ----------------- JDBC ìŠ¤íŽ™ì— ì •ì˜ëœ 메서드 ì´ì™¸ì— CUBRID JDBC 드ë¼ì´ë²„ì—서 추가로 OID, ì»¬ë ‰ì…˜ 타입(**SET**, **MULTISET**, **LIST**) ë“±ì„ ë‹¤ë£¨ëŠ” 메서드를 ì œê³µí•œë‹¤. ì´ ë©”ì„œë“œì˜ ì‚¬ìš©ì„ ìœ„í•´ì„œëŠ” 기본ì 으로 import하는 CUBRID JDBC 드ë¼ì´ë²„ í´ëž˜ìФ ì´ì™¸ì— **cubrid.sql.*;** 를 import해야 한다. ë˜í•œ 표준 JDBC APIì—서 ì œê³µí•˜ëŠ” **ResultSet** í´ëž˜ìŠ¤ê°€ 아닌 **CUBRIDResultSet** í´ëž˜ìŠ¤ë¡œ 변환하여 결과를 받아야 한다. .. code-block:: java import cubrid.jdbc.driver.* ; import cubrid.sql.* ; ... CUBRIDResultSet urs = (CUBRIDResultSet) stmt.executeQuery( "SELECT city FROM location"); .. warning:: CUBRIDì˜ í™•ìž¥ API를 사용하면, **AUTOCOMMIT** ì„ TRUE로 ì„¤ì •í•˜ì˜€ë”ë¼ë„ ìžë™ìœ¼ë¡œ 커밋ë˜ì§€ 않는다. ë”°ë¼ì„œ í•ìƒ open한 ì—°ê²°ì— ëŒ€í•´ 명시ì 으로 ì»¤ë°‹ì„ í•´ì•¼ 한다. CUBRID 확장 API는 OID, ì»¬ë ‰ì…˜ ë“±ì„ ë‹¤ë£¨ëŠ” 메서드ì´ë‹¤. OID 사용 ^^^^^^^^ OID를 ì‚¬ìš©í• ë•Œ 다ìŒì˜ ê·œì¹™ì„ ì§€ì¼œì•¼ 한다. * **CUBRIDOID** 를 사용하기 위해서는 반드시 **cubrid.sql.** \* 를 import 해야 한다. (a) * **SELECT** ë¬¸ì— í´ëž˜ìŠ¤ëª…ì„ ì£¼ì–´ OID를 ê°€ì ¸ì˜¬ 수 있다. ë¬¼ë¡ ë‹¤ë¥¸ ì†ì„±ê³¼ 혼용해서 ì‚¬ìš©í• ìˆ˜ë„ ìžˆë‹¤. (b) * 질ì˜ì— 대한 **ResultSet** ì€ ë°˜ë“œì‹œ **CUBRIDResultSet** 으로 받아야 한다. (c) * **CUBRIDResultSet** ì—서 OID를 ê°€ì ¸ì˜¤ëŠ” 메서드는 **getOID** ()ì´ë‹¤. (d) * OIDì—서 ê°’ì„ ê°€ì ¸ì˜¤ê¸° 위해서는 **getValues** () 메서드를 통해 ê°€ì ¸ì˜¬ 수 있다. ê·¸ 결과는 **ResultSet** ì´ë‹¤. (e) * OIDì— ê°’ì„ ëŒ€ìž…í•˜ê¸° 위해서는 **setValues** () 메서드를 통해서 ì ìš©í• ìˆ˜ 있다. (f) * 확장 API 사용시ì—는 ì—°ê²°ì— ëŒ€í•´ í•ìƒ **commit** ()ì„ í•´ì£¼ì–´ì•¼ 한다. (g) **ì˜ˆì œ** .. code-block:: java import java.sql.*; import cubrid.sql.*; //a import cubrid.jdbc.driver.*; /* CREATE TABLE oid_test( id INTEGER, name VARCHAR(10), age INTEGER ); INSERT INTO oid_test VALUES(1, 'Laura', 32); INSERT INTO oid_test VALUES(2, 'Daniel', 39); INSERT INTO oid_test VALUES(3, 'Stephen', 38); */ class OID_Sample { public static void main (String args []) { // Making a connection String url= "jdbc:cubrid:localhost:33000:demodb:public::"; String user = "dba"; String passwd = ""; // SQL statement to get OID values String sql = "SELECT oid_test from oid_test"; //b // columns of the table String[] attr = { "id", "name", "age" } ; // Declaring variables for Connection and Statement Connection con = null; Statement stmt = null; CUBRIDResultSet rs = null; ResultSetMetaData rsmd = null; try { Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); } catch (ClassNotFoundException e) { throw new IllegalStateException("Unable to load Cubrid driver", e); } try { con = DriverManager.getConnection(url, user, passwd); stmt = con.createStatement(); rs = (CUBRIDResultSet)stmt.executeQuery(sql); //c rsmd = rs.getMetaData(); // Printing columns int numOfColumn = rsmd.getColumnCount(); for (int i = 1; i <= numOfColumn; i++ ) { String ColumnName = rsmd.getColumnName(i); String JdbcType = rsmd.getColumnTypeName(i); System.out.print(ColumnName ); System.out.print("("+ JdbcType + ")"); System.out.print(" | "); } System.out.print("\n"); // Printing rows CUBRIDResultSet rsoid = null; int k = 1; while (rs.next()) { CUBRIDOID oid = rs.getOID(1); //d System.out.print("OID"); System.out.print(" | "); rsoid = (CUBRIDResultSet)oid.getValues(attr); //e while (rsoid.next()) { for( int j=1; j <= attr.length; j++ ) { System.out.print(rsoid.getObject(j)); System.out.print(" | "); } } System.out.print("\n"); // New values of the first row Object[] value = { 4, "Yu-ri", 19 }; if (k == 1) oid.setValues(attr, value); //f k = 0; } con.commit(); //g } catch(CUBRIDException e) { e.printStackTrace(); } catch(SQLException ex) { ex.printStackTrace(); } finally { if(rs != null) try { rs.close(); } catch(SQLException e) {} if(stmt != null) try { stmt.close(); } catch(SQLException e) {} if(con != null) try { con.close(); } catch(SQLException e) {} } } } ì»¬ë ‰ì…˜ 사용 ^^^^^^^^^^^ 아래 ì˜ˆì œ 1ì˜ 'a'ì— í•´ë‹¹í•˜ëŠ” ë¶€ë¶„ì´ **CUBRIDResultSet** 으로부터 ì»¬ë ‰ì…˜ 타입(**SET**, **MULTISET**, **LIST**)ì˜ ë°ì´í„°ë¥¼ ê°€ì ¸ì˜¤ëŠ” 부분으로 ê·¸ 결과는 ë°°ì—´ 형태로 반환한다. 단, ì»¬ë ‰ì…˜ 타입 ë‚´ì— ì •ì˜ëœ ì›ì†Œë“¤ì˜ ë°ì´í„° íƒ€ìž…ì´ ëª¨ë‘ ê°™ì€ ê²½ìš°ì—ë§Œ ì‚¬ìš©í• ìˆ˜ 있다. **ì˜ˆì œ 1** .. code-block:: java import java.sql.*; import java.lang.*; import cubrid.sql.*; import cubrid.jdbc.driver.*; // create class collection_test( // settest set(integer), // multisettest multiset(integer), // listtest list(Integer) // ); // // insert into collection_test values({1,2,3},{1,2,3},{1,2,3}); // insert into collection_test values({2,3,4},{2,3,4},{2,3,4}); // insert into collection_test values({3,4,5},{3,4,5},{3,4,5}); class Collection_Sample { public static void main (String args []) { String url= "jdbc:cubrid:127.0.0.1:33000:demodb:public::"; String user = ""; String passwd = ""; String sql = "select settest,multisettest,listtest from collection_test"; try { Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); } catch(Exception e){ e.printStackTrace(); } try { Connection con = DriverManager.getConnection(url,user,passwd); Statement stmt = con.createStatement(); CUBRIDResultSet rs = (CUBRIDResultSet) stmt.executeQuery(sql); CUBRIDResultSetMetaData rsmd = (CUBRIDResultSetMetaData) rs.getMetaData(); int numbOfColumn = rsmd.getColumnCount(); while (rs.next ()) { for (int j=1; j<=numbOfColumn; j++ ) { Object[] reset = (Object[]) rs.getCollection(j); //a for (int m=0 ; m < reset.length ; m++) System.out.print(reset[m] +","); System.out.print(" | "); } System.out.print("\n"); } rs.close(); stmt.close(); con.close(); } catch(SQLException e) { e.printStackTrace(); } } } **ì˜ˆì œ 2** .. code-block:: java import java.sql.*; import java.io.*; import java.lang.*; import cubrid.sql.*; import cubrid.jdbc.driver.*; // create class collection_test( // settest set(integer), // multisettest multiset(integer), // listtest list(Integer) // ); // // insert into collection_test values({1,2,3},{1,2,3},{1,2,3}); // insert into collection_test values({2,3,4},{2,3,4},{2,3,4}); // insert into collection_test values({3,4,5},{3,4,5},{3,4,5}); class SetOP_Sample { public static void main(String args[]) { String url = "jdbc:cubrid:127.0.0.1:33000:demodb:public::"; String user = ""; String passwd = ""; String sql = "select collection_test from collection_test"; try { Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); } catch (Exception e) { e.printStackTrace(); } try { CUBRIDConnection con = (CUBRIDConnection) DriverManager.getConnection(url, user, passwd); Statement stmt = con.createStatement(); CUBRIDResultSet rs = (CUBRIDResultSet) stmt.executeQuery(sql); while (rs.next()) { CUBRIDOID oid = rs.getOID(1); oid.addToSet("settest", Integer.valueOf(10)); oid.addToSet("multisettest", Integer.valueOf(20)); oid.addToSequence("listtest", 1, Integer.valueOf(30)); oid.addToSequence("listtest", 100, Integer.valueOf(100)); oid.putIntoSequence("listtest", 99, Integer.valueOf(99)); oid.removeFromSet("settest", Integer.valueOf(1)); oid.removeFromSet("multisettest", Integer.valueOf(2)); oid.removeFromSequence("listtest", 99); oid.removeFromSequence("listtest", 1); } con.commit(); rs.close(); stmt.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } } } ìžë™ ì¦ê°€ íŠ¹ì„±ì˜ ì¹¼ëŸ¼ ê°’ 검색 ----------------------------- ìžë™ ì¦ê°€ 특성(**AUTO_INCREMENT**)ì€ ìžë™ìœ¼ë¡œ ê° í–‰ì˜ ìˆ«ìž ê°’ì„ ì¦ê°€ ìƒì„±í•˜ëŠ” ì¹¼ëŸ¼ì— ëŒ€í•œ 특성으로서, 보다 ìžì„¸í•œ 사í•ì€ :ref:`column-definition` ì ˆì„ ì°¸ê³ í•œë‹¤. 수치형 ë„ë©”ì¸(**SMALLINT**, **INTEGER**, **DECIMAL** (*p*, 0), **NUMERIC** (*p*, 0))ì— ëŒ€í•´ì„œë§Œ ì •ì˜í• 수 있다. ìžë™ ì¦ê°€ íŠ¹ì„±ì€ JDBC 프로그램ì—서 ìžë™ ìƒì„±ëœ 키로 ì¸ì‹ë˜ê³ , ì´ í‚¤ì˜ ê²€ìƒ‰ì„ ì‚¬ìš©í•˜ë ¤ë©´ ìžë™ ìƒì„±ëœ 키 ê°’ì„ ê²€ìƒ‰í• í–‰ì„ ì‚½ìž…í• ì‹œê¸°ë¥¼ 표시해야 한다. ì´ë¥¼ 수행하기 위하여 **Connection.prepareStatement** 와 **Statement.execute** 메서드를 호출하여 플래그를 ì„¤ì •í•´ì•¼ 한다. ì´ë•Œ, ì‹¤í–‰ëœ ëª…ë ¹ë¬¸ì€ **INSERT** 문 ë˜ëŠ” **INSERT** within **SELECT** 문ì´ì–´ì•¼ 하며, 다른 ëª…ë ¹ë¬¸ì˜ ê²½ìš° JDBC 드ë¼ì´ë²„ê°€ 플래그를 ì„¤ì •í•˜ëŠ” 매개변수를 무시한다. **수행 단계** * ë‹¤ìŒ ë°©ë²• 중 하나를 사용하여 ìžë™ ìƒì„±ëœ 키를 ë°˜í™˜í•˜ë ¤ëŠ”ì§€ 표시한다. ìžë™ ì¦ê°€ 특성 ì¹¼ëŸ¼ì„ ì§€ì›í•˜ëŠ” ë°ì´í„°ë² ì´ìФ ì„œë²„ì˜ í…Œì´ë¸”ì— ëŒ€í•´ 다ìŒì˜ ì–‘ì‹ì„ 사용하며, ê° ì–‘ì‹ì€ ë‹¨ì¼ í–‰ **INSERT** ë¬¸ì— ëŒ€í•´ì„œë§Œ ì ìš© 가능하다. * 아래와 ê°™ì´ **PreparedStatement** ê°ì²´ë¥¼ 작성한다. .. code-block:: java Connection.prepareStatement(sql statement, Statement.RETURN_GENERATED_KEYS); * **Statement.execute** 메서드를 사용하여 í–‰ì„ ì‚½ìž…í• ê²½ìš°, 아래와 ê°™ì´ ì‚¬ìš©í•œë‹¤. .. code-block:: java Statement.execute(sql statement, Statement.RETURN_GENERATED_KEYS); * **PreparedStatement.getGeneratedKeys** 메서드 ë˜ëŠ” **Statement.getGeneratedKeys** 메서드를 호출하여 ìžë™ ìƒì„±ëœ 키 ê°’ì´ í¬í•¨ëœ **ResultSet** ê°ì²´ë¥¼ 검색한다. **ResultSet** ì—서 ìžë™ ìƒì„±ëœ í‚¤ì˜ ë°ì´í„° ìœ í˜•ì€ í•´ë‹¹ ë„ë©”ì¸ì˜ ë°ì´í„° ìœ í˜•ì— ìƒê´€ ì—†ì´ **DECIMAL** ì´ë‹¤. **ì˜ˆì œ** ë‹¤ìŒ ì˜ˆì œëŠ” ìžë™ ì¦ê°€ íŠ¹ì„±ì´ ìžˆëŠ” í…Œì´ë¸”ì„ ìƒì„±í•˜ê³ , ë°ì´í„°ë¥¼ í…Œì´ë¸”ì— ìž…ë ¥í•˜ì—¬, ìžë™ ì¦ê°€ 특성 ì¹¼ëŸ¼ì— ìžë™ ìƒì„±ëœ 키 ê°’ì´ ìž…ë ¥ë˜ê³ 해당 í‚¤ê°’ì´ **Statement.getGeneratedKeys** () 메서드를 통해 ì •ìƒì 으로 검색ë˜ëŠ”ì§€ë¥¼ ì 검하는 ì˜ˆì œì´ë‹¤. 앞서 설명한 ë‹¨ê³„ì— í•´ë‹¹í•˜ëŠ” ëª…ë ¹ë¬¸ì˜ ì½”ë©˜íŠ¸ì— ê° ë‹¨ê³„ë¥¼ 표시하였다. .. code-block:: java import java.sql.*; import java.math.*; import cubrid.jdbc.driver.*; Connection con; Statement stmt; ResultSet rs; java.math.BigDecimal iDColVar; ... stmt = con.createStatement(); // Create a Statement object // Create table with identity column stmt.executeUpdate( "CREATE TABLE EMP_PHONE (EMPNO CHAR(6), PHONENO CHAR(4), " + "IDENTCOL INTEGER AUTO_INCREMENT)"); stmt.execute( "INSERT INTO EMP_PHONE (EMPNO, PHONENO) " + "VALUES ('000010', '5555')", // Insert a row <Step 1> Statement.RETURN_GENERATED_KEYS); // Indicate you want automatically rs = stmt.getGeneratedKeys(); // generated keys // Retrieve the automatically <Step 2> // generated key value in a ResultSet. // Only one row is returned. // Create ResultSet for query while (rs.next()) { java.math.BigDecimal idColVar = rs.getBigDecimal(1); // Get automatically generated key value System.out.println("automatically generated key value = " + idColVar); } rs.close(); // Close ResultSet stmt.close(); // Close Statement BLOB/CLOB 사용 -------------- JDBCì—서 **LOB** ë°ì´í„°ë¥¼ 처리하는 ì¸í„°íŽ˜ì´ìŠ¤ëŠ” JDBC 4.0 ìŠ¤íŽ™ì„ ê¸°ë°˜ìœ¼ë¡œ 구현ë˜ì—ˆìœ¼ë©°, 다ìŒê³¼ ê°™ì€ ì œì•½ 사í•ì„ ê°€ì§„ë‹¤. * **BLOB**, **CLOB** ê°ì²´ë¥¼ ìƒì„±í• 때ì—는 순차 ì“°ê¸°ë§Œì„ ì§€ì›í•œë‹¤. ìž„ì˜ ìœ„ì¹˜ì— ëŒ€í•œ 쓰기는 ì§€ì›í•˜ì§€ 않는다. * ResultSetì—서 얻어온 **BLOB**, **CLOB** ê°ì²´ì˜ 메서드를 호출하여 **BLOB** , **CLOB** ë°ì´í„°ë¥¼ ë³€ê²½í• ìˆ˜ 없다. * **Blob.truncate** , **Clob.truncate** , **Blob.position** , **Clob.position** 메서드는 ì§€ì›í•˜ì§€ 않는다. * **BLOB** / **CLOB** 타입 ì¹¼ëŸ¼ì— ëŒ€í•´ **PreparedStatement.setAsciiStream** , **PreparedStatement.setBinaryStream** , **PreparedStatement.setCharacterStream** 메서드를 호출하여 **LOB** ë°ì´í„°ë¥¼ ë°”ì¸ë”©í• 수 없다. * JDBC 4.0ì„ ì§€ì›í•˜ì§€ 않는 환경(예: JDK 1.5 ì´í•˜)ì—서 **BLOB** / **CLOB** íƒ€ìž…ì„ ì‚¬ìš©í•˜ê¸° 위해서는 conn ê°ì²´ë¥¼ **CUBRIDConnection** 로 명시ì 타입 변환하여 사용하여야 한다. 아래 ì˜ˆì œë¥¼ ì°¸ê³ í•œë‹¤. .. code-block:: java //JDK 1.6 ì´ìƒ import java.sql.*; Connection conn = DriverManager.getConnection(url, id, passwd); Blob blob = conn.createBlob(); //JDK 1.6 미만 import java.sql.*; import cubrid.jdbc.driver.*; Connection conn = DriverManager.getConnection(url, id, passwd); Blob blob = ((CUBRIDConnection)conn).createBlob(); **LOB ë°ì´í„° ì €ìž¥** **LOB** 타입 ë°ì´í„°ë¥¼ ë°”ì¸ë”©í•˜ëŠ” ë°©ë²•ì€ ë‹¤ìŒê³¼ 같다. ì˜ˆì œë¥¼ ì°¸ê³ í•œë‹¤. * java.sql.Blob ë˜ëŠ” java.sql.Clob ê°ì²´ë¥¼ ìƒì„±í•˜ê³ ê·¸ ê°ì²´ì— íŒŒì¼ ë‚´ìš©ì„ ì €ìž¥í•œ 다ìŒ, PreparedStatementì˜ **setBlob** () í˜¹ì€ **setClob** ()ì„ ì‚¬ìš©í•œë‹¤. (ì˜ˆì œ 1) * 질ì˜ë¥¼ 한 다ìŒ, ê·¸ ResultSet ê°ì²´ì—서 java.sql.Blob í˜¹ì€ java.sql.Clob ê°ì²´ë¥¼ ì–»ê³ , ê·¸ ê°ì²´ë¥¼ PreparedStatementì—서 ë°”ì¸ë”©í•œë‹¤. (ì˜ˆì œ 2) **ì˜ˆì œ 1** .. code-block:: java Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); Connection conn = DriverManager.getConnection ("jdbc:cubrid:localhost:33000:image_db:user1:password1:", "", ""); PreparedStatement pstmt1 = conn.prepareStatement("INSERT INTO doc(image_id, doc_id, image) VALUES (?,?,?)"); pstmt1.setString(1, "image-21"); pstmt1.setString(2, "doc-21"); //Creating an empty file in the file system Blob bImage = conn.createBlob(); byte[] bArray = new byte[256]; ... //Inserting data into the external file. Position is start with 1. bImage.setBytes(1, bArray); //Appending data into the external file bImage.setBytes(257, bArray); ... pstmt1.setBlob(3, bImage); pstmt1.executeUpdate(); ... **ì˜ˆì œ 2** .. code-block:: java Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); Connection conn = DriverManager.getConnection ("jdbc:cubrid:localhost:33000:image_db:user1:password1:", "", ""); conn.setAutoCommit(false); PreparedStatement pstmt1 = conn.prepareStatement("SELECT image FROM doc WHERE image_id = ? "); pstmt1.setString(1, "image-21"); ResultSet rs = pstmt1.executeQuery(); while (rs.next()) { Blob bImage = rs.getBlob(1); PreparedStatement pstmt2 = conn.prepareStatement("INSERT INTO doc(image_id, doc_id, image) VALUES (?,?,?)"); pstmt2.setString(1, "image-22") pstmt2.setString(2, "doc-22") pstmt2.setBlob(3, bImage); pstmt2.executeUpdate(); pstmt2.close(); } pstmt1.close(); conn.commit(); conn.setAutoCommit(true); conn.close(); ... **LOB ë°ì´í„° 조회** **LOB** 타입 ë°ì´í„°ë¥¼ 조회하는 ë°©ë²•ì€ ë‹¤ìŒê³¼ 같다. * ResultSetì—서 **getBytes** () í˜¹ì€ **getString** () 메서드를 사용하여 ë°ì´í„°ë¥¼ 바로 ì¸ì¶œí•œë‹¤. (ì˜ˆì œ 1) * ResultSetì—서 **getBlob** () í˜¹ì€ **getClob** () 메서드를 호출하여 java.sql.Blob í˜¹ì€ java.sql.Clob ê°ì²´ë¥¼ ì–»ì€ ë‹¤ìŒ, ì´ ê°ì²´ì— 대해 **getBytes** () í˜¹ì€ **getSubString** () 메서드를 사용하여 ë°ì´í„°ë¥¼ ì¸ì¶œí•œë‹¤. (ì˜ˆì œ 2) **ì˜ˆì œ 1** .. code-block:: java Connection conn = DriverManager.getConnection ("jdbc:cubrid:localhost:33000:image_db:user1:password1:", "", ""); // ResetSetì—서 ì§ì ‘ ë°ì´í„° ì¸ì¶œ PrepareStatement pstmt1 = conn.prepareStatement("SELECT content FROM doc_t WHERE doc_id = ? "); pstmt1.setString(1, "doc-10"); ResultSet rs = pstmt1.executeQuery(); while (rs.next()) { String sContent = rs.getString(1); System.out.println("doc.content= "+sContent.); } **ì˜ˆì œ 2** .. code-block:: java Connection conn = DriverManager.getConnection ("jdbc:cubrid:localhost:33000:image_db:user1:password1:", "", ""); //ResultSetì—서 Blob ê°ì²´ë¥¼ ì–»ê³ Blob ê°ì²´ë¡œë¶€í„° ë°ì´í„° ì¸ì¶œ PrepareStatement pstmt2 = conn.prepareStatement("SELECT image FROM image_t WHERE image_id = ?"); pstmt2.setString(1,"image-20"); ResultSet rs = pstmt2.executeQuery(); while (rs.next()) { Blob bImage = rs.getBlob(1); Bytes[] bArray = bImange.getBytes(1, (int)bImage.length()); } .. note:: 칼럼ì—서 ì •ì˜í•œ í¬ê¸°ë³´ë‹¤ í° ë¬¸ìžì—´ì„ **INSERT** / **UPDATE** 하면 문ìžì—´ì´ ìž˜ë ¤ì„œ ìž…ë ¥ëœë‹¤. setBoolean ---------- prepareStatement.setBoolean(1, true) 는 다ìŒìœ¼ë¡œ ì§€ì •ëœë‹¤. * numeric 타입ì—ì„œì˜ 1. * string 타입ì—ì„œì˜ '1'. prepareStatement.setBooelan(1, false) 는 다ìŒìœ¼ë¡œ ì§€ì •ëœë‹¤. * numeric 타입ì—서 0. * string 타입ì—서 '0'. .. note:: ì´ì „ ë²„ì „ì—서 ë™ìž‘ ë°©ì‹ prepareStatement.setBoolean(1, true) ì€ ë‹¤ìŒìœ¼ë¡œ ì§€ì •ëœë‹¤. * 2008 R4.1, 9.0 ì—서는 BIT(1) íƒ€ìž…ì˜ 1 ì„ ì˜ë¯¸í•œë‹¤. * 2008 R4.3, 2008 R4.4, 9.1, 9.2, 9.3 ì—서는SHORT íƒ€ìž…ì˜ -128 ì„ ì˜ë¯¸í•œë‹¤. .. _jdbc-error-codes: JDBC ì—러 코드와 ì—러 메시지 ---------------------------- SQLExceptionì—서 ë°œìƒí•˜ëŠ” JDBC ì—러 코드는 다ìŒê³¼ 같다. * ëª¨ë“ ì—러 번호는 0보다 ìž‘ì€ ìŒìˆ˜ì´ë‹¤. * SQLException ë°œìƒ ì‹œ ì—러 번호는 SQLException.getErrorCode(), ì—러 메시지는 SQLException.getMessage()를 통해 확ì¸í• 수 있다. * ì—러 번호가 -21001부터 -21999 사ì´ì´ë©´, CUBRID JDBC 메서드ì—서 ë°œìƒí•˜ëŠ” ì—러ì´ë‹¤. * ì—러 번호가 -10000부터 -10999 사ì´ì´ë©´, CASì—서 ë°œìƒí•˜ëŠ” ì—러를 JDBCê°€ ì „ë‹¬ë°›ì•„ 반환하는 ì—러ì´ë‹¤. CAS ì—러는 :ref:`cas-error`\ 를 ì°¸ê³ í•œë‹¤. * ì—러 번호가 0부터 -9999 사ì´ì´ë©´, DB 서버ì—서 ë°œìƒí•˜ëŠ” ì—러ì´ë‹¤. DB 서버 ì—러는 :ref:`database-server-error`\ 를 ì°¸ê³ í•œë‹¤. +---------------+--------------------------------------------------------------------------------------+ | ì—러 번호 | ì—러 메시지 | +===============+======================================================================================+ | -21001 | Index's Column is Not Object | +---------------+--------------------------------------------------------------------------------------+ | -21002 | Server error | +---------------+--------------------------------------------------------------------------------------+ | -21003 | Cannot communicate with the broker | +---------------+--------------------------------------------------------------------------------------+ | -21004 | Invalid cursor position | +---------------+--------------------------------------------------------------------------------------+ | -21005 | Type conversion error | +---------------+--------------------------------------------------------------------------------------+ | -21006 | Missing or invalid position of the bind variable provided | +---------------+--------------------------------------------------------------------------------------+ | -21007 | Attempt to execute the query when not all the parameters are binded | +---------------+--------------------------------------------------------------------------------------+ | -21008 | Internal Error: NULL value | +---------------+--------------------------------------------------------------------------------------+ | -21009 | Column index is out of range | +---------------+--------------------------------------------------------------------------------------+ | -21010 | Data is truncated because receive buffer is too small | +---------------+--------------------------------------------------------------------------------------+ | -21011 | Internal error: Illegal schema type | +---------------+--------------------------------------------------------------------------------------+ | -21012 | File access failed | +---------------+--------------------------------------------------------------------------------------+ | -21013 | Cannot connect to a broker | +---------------+--------------------------------------------------------------------------------------+ | -21014 | Unknown transaction isolation level | +---------------+--------------------------------------------------------------------------------------+ | -21015 | Internal error: The requested information is not available | +---------------+--------------------------------------------------------------------------------------+ | -21016 | The argument is invalid | +---------------+--------------------------------------------------------------------------------------+ | -21017 | Connection or Statement might be closed | +---------------+--------------------------------------------------------------------------------------+ | -21018 | Internal error: Invalid argument | +---------------+--------------------------------------------------------------------------------------+ | -21019 | Cannot communicate with the broker or received invalid packet | +---------------+--------------------------------------------------------------------------------------+ | -21020 | No More Result | +---------------+--------------------------------------------------------------------------------------+ | -21021 | This ResultSet do not include the OID | +---------------+--------------------------------------------------------------------------------------+ | -21022 | Command is not insert | +---------------+--------------------------------------------------------------------------------------+ | -21023 | Error | +---------------+--------------------------------------------------------------------------------------+ | -21024 | Request timed out | +---------------+--------------------------------------------------------------------------------------+ | -21101 | Attempt to operate on a closed Connection. | +---------------+--------------------------------------------------------------------------------------+ | -21102 | Attempt to access a closed Statement. | +---------------+--------------------------------------------------------------------------------------+ | -21103 | Attempt to access a closed PreparedStatement. | +---------------+--------------------------------------------------------------------------------------+ | -21104 | Attempt to access a closed ResultSet. | +---------------+--------------------------------------------------------------------------------------+ | -21105 | Not supported method | +---------------+--------------------------------------------------------------------------------------+ | -21106 | Unknown transaction isolation level. | +---------------+--------------------------------------------------------------------------------------+ | -21107 | invalid URL - | +---------------+--------------------------------------------------------------------------------------+ | -21108 | The database name should be given. | +---------------+--------------------------------------------------------------------------------------+ | -21109 | The query is not applicable to the executeQuery(). Use the executeUpdate() instead. | +---------------+--------------------------------------------------------------------------------------+ | -21110 | The query is not applicable to the executeUpdate(). Use the executeQuery() instead. | +---------------+--------------------------------------------------------------------------------------+ | -21111 | The length of the stream cannot be negative. | +---------------+--------------------------------------------------------------------------------------+ | -21112 | An IOException was caught during reading the inputstream. | +---------------+--------------------------------------------------------------------------------------+ | -21113 | Not supported method, because it is deprecated. | +---------------+--------------------------------------------------------------------------------------+ | -21114 | The object does not seem to be a number. | +---------------+--------------------------------------------------------------------------------------+ | -21115 | Missing or invalid position of the bind variable provided. | +---------------+--------------------------------------------------------------------------------------+ | -21116 | The column name is invalid. | +---------------+--------------------------------------------------------------------------------------+ | -21117 | Invalid cursor position. | +---------------+--------------------------------------------------------------------------------------+ | -21118 | Type conversion error. | +---------------+--------------------------------------------------------------------------------------+ | -21119 | Internal error: The number of attributes is different from the expected. | +---------------+--------------------------------------------------------------------------------------+ | -21120 | The argument is invalid. | +---------------+--------------------------------------------------------------------------------------+ | -21121 | The type of the column should be a collection type. | +---------------+--------------------------------------------------------------------------------------+ | -21122 | Attempt to operate on a closed DatabaseMetaData. | +---------------+--------------------------------------------------------------------------------------+ | -21123 | Attempt to call a method related to scrollability of non-scrollable ResultSet. | +---------------+--------------------------------------------------------------------------------------+ | -21124 | Attempt to call a method related to sensitivity of non-sensitive ResultSet. | +---------------+--------------------------------------------------------------------------------------+ | -21125 | Attempt to call a method related to updatability of non-updatable ResultSet. | +---------------+--------------------------------------------------------------------------------------+ | -21126 | Attempt to update a column which cannot be updated. | +---------------+--------------------------------------------------------------------------------------+ | -21127 | The query is not applicable to the executeInsert(). | +---------------+--------------------------------------------------------------------------------------+ | -21128 | The argument row can not be zero. | +---------------+--------------------------------------------------------------------------------------+ | -21129 | Given InputStream object has no data. | +---------------+--------------------------------------------------------------------------------------+ | -21130 | Given Reader object has no data. | +---------------+--------------------------------------------------------------------------------------+ | -21131 | Insertion query failed. | +---------------+--------------------------------------------------------------------------------------+ | -21132 | Attempt to call a method related to scrollability of TYPE_FORWARD_ONLY Statement. | +---------------+--------------------------------------------------------------------------------------+ | -21133 | Authentication failure | +---------------+--------------------------------------------------------------------------------------+ | -21134 | Attempt to operate on a closed PooledConnection. | +---------------+--------------------------------------------------------------------------------------+ | -21135 | Attempt to operate on a closed XAConnection. | +---------------+--------------------------------------------------------------------------------------+ | -21136 | Illegal operation in a distributed transaction | +---------------+--------------------------------------------------------------------------------------+ | -21137 | Attempt to access a CUBRIDOID associated with a Connection which has been closed. | +---------------+--------------------------------------------------------------------------------------+ | -21138 | The table name is invalid. | +---------------+--------------------------------------------------------------------------------------+ | -21139 | Lob position to write is invalid. | +---------------+--------------------------------------------------------------------------------------+ | -21140 | Lob is not writable. | +---------------+--------------------------------------------------------------------------------------+ | -21141 | Request timed out. | +---------------+--------------------------------------------------------------------------------------+ .. _jdbc-examples: JDBC ì˜ˆì œ 프로그램 ================== 다ìŒì€ JDBC 드ë¼ì´ë²„를 통해 CUBRIDì— ì ‘ì†í•˜ì—¬ ë°ì´í„°ë¥¼ 조회, 삽입하는 ê²ƒì„ ê°„ë‹¨í•˜ê²Œ 구성한 ì˜ˆì œì´ë‹¤. ì˜ˆì œë¥¼ ì‹¤í–‰í•˜ë ¤ë©´ ë¨¼ì € ì ‘ì†í•˜ê³ ìž í•˜ëŠ” ë°ì´í„°ë² ì´ìŠ¤ì™€ CUBRID 브로커가 구ë™ë˜ì–´ 있어야 한다. ì˜ˆì œì—서는 설치 시 ìžë™ìœ¼ë¡œ ìƒì„±ë˜ëŠ” demodb ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용한다. **JDBC 드ë¼ì´ë²„ 로드** CUBRIDì— ì ‘ì†í•˜ê¸° 위해서는 **Class** ì˜ **forName** () 메서드를 사용하여 JDBC 드ë¼ì´ë²„를 로드해야 한다. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`jdbc-overview` 를 ì°¸ê³ í•œë‹¤. .. code-block:: java Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); **ë°ì´í„°ë² ì´ìФ ì—°ê²°** JDBC 드ë¼ì´ë²„를 로드한 후 **DriverManager** ì˜ **getConnection** () 메서드를 사용하여 ë°ì´í„°ë² ì´ìŠ¤ì™€ 연결한다. **Connection** ê°ì²´ë¥¼ ìƒì„±í•˜ê¸° 위해서는 ë°ì´í„°ë² ì´ìŠ¤ì˜ ìœ„ì¹˜ë¥¼ ê¸°ìˆ í•˜ê¸° 위한 URL, ë°ì´í„°ë² ì´ìŠ¤ì˜ ì‚¬ìš©ìž ì´ë¦„, 암호 ë“±ì˜ ì •ë³´ê°€ ì§€ì •ë˜ì–´ì•¼ 한다. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`jdbc-connection-conf` ì„ ì°¸ê³ í•œë‹¤. .. code-block:: java String url = "jdbc:cubrid:localhost:33000:demodb:::"; String userid = "dba"; String password = ""; Connection conn = DriverManager.getConnection(url,userid,password); DataSource ê°ì²´ë¥¼ 사용하여 ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í• ìˆ˜ë„ ìžˆë‹¤. ì—°ê²° URL 문ìžì—´ì— ì—°ê²° ì†ì„±(connection property)ì„ í¬í•¨í•˜ê³ ìž í•˜ëŠ” 경우, CUBRIDDataSourceì— êµ¬í˜„ëœ setURL 메서드를 ì‚¬ìš©í• ìˆ˜ 있다. .. code-block:: java import cubrid.jdbc.driver.CUBRIDDataSource; ... ds = new CUBRIDDataSource(); ds.setURL("jdbc:cubrid:127.0.0.1:33000:demodb:::?charset=utf8&logSlowQueries=true&slowQueryThresholdMillis=1000&logTraceApi=true&logTraceNetwork=true"); CUBRIDDataSourceì— ëŒ€í•œ ìžì„¸í•œ ì„¤ëª…ì€ :ref:`jdbc-conn-datasource`\ ì„ ì°¸ê³ í•œë‹¤. **DataSource ê°ì²´ë¡œ ì—°ê²°** 다ìŒì€ CUBRIDì— êµ¬í˜„ëœ DataSourceì¸ CUBRIDDataSourceì˜ setURLì„ ì´ìš©í•˜ì—¬ DBì— ì ‘ì†í•˜ê³ , 여러 ê°œì˜ ìŠ¤ë ˆë“œì—서 SELECT ë¬¸ì„ ì‹¤í–‰í•˜ëŠ” ì˜ˆì œì´ë‹¤. 소스는 DataSourceMT.java와 DataSourceExample.javaì˜ ë‘ ê°œë¡œ ë‚˜ë‰˜ì–´ì ¸ 있다. * DataSourceMT.java는 main 함수를 í¬í•¨í•˜ê³ 있다. CUBRIDDataSource ê°ì²´ë¥¼ ìƒì„±í•˜ê³ setURL 메서드를 호출하여 DBì— ì ‘ì†í•œ 후, 여러 ê°œì˜ ìŠ¤ë ˆë“œê°€ DataSourceExample.test 메서드를 수행한다. * DataSourceExample.javaì—는 DataSourceMT.javaì—서 ìƒì„±ëœ ìŠ¤ë ˆë“œê°€ ìˆ˜í–‰í• DataSourceExample.test 메서드가 구현ë˜ì–´ 있다. *DataSourceMT.java* .. code-block:: java import cubrid.jdbc.driver.*; public class DataSourceMT { static int num_thread = 20; public static void main(String[] args) { CUBRIDDataSource ds = null; thrCPDSMT thread[]; ds = new CUBRIDDataSource(); ds.setURL("jdbc:cubrid:127.0.0.1:33000:demodb:::?charset=utf8&logSlowQueries=true&slowQueryThresholdMillis=1000&logTraceApi=true&logTraceNetwork=true"); try { thread = new thrCPDSMT[num_thread]; for (int i = 0; i < num_thread; i++) { Thread.sleep(1); thread[i] = new thrCPDSMT(i, ds); try { Thread.sleep(1); thread[i].start(); } catch (Exception e) { } } for (int i = 0; i < num_thread; i++) { thread[i].join(); System.err.println("join thread : " + i); } } catch (Exception e) { e.printStackTrace(); System.exit(-1); } } } class thrCPDSMT extends Thread { CUBRIDDataSource thread_ds; int thread_id; thrCPDSMT(int tid, CUBRIDDataSource ds) { thread_id = tid; thread_ds = ds; } public void run() { try { DataSourceExample.test(thread_ds); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } } } *DataSourceExample.java* .. code-block:: java import java.sql.*; import javax.sql.*; import cubrid.jdbc.driver.*; public class DataSourceExample { public static void printdata(ResultSet rs) throws SQLException { try { ResultSetMetaData rsmd = null; rsmd = rs.getMetaData(); int numberofColumn = rsmd.getColumnCount(); while (rs.next()) { for (int j = 1; j <= numberofColumn; j++) System.out.print(rs.getString(j) + " "); System.out.println(""); } } catch (SQLException e) { System.out.println("SQLException : " + e.getMessage()); throw e; } } public static void test(CUBRIDDataSource ds) throws Exception { Connection connection = null; Statement statement = null; ResultSet resultSet = null; for (int i = 1; i <= 20; i++) { try { connection = ds.getConnection("dba", ""); statement = connection.createStatement(); String SQL = "SELECT * FROM code"; resultSet = statement.executeQuery(SQL); while (resultSet.next()) { printdata(resultSet); } if (i % 5 == 0) { System.gc(); } } catch (Exception e) { e.printStackTrace(); } finally { closeAll(resultSet, statement, connection); } } } public static void closeAll(ResultSet resultSet, Statement statement, Connection connection) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { } } if (statement != null) { try { statement.close(); } catch (SQLException e) { } } if (connection != null) { try { connection.close(); } catch (SQLException e) { } } } } **ë°ì´í„°ë² ì´ìФ ì¡°ìž‘(ì§ˆì˜ ìˆ˜í–‰ ë° ResultSet 처리)** ì ‘ì†ëœ ë°ì´í„°ë² ì´ìŠ¤ì— ì§ˆì˜ë¬¸ì„ ì „ë‹¬í•˜ê³ ì‹¤í–‰ì‹œí‚¤ê¸° 위하여 **Statement** , **PrepardStatement** , **CallableStatement** ê°ì²´ë¥¼ ìƒì„±í•œë‹¤. **Statement** ê°ì²´ê°€ ìƒì„±ë˜ë©´, **Statement** ê°ì²´ì˜ **executeQuery** () 메서드나 **executeUpdate** () 메서드를 사용하여 질ì˜ë¬¸ì„ 실행한다. **next** () 메서드를 사용하여 **executeQuery** () ë©”ì„œë“œì˜ ê²°ê³¼ë¡œ ë°˜í™˜ëœ **ResultSet** ì˜ ë‹¤ìŒ í–‰ì„ ì²˜ë¦¬í• ìˆ˜ 있다. .. note:: 2008 R4.x ì´í•˜ ë²„ì „ì—서 ì§ˆì˜ ìˆ˜í–‰ 후 ì»¤ë°‹ì„ ìˆ˜í–‰í•˜ë©´ ResultSetì„ ìžë™ìœ¼ë¡œ 닫으므로, 커밋 ì´í›„ì—는 ResultSetì„ ì‚¬ìš©í•˜ì§€ 않아야 한다. CUBRID는 기본ì 으로 ìžë™ 커밋 모드로 수행ë˜ë¯€ë¡œ, ì´ë¥¼ ì›í•˜ì§€ 않으면 반드시 **conn.setAutocommit(false);** 를 ì½”ë“œì— ëª…ì‹œí•´ì•¼ 한다. 9.1 ì´ìƒ ë²„ì „ë¶€í„°ëŠ” :ref:`커서 ìœ ì§€(cursor holdability) <cursor-holding>`\ê°€ ì§€ì›ë˜ë¯€ë¡œ 커밋 ì´í›„ì—ë„ **ResultSet**\ ì„ ì‚¬ìš©í• ìˆ˜ 있다. **ë°ì´í„°ë² ì´ìФ ì—°ê²° í•´ì œ** ê° ê°ì²´ì— 대해 **close** () 메서드를 수행하여 ë°ì´í„°ë² ì´ìŠ¤ì™€ì˜ ì—°ê²°ì„ í•´ì œí• ìˆ˜ 있다. **CREATE, INSERT** 다ìŒì€ *demodb*\ ì— ì ‘ì†í•˜ì—¬ í…Œì´ë¸”ì„ ìƒì„±í•˜ê³ , prepared statement로 질ì˜ë¬¸ì„ 수행한 후 질ì˜ë¥¼ 롤백시키는 ì˜ˆì œ 코드ì´ë‹¤. .. code-block:: java import java.util.*; import java.sql.*; public class Basic { public static Connection connect() { Connection conn = null; try { Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); conn = DriverManager.getConnection("jdbc:cubrid:localhost:33000:demodb:::","dba",""); conn.setAutoCommit (false) ; } catch ( Exception e ) { System.err.println("SQLException : " + e.getMessage()); } return conn; } public static void printdata(ResultSet rs) { try { ResultSetMetaData rsmd = null; rsmd = rs.getMetaData(); int numberofColumn = rsmd.getColumnCount(); while (rs.next ()) { for(int j=1; j<=numberofColumn; j++ ) System.out.print(rs.getString(j) + " " ); System.out.println(""); } } catch ( Exception e ) { System.err.println("SQLException : " + e.getMessage()); } } public static void main(String[] args) throws Exception { Connection conn = null; Statement stmt = null; ResultSet rs = null; PreparedStatement preStmt = null; try { conn = connect(); stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE xoo ( a INT, b INT, c CHAR(10))"); preStmt = conn.prepareStatement("INSERT INTO xoo VALUES(?,?,'100')"); preStmt.setInt (1, 1) ; preStmt.setInt (2, 1*10) ; int rst = preStmt.executeUpdate () ; rs = stmt.executeQuery("select a,b,c from xoo" ); printdata(rs); conn.rollback(); stmt.close(); conn.close(); } catch ( Exception e ) { conn.rollback(); System.err.println("SQLException : " + e.getMessage()); } finally { if ( conn != null ) conn.close(); } } } **SELECT** 다ìŒì€ CUBRID 설치 시 기본 ì œê³µë˜ëŠ” *demodb* ì— ì ‘ì†í•˜ì—¬ **SELECT** 질ì˜ë¥¼ 수행하는 ì˜ˆì œì´ë‹¤. .. code-block:: java import java.sql.*; public class SelectData { public static void main(String[] args) throws Exception { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); conn = DriverManager.getConnection("jdbc:cubrid:localhost:33000:demodb:::","dba",""); String sql = "SELECT name, players FROM event"; stmt = conn.createStatement(); rs = stmt.executeQuery(sql); while(rs.next()) { String name = rs.getString("name"); String players = rs.getString("players"); System.out.println("name ==> " + name); System.out.println("Number of players==> " + players); System.out.println("\n=========================================\n"); } rs.close(); stmt.close(); conn.close(); } catch ( SQLException e ) { System.err.println(e.getMessage()); } catch ( Exception e ) { System.err.println(e.getMessage()); } finally { if ( conn != null ) conn.close(); } } } **INSERT** 다ìŒì€ CUBRID 설치 시 기본 ì œê³µë˜ëŠ” *demodb* ì— ì ‘ì†í•˜ì—¬ **INSERT** 질ì˜ë¥¼ 수행하는 ì˜ˆì œì´ë‹¤. ë°ì´í„° ì‚ì œ ë° ê°±ì‹ ë°©ë²•ì€ ë°ì´í„° 삽입 방법과 ë™ì¼í•˜ë¯€ë¡œ 아래 코드ì—서 질ì˜ë¬¸ë§Œ 변경하여 ì‚¬ìš©í• ìˆ˜ 있다. .. code-block:: java import java.sql.*; public class insertData { public static void main(String[] args) throws Exception { Connection conn = null; Statement stmt = null; try { Class.forName("cubrid.jdbc.driver.CUBRIDDriver"); conn = DriverManager.getConnection("jdbc:cubrid:localhost:33000:demodb:::","dba",""); String sql = "insert into olympic(host_year, host_nation, host_city, opening_date, closing_date) values (2008, 'China', 'Beijing', to_date('08-08-2008','mm-dd-yyyy'), to_date('08-24-2008','mm-dd-yyyy'))"; stmt = conn.createStatement(); stmt.executeUpdate(sql); System.out.println("ë°ì´í„°ê°€ ìž…ë ¥ë˜ì—ˆìŠµë‹ˆë‹¤."); stmt.close(); } catch ( SQLException e ) { System.err.println(e.getMessage()); } catch ( Exception e ) { System.err.println(e.getMessage()); } finally { if ( conn != null ) conn.close(); } } } JDBC API ======== JDBC APIì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ Java API Specification 문서(https://docs.oracle.com/javase/7/docs/api/)를 ì°¸ê³ í•œë‹¤. 기타 Javaì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ Java SE Documentation 문서(https://www.oracle.com/technetwork/java/javase/documentation/index.htm)를 ì°¸ê³ í•œë‹¤. :ref:`커서 ìœ ì§€(cursor holdability) <cursor-holding>`\ 와 ê´€ë ¨í•˜ì—¬ ì„¤ì •ì„ ëª…ì‹œí•˜ì§€ 않으면 기본으로 커서가 ìœ ì§€ëœë‹¤. 다ìŒì€ CUBRIDì—서 ì§€ì›í•˜ëŠ” JDBC 표준 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ ë° í™•ìž¥ ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ ì •ë¦¬í•œ 목ë¡ì´ë‹¤. JDBC 2.0 ìŠ¤íŽ™ì— í¬í•¨ëœ 메서드 중 ì¼ë¶€ëŠ” ì§€ì›í•˜ì§€ 않으므로 프로그램 작성 시 주ì˜í•œë‹¤. **JDBC ì¸í„°íŽ˜ì´ìФ ì§€ì› ì—¬ë¶€** =========================== ================================= ========================================================= JDBC 표준 ì¸í„°íŽ˜ì´ìФ CUBRID 확장 ì¸í„°íŽ˜ì´ìФ ì§€ì› ì—¬ë¶€ =========================== ================================= ========================================================= java.sql.Blob ì§€ì› java.sql.CallableStatement ì§€ì› java.sql.Clob ì§€ì› java.sql.Connection ì§€ì› java.sql.DatabaseMetaData ì§€ì› java.sql.Driver ì§€ì› java.sql.PreparedStatement java.sql.CUBRIDPreparedStatement ì§€ì› java.sql.ResultSet java.sql.CUBRIDResultSet ì§€ì› java.sql.ResultSetMetaData java.sql.CUBRIDResultSetMetaData ì§€ì› N/A CUBRIDOID ì§€ì› java.sql.Statement java.sql.CUBRIDStatement JDBC 3.0ì˜ getGeneratedKeys() 메서드 ì§€ì› java.sql.DriverManager ì§€ì› Java.sql.SQLException Java.sql.CUBRIDException ì§€ì› java.sql.Array ë¯¸ì§€ì› java.sql.ParameterMetaData ë¯¸ì§€ì› java.sql.Ref ë¯¸ì§€ì› java.sql.Savepoint ë¯¸ì§€ì› java.sql.SQLData ë¯¸ì§€ì› java.sql.SQLInput ë¯¸ì§€ì› java.sql.Struct ë¯¸ì§€ì› =========================== ================================= ========================================================= .. note:: * :ref:`커서 ìœ ì§€(cursor holdability) <cursor-holding>`\ 와 ê´€ë ¨í•˜ì—¬ ì„¤ì •ì„ ëª…ì‹œí•˜ì§€ 않으면 기본으로 커서가 ìœ ì§€ëœë‹¤. * 2008 R4.3부터 ìžë™ ì»¤ë°‹ì´ ONì¼ ë•Œ 질ì˜ë¬¸ì„ ì¼ê´„ 처리하는 ë©”ì„œë“œì˜ ë™ìž‘ ë°©ì‹ì´ 변경ë˜ì—ˆìŒì— 주ì˜í•œë‹¤. 질ì˜ë¬¸ì„ ì¼ê´„ 처리하는 메서드는 PreparedStatement.executeBatch와 Statement.executeBatchì´ë‹¤. ì´ë“¤ì€ 2008 R4.1 ë²„ì „ê¹Œì§€ ìžë™ 커밋 모드ì—서 ë°°ì—´ ë‚´ì˜ ëª¨ë“ ì§ˆì˜ë¥¼ 수행한 í›„ì— ì»¤ë°‹í–ˆìœ¼ë‚˜, 2008 R4.3ë²„ì „ë¶€í„°ëŠ” ê° ì§ˆì˜ë¥¼ ìˆ˜í–‰í• ë•Œë§ˆë‹¤ 커밋하ë„ë¡ ë³€ê²½ë˜ì—ˆë‹¤. * ìžë™ ì»¤ë°‹ì´ OFFì¼ ë•Œ 질ì˜ë¬¸ì„ ì¼ê´„ 처리하는 메서드ì—서 ë°°ì—´ ë‚´ì˜ ì§ˆì˜ ìˆ˜í–‰ 중 ì¼ë¶€ì—서 ì¼ë°˜ì ì¸ ì˜¤ë¥˜ê°€ ë°œìƒí•˜ëŠ” 경우, ì´ë¥¼ ê±´ë„ˆë›°ê³ ë‹¤ìŒ ì§ˆì˜ë¥¼ ê³„ì† ìˆ˜í–‰í•œë‹¤. 그러나, êµì°© ìƒíƒœê°€ ë°œìƒí•˜ë©´ 트랜ìžì…˜ì„ ë¡¤ë°±í•˜ê³ ì˜¤ë¥˜ 처리한다.