연동가이드

연동가이드

주의사항

DATA TYPE Mapping

GOLDILOCKS Lite의 source data type과 ODBC/JDBC의 타입은 다음과 같이 설정된다.

SOURCE DATA TYPE

ODBC TYPE

JDBC TYPE

C TYPE

short

SQL_SMALLINT

short

SQL_C_SSHORT

integer

SQL_INTEGER

int

SQL_C_SLONG

char

SQL_CHAR

java.lang.String

SQL_CHAR

long

SQL_BIGINT

bigint

SQL_C_DOUBLE

float

SQL_DOUBLE

double

SQL_C_DOUBLE

double

SQL_DOUBLE

double

SQL_C_DOUBLE

date

SQL_TIMESTAMP

java.sql.Timestamp

SQL_C_TIMESTAMP

ODBC APIs

현재 버전에서 제공되는 ODBC APIs는 아래 표와 같다. 자세한 API spec은 ODBC specification의 sql.h를 참고한다.

ODBC API

설명

SQLAllocHandle

-

SQLConnect

-

SQLDriverConnect

-

SQLGetInfo

SQL_DRIVER_ODBC_VER

SQL_ODBC_VER

SQL_SCROLL_OPTIONS

SQL_FETCH_DIRECTION

SQL_CURSOR_COMMIT_BEHAVIOR

SQL_CURSOR_ROLLBACK_BEHAVIOR

SQLGetTypeInfo

SQL_ALL_TYPES

SQLGetConnectAttr

SQL_ATTR_AUTOCOMMIT

SQL_ATTR_ODBC_VERSION

SQLSetConnectAttr

SQL_ATTR_AUTOCOMMIT: 성공으로 반환되지만 상태를 바꾸지는 않는다. (Non AutoCommit mode만 가능하다.)

SQLPrepare

-

SQLExecute

-

SQLExecuteDirect

-

SQLBindParameter

-

SQLBindCol

-

SQLFetch

-

SQLNumResultCols

-

SQLColAttribute

SQL_DESC_CATALOG_NAME

SQL_COLUMN_NAME

SQL_DESC_NAME

SQL_DESC_LABEL

SQL_DESC_DISPLAY_SIZE

SQL_DESC_LENGTH

SQL_COLUMN_LENGTH

SQL_DESC_OCTET_LENGTH

SQL_DESC_CONCISE_TYPE

SQL_DESC_TYPE_NAME

SQL_DESC_SCHEMA_NAME

SQL_DESC_UNSIGNED

SQL_COLUMN_NULLABLE

SQLRowCount

-

SQLGetData

-

SQLFreeHandle

-

SQLDisconnect

-

SQLEndTran

-

SQLTransAct

-

SQLGetDiagRec

-

SQLError

-

SQLDescribeCol

-

SQLNumParams

-

SQLDescribeParam

-

SQLParamData

-

SQLPutData

-

SQLTables

-

SQLColumns

-

SQLPrimaryKeys

-

ODBC 설정

GOLDILOCKS Lite의 ODBC/JDBC 동작을 위해서는 먼저 unixODBC driver manager가 정상적으로 설치되어야 한다.

unixODBC Driver Manager 설정

unixODBC driver manager 설치

시스템에 unixODBC driver manager가 설치되지 않은 경우 다음 명령으로 설치한다.

root> yum install unixODBC unixODBC-devel

DSN 파일 설정

unixODBC driver manager를 통해 접속할 정보를 DSN 파일에 기록한다.

[LITE]
HOST = 127.0.0.1
PORT = 27584
INSTANCE = demo
DA_MODE = true
DRIVER = /mnt/md1/ssd_home/lim272/new_lite/pkg/lib/libdbmCore.so

항목

설명

HOST

원격지의 IP를 기술한다.

PORT

원격지 dbmListener 의 port를 기술한다.

INSTANCE

접속할 instance name을 기술한다

DA_MODE

TRUE일 경우 DA 방식으로 접근한다. 원격지일 경우 FALSE로 설정한다.

DRIVER

libdbmCore.so 의 절대경로를 기술한다.

위의 DSN 파일을 명시적으로 ODBCINI 환경변수에 설정한다.

export ODBCINI=${HOME}/.odbc.ini

