260 likes | 323 Vues
CUBRIDSUS-10123, 10355. 요구사항. CUBRIDSUS-10123 사용자 ( 드라이버 ) 에서 SHARD 메타 정보를 알 수 있어야 함 CQB 에서 SAHRD 메타 정보를 조회할 수 있어야 함.
E N D
CUBRIDSUS-10123사용자(드라이버)에서 SHARD 메타 정보를 알 수 있어야 함 CQB 에서 SAHRD 메타 정보를 조회할 수 있어야 함
CUBRIDSUS-10355사용자가 요청한 질의가 어느 SHARD 에서 처리되었는지 확인할 수 있는 방법이 필요함. CQB SQL Execution Results panel 에서 modify 수행하는 경우, Result가 어느 shard에서 수행된 결과인지를 알 수 있어야 적절한 SHARD 식별자를HINT로 추가하여 UPDATE 수행 가능함.
getMetaData CUBRIDDatabaseMetaDatagetMetaData() JDBC 표준에 정의된 인터페이스로서, SHARD가 지원되는 경우 SHARD #0 의 DatabaseMetaData를 반환 parametervoid returnsCUBRIDDatabaseMetaData throwsSQLException < cubrid.jdbc.drive.CUBRIDConnection >
getShardMetadata CUBRIDShardMetadatagetShardMetaData() connection 으로부터 CUBRIDShardMetaData를 생성하여 반환 parametervoid returnsCUBRIDShardMetaData throwsSQLException < cubrid.jdbc.drive.CUBRIDConnection >
getShardId intgetShardId() 해당 SHARD DB의 SHARD 식별자를 반환 parameter void returnsSHARD 식별자 (0 < SHARD_ID) - 유효하지 않은 SHARD 식별자 < cubrid.jdbc.drive.CUBRIDDatabaseMetaData>
getShardDBName StringgetShardDBName() 해당 SHARD DB의 실제 DB 이름을 반환 parametervoid returns실제 SHARD DB 이름 < cubrid.jdbc.drive.CUBRIDDatabaseMetaData>
getShardDBServer StringgetShardDBServer() 해당 SHARD DB연결 설정 정보를 반환 parametervoid returnsSHARD DB Server connection info CUBRID - hostnameMYSQL - hostname:portORACLE - tns string < cubrid.jdbc.drive.CUBRIDDatabaseMetaData>
getShardId intgetShardId() 해당 Connection 에서 마지막으로 요청 처리한 SHARD 식별자를 반환 parametervoid returnsSHARD 식별자 < cubrid.jdbc.drive.CUBRIDConnection >
isShard boolisShard() 해당 Connection의 sharding여부 parametervoid returnsshard 가능 여부 (true) – shard 가능 (false) – shard 불가능 < cubrid.jdbc.drive.CUBRIDConnection >
getShardId intgetShardId() 해당 Statement를 마지막으로 처리한 SHARD 식별자를 반환 parameter void returns SHARD 식별자 < cubrid.jdbc.drive.CUBRIDStatement>
getShardCount intgetShardCount() SHARD DB 의 개수를 반환 parametervoid returnsSHARD 식별자 < cubrid.jdbc.drive.CUBRIDShardMetaData>
getMetaData CUBRIDDatabaseMetaDatagetMetaData(intsharId) 각 SHARD DB의 CUBRIDDatabaseMetaData를 반환 parametervoid returnsCUBRIDDatabaseMetaData < cubrid.jdbc.drive.CUBRIDShardMetaData>
try { COnnection = DriverManager.getConnection(url, dbUser, dbPasswd); if (Connection.isShard()) { CUBRIDShardMetadatasmd = Connection.getShardMetaData(); intshardCount = smd.getCount(); for (inti=0; i < shardCount; i++) { CURBIDDatabaseMetaData md = smd.getDataBaseMetadata(); // print shard metadata System.out.printf("[%d] DBMAME:%s, SERVER:%s \n", md.getShardId(), md.getShardDBName(), md.getShardDBServer()); // get tables ResultSet res = md.getTables(null, null, null, new String[] {"TABLE"}); while(res.next()) {} } } } catch (SQLException e) { ;; } 예제 #1 : 각 SHARD DB 의 schema 조회
try { connection = DriverManager.getConnection(url, dbUser, dbPasswd); String query = "SELECT * FROM STUDENT WHERE SHARD_KEY = /*+ SHARD_KEY */ ?"; PreparedStatementqueryStmt = connection.preparedStatement(query); // bind parameter // ... queryStmt.executeQuery(); // fetch result // ... // get shard identifier if (connection.isShard()) { intshardId = ((CUBRIDPreparedStmt)queryStmt).getShardId(); System.out.printf("SHARD_ID:%d \n", shardId); } // close stmt and connection // ... } catch (SQLException e) { ;; } 예제 #2 : 실행한 statement 의 SHARD 식별자 확인
cci_get_shard_info intcci_get_shard_info(intcon_handle, T_CCI_SHARD_INFO ** shard_info, T_CCI_ERROR * err_buf) SHARD 메타 정보를 반환 parametercon_handle(IN) : connection handleshard_info(OUT) : SHARD 메타데이터err_buf(OUT) : CCI_ERROR returnsCCI_ER_SHARD_NOT_SUPPORTED 또는 그 외 에러 코드
cci_shard_info_free voidcci_shard_info_free(T_CCI_SHARD_INFO * shard_info) SAHRD 메타 정보 메모리 해제 parameter shard_info(IN) : SHARD 메타데이터 returnsvoid
cci_schema_info intcci_schema_info(intcon_handle, T_CCI_SCHEMA_TYPE type, char * class_name, char * attr_name, charflag, T_CCI_ERROR * err_buf) SHARD 환경에서는 SHARD #0 의 schema 정보를 반환 parameter returnsCCI 에러 코드
cci_shard_schema_info intcci_shard_schema_info(intcon_handle, intshard_id, T_CCI_SCHEMA_TYPE type, char * class_name, char * attr_name,char flag, T_CCI_ERROR * err_buf) 해당 SHARDDB의 schema 정보를 반환 parameter shard_id(IN) : SHARD 식별자 returnsCCI 에러 코드
cci_get_shard_id_with_con_handle intcci_get_shard_id_with_con_handle (intconn_handle, int * shard_id, T_CCI_ERROR * err_buf) 해당 connection handle 에서 마지막으로 처리한 SHARD 식별자를 반환 cci_execute_batch처리를 위함 parametercon_handle(IN) : connection handleshard_id(OUT) : SHARD 식별자err_buf(OUT) : CCI ERROR returnsCCI 에러 코드
cci_get_shard_id_with_req_handle intcci_get_shard_id_with_req_handle (intreq_handle, int * shard_id, T_CCI_ERROR * err_buf) 해당 request handle 에서 마지막으로 처리한 SHARD 식별자를 반환 parameterreq_handle(IN) : request handleshard_id(OUT) : SHARD 식별자err_buf(OUT) : CCI ERROR returnsCCI 에러 코드
cci_is_shard intcci_is_shard (intcon_handle, T_CCI_ERROR * err_buf) 해당 connection handle 의 shard 여부 parametercon_handle(IN)err_buf(OUT) returns (1) shard 가능 (0) shard 불가능
inti, ret; intconn_handle; T_CCI_SAHRD_INFO * shard_info = NULL; T_CCI_ERROR err_buf; // create cci connection // ... if (cci_is_shard(con_handle, &err_buf)) { // get shard info ret = cci_get_shard_info(con_handle, &shard_info, &err_buf); if (ret < 0) { return ret; } for (i=0;i<shard_info.shard_count; i++) { // print shard info printf("SHARD_ID:%d, SHARD_DB:%s, SHARD_SERVER:%s \n", shard_info.shard[i].shard_id, shard_info.shard[i].db_name, shard_info.shard[i].shard_server); // get table schema { T_CCI_SCHEMA_TYPE type = CCI_SCH_CLASS; char * class_name = NULL; char * attr_name = NULL; ret = cci_shard_schema_info(con_handle, shard_info.shard[i].shard_id, type, class_name, attr_name, NULL, &err_buf); // ... } } // release shard info cci_shard_info_free(shard_info); } 예제 #1 : 각 SHARD DB 의 schema 조회