2011년 6월 13일 월요일

C-JDBC - 1


C – JDBC(http://c-jdbc.objectweb.org)

What is C-JDBC ?
C-JDBC는 JDBC기술을 이용하여 Java Application(Standalone application, servlet, EJB)에서 사용하는 Data Base Clustering 해주는 Middleware 이다. C-JDBC는 ObjectWeb 컨소시움(http://objectweb.org)의 Open source project이다.

C-JDBC을 사용하기 위한 환경
  • Client 어플리케이션은 JDBC을 이용하여 DataBase에 접근하여야 한다.
  • JDK 1.3이상에서 개발된 어플리케이션
  • JDBC드라이버는 Type1,2,3,4 및 JDBC-ODBC 브릿지
  • 클러스터 Node사이에는 TCP/IP 통신이 가능한 상태


C-JDBC을 이용 이점
1. Data Base 추가로 performance 확장을 용이하게 해주며, Node간 노드 발란싱
2. C-JDBC는 Data Base 장애발생시 FailOver을 지원한다.
3. Query Caching과 Connection Pool 제공으로 performance를 향상시켜준다.
4. performance 모니터링 및 분석을 위한 SQL 트래픽 로깅

C-JDBC principle

PLT 1 설치
2. Install : java -jar c-jdbc-x.y.bin-installer.zip 이후 사용자에 따라 설치
3. 환경변수설정 : Unix 사용자는 Shell의 Configuration file에 Windows사용자는 시스템 환경변수에 “CJDBC_HOME=INSTALL 위치”을 지정해준다.

C-JDBC Driver
Client 어플리케이션에서 사용할 C-JDBC 드라이버는 [CJDBC_HOM]/drivers 디렉토리에 c-jdbc-driver.jar 파일로 있다.

Test DataBase Hsqldb 구동
  1. CJDBC_HOME/bin/hsqldb –port 9001 è 9001 port로 hsqldb을 구동한다.
  2. Port를 다르게 여러 개의 hsqldb을 구동할 수 있다.
  3. 같은 디렉토리의 squirrel을 실행시키면 GUI Tool을 사용하여 hsqldb에 접속하여 핸들링 할 수 있다.
  4. hsqldb을 구동하면 초기 Data가 들어있다. Data는 [CJDBC_HOME]/3rdparty/hsqldb/data/test.script 파일에 등록되어 있다.
  5. hsqldb의 Default 계정은 test, 비밀번호는 공백””이다.



PLT 2 C-JDBC Controller and Driver
Controller
클러스터링으로 묶어 싶은 DataBase을 VirtualDataBase 단위로 구성하고 Controller에는 VirtualDataBase 단위로 설정 된다. Controller에서는 클러스터링 Set인 VirtualDataBase단위을 하나의 DataBase로 보고 서비스 한다. 클라이언트는 Controller에 접속하여 VirtualDataBase을 하나의 DataBase로 보고 Data작업을 한다. 구성을 도식화 하면 아래와 같다.

C-JDBC Controller

첫 번째 Sample
C-JDBC을 설치할 때 포함된 Demo을 살펴 보도록 한다.
[CJDBC_HOME]/demo-raidb1.bat 샘플은 두 개의 hsqldb(9001,9002)을 클러스터링 하고, hsqldb(9003)을 Recovery DB로 사용한다. 이 샘플에서 사용되는 Controller, VirtualDataBase 설정은 다음과 같다. 설치된 [CJDBC_HOME]/config/controller/ controller-raidb1.xml, [CJDBC_HOME]/config/virtualdatabase/hsqldb-raidb1.xml 파일을 참고 한다.

<controller-raidb1.xml>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE C-JDBC-CONTROLLER PUBLIC "-//ObjectWeb//DTD C-JDBC-CONTROLLER 2.0.2//EN" "http://c-jdbc.objectweb.org/dtds/c-jdbc-controller-2.0.2.dtd">
<C-JDBC-CONTROLLER>
<Controller port="25322">
<Report/>
<JmxSettings>
<RmiJmxAdaptor/>
</JmxSettings>
<VirtualDatabase configFile="hsqldb-raidb1.xml" virtualDatabaseName="myDB" autoEnableBackends="force" checkpointName="Initial_empty_recovery_log"/>
</Controller>
</C-JDBC-CONTROLLER>


Controller.xml 에는 여러 개의 VirtualDataBase을 설정할 수 있지만 이번 샘플에서는 하나의 VirtualDataBase만 설정한다.
<hsqldb-raidb1.xml>
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE C-JDBC PUBLIC "-//ObjectWeb//DTD C-JDBC 2.0.2//EN" "http://c-jdbc.objectweb.org/dtds/c-jdbc-2.0.2.dtd">
<C-JDBC>
<VirtualDatabase name="myDB">
<Monitoring>
<SQLMonitoring defaultMonitoring="off">
<SQLMonitoringRule queryPattern="^select" caseSensitive="false" applyToSkeleton ="false" monitoring="on"/>
</SQLMonitoring>
</Monitoring>
<Backup>
<Backuper backuperName="Octopus"
className="org.objectweb.cjdbc.controller.backup.OctopusBackuper"
options="zip=true"/>
</Backup>
<AuthenticationManager>
<Admin>
<User username="admin" password=""/>
</Admin>
<VirtualUsers>
<VirtualLogin vLogin="user" vPassword=""/>
</VirtualUsers>
</AuthenticationManager>
<DatabaseBackend name="localhost" driver="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:hsql://localhost:9001"
connectionTestStatement="call now()">
<ConnectionManager vLogin="user" rLogin="TEST" rPassword="">
<VariablePoolConnectionManager initPoolSize="10" minPoolSize="5"
maxPoolSize="50" idleTimeout="30" waitTimeout="10"/>
</ConnectionManager>
</DatabaseBackend>
<DatabaseBackend name="localhost2" driver="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:hsql://localhost:9002"
connectionTestStatement="call now()">
<ConnectionManager vLogin="user" rLogin="TEST" rPassword="">
<VariablePoolConnectionManager initPoolSize="10" minPoolSize="5"
maxPoolSize="50" idleTimeout="30" waitTimeout="10"/>
</ConnectionManager>
</DatabaseBackend>
<RequestManager>
<RequestScheduler>
<RAIDb-1Scheduler level="passThrough"/>
</RequestScheduler>
<RequestCache>
<MetadataCache/>
<ParsingCache/>
<!-- <ResultCache granularity="table"/> -->
</RequestCache>
<LoadBalancer>
<RAIDb-1>
<WaitForCompletion policy="first"/>
<RAIDb-1-LeastPendingRequestsFirst/>
</RAIDb-1>
</LoadBalancer>
<RecoveryLog driver="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:hsql://localhost:9003" login="TEST" password="">
<RecoveryLogTable tableName="RECOVERY" idColumnType="BIGINT NOT NULL"
vloginColumnType="VARCHAR NOT NULL" sqlColumnType="VARCHAR NOT NULL"
extraStatementDefinition=",PRIMARY KEY (id)"/>
<CheckpointTable tableName="CHECKPOINT"
checkpointNameColumnType="VARCHAR NOT NULL"/>
<BackendTable tableName="BACKEND"
databaseNameColumnType="VARCHAR NOT NULL"
backendNameColumnType="VARCHAR NOT NULL"
checkpointNameColumnType="VARCHAR NOT NULL"/>
<DumpTable tableName="DUMP" dumpNameColumnType="VARCHAR NOT NULL"
dumpDateColumnType="VARCHAR NOT NULL"
dumpPathColumnType="VARCHAR NOT NULL"
dumpFormatColumnType="VARCHAR NOT NULL"
checkpointNameColumnType="VARCHAR NOT NULL"
backendNameColumnType="VARCHAR NOT NULL"
tablesColumnType="VARCHAR NOT NULL"/>
</RecoveryLog>
</RequestManager>
</VirtualDatabase>
</C-JDBC>


Demo Controller 실행 “demo-raidb1.sh or demo-raidb1.bat” 실행
Client Program
package aricle.cjdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Update
{
public static void main(String[] args) {
Connection con = null;
try
{
Class.forName("org.objectweb.cjdbc.driver.Driver");
// FailOver 위한 Two controller 등록
//DriverManager.getConnection("jdbc:cjdbc://c1.objectweb.org,c2.objectweb.org/tpcw");
//DriverManager.getConnection("jdbc:cjdbc://localhost,remote.objectweb.org:2048/tpcw");
//DriverManager.getConnection("jdbc:cjdbc://smpnode.com:25322,smpnode.com:1098/tpcw");
con = DriverManager.getConnection("jdbc:cjdbc://localhost:25322/myDB?user=user&password=");
Statement stmt = con.createStatement();
String sql = "update address set firstname='hu', lastname='rukku' where id=0";
stmt.executeUpdate(sql);
ResultSet rs = stmt.executeQuery("select * from address where id=0");
while(rs.next()) {
System.out.println("=====================>");
System.out.println(rs.getInt(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
System.out.println(rs.getString(4));
System.out.println(rs.getString(5));
}
}
catch( ClassNotFoundException e )
{
e.printStackTrace();
}
catch( SQLException e )
{
e.printStackTrace();
}
finally {
if(con != null)
try
{
con.close();
}
catch( SQLException e )
{
e.printStackTrace();
}
}
}
}


결과
squirrel을 이용하여 hsqldb 9001, 9002을 확인하면 Address 테이블에서 ID가 0번인 사용자의 FirstName, LastName이 hu, rukku로 바뀐걸 확인 할수 있으며 hsqldb 9003에서는 Recovery Table에서 Update Query 문장 등을 확인 할 수 있다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...