다음의 unixODBC driver manager에서 제공하는 "isql"을 이용하여 접속 테스트를 수행한다.

[11:09:15 lim272@lympc /mnt/md1/ssd_home/lim272/new_lite/pkg/sample]
$ isql lite
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select table_name from dic_table limit 10;
+------------------------------------------------------------------+
| TABLE_NAME                                                       |
+------------------------------------------------------------------+
| DIC_INST                                                         |
| DIC_TABLE                                                        |
| DIC_COLUMN                                                       |
| DIC_INDEX                                                        |
| DIC_INDEX_COLUMN                                                 |
| DIC_SEQUENCE                                                     |
| DIC_REPL_INST                                                    |
| DIC_REPL_TABLE                                                   |
| DIC_CAPTURE_HOST                                                 |
| DIC_CAPTURE_TABLE                                                |
+------------------------------------------------------------------+
SQLRowCount returns 10
10 rows fetched
SQL>

JDBC 설정

Jdbc-odbc-bridge jar

JDBC type1에 대해서는 JRE 1.7까지만 제공되지만 JRE 상위버전에서는 jar파일을 이용하여 사용할 수 있다.
다음 링크를 통해서도 다운로드 할 수 있다. 
https://github.com/dbeaver/jdbc-odbc-bridge-jre7
Java 환경에서는 ${JAVA_HOME}/lib/ext 경로에 위의 bridge jar 파일을 위치시킨다.
다음은 jdbc.jar 이름으로 설치하는 예이다.
$ ls -lrt /etc/alternatives/jre_1.8.0_openjdk/lib/ext/jdbc.jar
-rw-r--r-- 1 root root 1447077  8월 23 10:57 /etc/alternatives/jre_1.8.0_openjdk/lib/ext/jdbc.jar

Class 및 URL 설정

ODBC 설정을 참고하여 DSN 파일을 지정하고 ODBCINI가 해당 파일을 가리키도록 설정한 경우, 다음 예제를 통해 java에서도 사용할 수 있다.
try
{
        Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
        System.out.println( "find class" );

        con = DriverManager.getConnection( "jdbc:odbc:lite", "test", "test" );
        System.out.println( "connect ok" );
} catch(Exception e)
{
}

CLASS는 "sun.jdbc.odbc.JdbcOdbcDriver" 으로 기술한다.

DSN의 section을 "lite"라고 기술한 경우, URL은 "jdbc:odbc:section-name" 으로 기술한다.

bridge jar 파일은 tool에 연동해야 할 경우 jre/lib/ext 가 아닌 add jar file 방식을 통해서만 동작하는 경우도 있다.

PYTHON3 연동가이드

python3.6 이상에서 연동 가능하며 사전에 pyodbc를 설치해야 한다.
다음 방식으로 설치할 수 있다.
shell> pip3 install pyodbc
dbmMetaManager> initdb;
dbmMetaManager> set instance dict;
dbmMetaManager> create instance demo;
dbmMetaManager> set instance demo;
dbmMetaManager> create table t1 (c1 int, c2 float, c3 char(20), c4 long, c5 double, c6 date, c7 short);
import pyodbc;
import datetime;

## DSN 방식을 통해 연결
conn = pyodbc.connect( 'dsn=lite', ansi=True, autocommit=False )
conn.setdecoding(pyodbc.SQL_CHAR, encoding='utf8')
conn.setencoding(encoding='utf8', ctype=pyodbc.SQL_CHAR)

## DDL 예제
cursor = conn.cursor()
cursor.execute( "truncate table t1" );
conn.commit()

## Direct Execute 예제
cursor.execute( "insert into t1 values (1, 2.45, 'y', 100, 300.67891, sysdate, 22)")
conn.commit()

## Prepare Execute 예제
a1 = 10
a2 = 20.23
a3 = "c"
a4 = 999992913
a5 = 200.12345
#a6 = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')
a6 = datetime.datetime.now()
a7 = 32;
print( "a6 = " , a6)
#cursor.execute( "insert into t1 values (?, ?, ?, ?, ? ,to_date(?, 'yyyy-mm-dd hh:mi:ss.s6'), ? )", (a1, a2, a3, a4, a5, a6, a7))

