연동가이드
주의사항
본 챕터에서는 ODBC/JDBC 연동에 관하여 설명한다.
ODBC API 방식은 Linux 기반의 unixODBC driver manager를 통해 연동하거나 shared library의 fuction을 직접 호출하여 사용할 수 있다.
JDBC API 방식은 type1 (Jdbc-Odbc-Bridge) 방식만 제공한다.
ODBC/JDBC APIs에 대해서는 일부 spec만 제공한다.
LITE는 AUTO_COMMIT mode를 제공하지 않는다. 다만, 일부 tools과의 호환을 위해 SetAutoCommit이 성공으로 반환되도록 동작한다.
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
테스트를 위한 사전 DDL 수행 예제
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);
python 예제 코드
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 예제코드
테스트를 위한 사전 DDL 수행 예제
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);
jdbc 예제코드
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의 설치는 해당 사이트를 참조하도록 한다.
GOLDILOCKS Lite는 window library를 제공하지 않기 때문에 Linux에서 사용할 경우 x-window 환경으로 구동 가능해야 한다.
GOLDILOCKS Lite의 경우 dbeaver의 unique index 목록에서 모든 index 정보를 보여준다.
외부키, 참조키 등은 지원하지 않는다.
DDL에서 출력된 구문은 범용 DDL 구문으로써 LITE에서는 호환되지 않는다.
일부 환경에서 x-window 화면 깜빡임이 심할 경우에는 다음의 환경변수를 설정하고 구동한다.
export SWT_GTK3=0
드라이버 등록
데이터베이스 → 드라이버 관리자 메뉴를 열고 NEW를 선택한 후 아래의 내용을 참고하여 등록한다.
다음의 bridge jar 파일도 등록한다.
Create New Driver
jdbc-odbc-bridge.jar 파일을 등록한다.
add jar file
새 데이터베이스 연결
데이터베이스 → 새 데이터베이스 연결을 선택하고 앞서 등록한 "LITE"을 이용하여 연결을 생성한다.
New Database
화면 왼쪽의 New connection에서 오른쪽 마우스 클릭을 통해 연결을 수행한다.
Connect
연결이 정상적으로 수행되었다면 다음과 같이 사용할 수 있다.
navigation
SQL
Grafana 연동가이드
Grafana는 monitoring 데이터를 직관적으로 시각화 할 수 있는 기능을 제공하는 open source tool 이다. 본 절에서는 GOLDILOCKS Lite를 모니터링할 수 있도록 grafana를 설정하는 방법을 설명한다.
grafana는 visualization tool이며 설치는 다음을 참고한다. (https://grafana.com/)
influxdb는 monitoring data에 대한 시계열 정보를 저장하고 grafana와 연동되는 repository이며 설치는 다음을 참고한다. (https://www.influxdata.com/)
선재소프트는 위 두 개 제품의 설치/ 운영/ 문제에 대한 제반 사항을 지원하지 않는다.
influxdb DataSource 설정
Import 할 DataSource에는 "influxdb-1" 이란 이름의 data source를 사용하고 있다. 이를 위해 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
upload json
정상적으로 upload 되면 다음과 같이 dash board가 추가된다.
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