for i in range(3000):
  a1 = i
  a2 = a2 + i;
  a4 = a4 + i;
  a5 = a5 + i;
  cursor.execute( "insert into t1 values (?, ?, ?, ?, ? ,?, ?)", (a1, a2, a3, a4, a5, a6, a7))
  conn.commit()

## Table Description 예제
for row in cursor.columns(schema='DEMO', table='T1'):
  print(row.table_schem, "," , row.table_name, "," , row.column_name , "," , row.data_type, ",", row.type_name, ",", row.column_size, "," , row.sql_data_type )

## Select Fetch 예제
result = cursor.execute( "select * from t1" );
for row in result:
  print( row.C1, "," , format(row.C2, '.3f'), "," , row.C3, "," , row.C4 , "," , format(row.C5, 'f'), "," , row.C6, "," , row.C7 )


cursor.close()
conn.close()


## 수행결과 예시
[11:43:28 lim272@lympc /mnt/md1/ssd_home/lim272/new_lite/pkg/sample]
$ python3 pytest.py
a6 =  2024-08-30 11:47:27.366667
 , T1 , C1 , 4 , integer , 38 , 4
 , T1 , C2 , 8 , float , 38 , 8
 , T1 , C3 , 1 , char , 20 , 1
 , T1 , C4 , -5 , long , 38 , -5
 , T1 , C5 , 8 , double , 38 , 8
 , T1 , C6 , 11 , timestamp , 16 , 11
 , T1 , C7 , 5 , short , 38 , 5
1 , 2.450 , y , 100 , 300.678910 , 2024-08-30 11:47:27.000366 , 22
0 , 20.230 , c , 999992913 , 200.123450 , 2024-08-30 11:47:27 , 32
1 , 21.230 , c , 999992914 , 201.123450 , 2024-08-30 11:47:27 , 32
......
2997 , 4492523.000 , c , 1004485416 , 4492703.123450 , 2024-08-30 11:47:27 , 32
2998 , 4495521.000 , c , 1004488414 , 4495701.123450 , 2024-08-30 11:47:27 , 32
2999 , 4498520.000 , c , 1004491413 , 4498700.123450 , 2024-08-30 11:47:27 , 32
[11:47:28 lim272@lympc /mnt/md1/ssd_home/lim272/new_lite/pkg/sample]
$

JDBC 연동가이드

jdbc에서 연동할 경우 앞서 설명된 사전 ODBC 설정이 필요하다.

JDBC 예제코드

dbmMetaManager> initdb;
dbmMetaManager> set instance dict;
dbmMetaManager> create instance demo;
dbmMetaManager> set instance demo;
dbmMetaManager> create table t1 (c1 int, c2 float, c3 char(20), c4 long, c5 double, c6 date, c7 short);
import java.sql.*;


public class jdbcSample {
  public static void main( String[] args ) {
    String url = "jdbc:odbc:lite";
    String query = "select * from t1";
    Connection con;
    PreparedStatement pstmt;
    Statement stmt;
    ResultSet rs;
    try
    {
        System.out.println( "start" );

        Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
        System.out.println( "find class" );

        con = DriverManager.getConnection( url, "test", "test" );
        System.out.println( "connect ok" );

        stmt = con.createStatement();
        System.out.println( "create stmt ok" );

        stmt.execute( "truncate table t1" );


      //pstmt = con.prepareStatement( "insert into t1 values (?, ?, ?, ?, ?, to_date(?, 'yyyy-mm-dd hh:mi:ss.s3'))" );
        pstmt = con.prepareStatement( "insert into t1 values (?, ?, ?, ?, ?, ?, ?)" );
        pstmt.setInt( 1, 100 );
        pstmt.setDouble( 2, 200.1234 );
        pstmt.setString( 3, "xyz" );
        pstmt.setLong( 4, 123456789 );
        pstmt.setDouble( 5, 50.678901 );
        pstmt.setTimestamp( 6, new java.sql.Timestamp(System.currentTimeMillis()));
        pstmt.setShort( 7, (short)22 );
        pstmt.executeUpdate();

        pstmt.setInt( 1, 200 );
        pstmt.setDouble( 2, 300.1234 );
        pstmt.setString( 3, "abc" );
        pstmt.setLong( 4, 923456789 );
        pstmt.setDouble( 5, 150.678901 );
        pstmt.setTimestamp( 6, new java.sql.Timestamp(System.currentTimeMillis()));
        pstmt.setShort( 7, (short)32 );
        pstmt.executeUpdate();

        con.commit();

        rs = stmt.executeQuery( "select * from t1" );
        System.out.println( "execute select ok" );

        while( rs.next() )
        {
            System.out.println( rs.getInt(1) + ", " + rs.getFloat(2) + ", " +  rs.getString(3) + ", " + rs.getLong(4) + ", " + rs.getDouble(5) + ", " + rs.getTimestamp(6) + ", " + rs.getShort(7) );
        }
    }
    catch( Exception ex )
    {
        System.out.println( "err: " + ex.getMessage() );
        ex.printStackTrace();
    }
  }
}

DBEAVER 연동가이드

dbeaver는 database management를 위한 open-source tool이며 본 문서에서는 community version을 이용한 연동에 대해 설명한다. (테스트는 21.x 버전을 기준으로 설명한다.)
dbeaver의 설치는 해당 사이트를 참조하도록 한다.

일부 환경에서 x-window 화면 깜빡임이 심할 경우에는 다음의 환경변수를 설정하고 구동한다.

export SWT_GTK3=0

드라이버 등록

데이터베이스드라이버 관리자 메뉴를 열고 NEW를 선택한 후 아래의 내용을 참고하여 등록한다.

다음의 bridge jar 파일도 등록한다.

Create New Driver

Create New Driver

jdbc-odbc-bridge.jar 파일을 등록한다.

add jar file

add jar file

새 데이터베이스 연결

데이터베이스새 데이터베이스 연결을 선택하고 앞서 등록한 "LITE"을 이용하여 연결을 생성한다.

New Database

New Database

화면 왼쪽의 New connection에서 오른쪽 마우스 클릭을 통해 연결을 수행한다.

Connect

Connect

연결이 정상적으로 수행되었다면 다음과 같이 사용할 수 있다.

navigation

navigation

SQL

SQL

Grafana 연동가이드

Grafana는 monitoring 데이터를 직관적으로 시각화 할 수 있는 기능을 제공하는 open source tool 이다. 본 절에서는 GOLDILOCKS Lite를 모니터링할 수 있도록 grafana를 설정하는 방법을 설명한다.

influxdb DataSource 설정

Import 할 DataSource에는 "influxdb-1" 이란 이름의 data source를 사용하고 있다. 이를 위해 datasource를 미리 만들어야 한다.

datasource

datasource

Import Dash-Board json

grafana가 설치되고 influxdb가 운영 중인 것을 전제로 하고 먼저 grafana에 GOLDILOCKS Lite용 dash board를 import한다.
dashboard json file의 위치는 ${DBM_HOME}/sample/grafana/LITE_MON_DASHBOARD.json 파일이다.
다음 화면처럼 grafana import 메뉴를 구동하고 파일을 업로드한다.

Import

Import

upload json

upload json

정상적으로 upload 되면 다음과 같이 dash board가 추가된다.

dashboard list

dashboard list

Monitoring Data 생성

아직은 monitoring data가 존재하지 않기 때문에 dash board 내에 출력되는 데이터는 없다. 이를 위해 ${DBM_HOME}/pkg/sample/liteMon.sh 을 주기적으로 수행하거나 background로 실행하도록 한다. (이 때 influxdb는 구동된 상태이어야 한다.)

liteMon.sh 에서 사용자는 다음의 사항을 수정해야 한다.

$ cat liteMon.sh
################################
## CONFIG
################################
INFLUX_IP="192.168.0.26"           # influxdb 가 운영되는 IP
INFLUX_PORT=8086                   # influxdb 의 Listen Port (default:8086)
INFLUX_DB="dev1"                   # influxdb 에 생성한 database name
INTERVAL=5                         # second (데이터 수집 주기)

수정 후 다음 명령으로 수행할 수 있다.

shell> sh liteMon.sh once      ## test를 위한 1회성 동작
shell> nohup sh liteMon.sh &   ## 반복수행

혹은, crontab에 동작주기를 설정하여 "liteMon.sh once" 로 실행하는 방법도 가능

influx에 정상적으로 데이터가 적재되면 다음 예시와 같은 화면을 확인할 수 있다.

sample

sample