큐브리드 예전에 7.x버전을 설치해본 이후 다시 설치를 하게 되었습니다...(이....이벤트 때문에....-_-)
DBMS에 관심이 많아서(관심만 가지고 있다는...ㅠ) 이 기회에 한번 살펴보기로 했습니다.

우선 큐브리드는 국산DBMS라서 더욱 애착이 가네요. 게다가 NHN이 인수한 뒤, 큐브리드를 오픈소스하는 과감함을 보여주었습니다. 오픈소스를 함으로 오픈소스의 엄청난 효과를 보겠다는 생각인데요. 여러 실력있는 개발자분들이 많이 참여하셔서 최고의 DBMS자리에 올랐으면 하네요(저도 참여하고 싶지만 실력이 딸려서 ㅠ 실력을 키워서 참여하겠습니다 ㅠㅠ어떤 오픈소스든지 ^^)

우선 설치를 해봤습니다. 큐브리드의 장점은 설치가 매우 간편합니다. 그냥 다음 신공으로 설치가 가능합니다.
저는 DB를 MySQL, MSSQL, Oracle을 사용해봤는데요. 설치 시에 이렇게 간단하게 된 DBMS는 없었던 것 같습니다-_-; 설치 시 전체 다 설치할 것인지, Client만 설치할 것인지를 물어봅니다.
사용자 삽입 이미지

서버 빼고, Manager나 JDBC 등만 설치하려면 아래를 선택하면 되는 듯 합니다.

음...CUBRID Manger는 MySQL에 비교를 하자면 MySQL GUI Tools랑 비슷한 것이라고 보면 돼요 ^^ 접속하고 쿼리날리고, DB설정도 바꾸고, DB관련 컨트롤을 매우 쉽게 할 수 있게 되어있어요 ^^

설치를 하고 나면 오른쪽 하단에 TrayIcon부분에 큐브가 하나 생겼습니다. 아.....설치는 쉬웠지만, 큐브리드를 시작 시에 띄우겠다는 건 안 물어본 것 같군요. 몰랐는데, 재부팅해도 계속 자동 실행이 되어있군요. 이 점은 고쳐야할 듯...시작 시 중지시키려면 시작프로그램에서 Cubrid Manager프로그램을 제거하고, 서비스에서 수동으로 바꿔주시면 됩니다.
시작 -> 제어판 -> 관리도구 -> 서비스 -> Cubrid Service 수동으로 변경.

MySQL Windows용도 TrayIcon으로 DBMS를 시작하고, 중지할 수 있는데, 이것도 똑같군요. MSSQL은 무슨 관리자를 실행하서 실행하고 꺼야하는데....-_-;

암튼, 설치하고 나서 Cubrid Manager를 실행하고 나니 localhost사이트가 자동등록되어있습니다. 암호는 기본이 admin입니다. 변경 시에는 도구 -> 큐브리드매니저 사용자 관리에서 암호를 변경해주시면 됩니다.
DEMODB를 생성한다고 한 것 같은데, demodb라는 DB가 생겼군요. 살펴보면 올림픽관련된 DB가 있는 것 같습니다 ^^

오늘은 여기까지-_-;
 
Posted by 머드초보
,
 
Thread를 두개를 실행시켜서 DB에 동시에 INSERT를 시켜버리니 INSERT할 때 데이터가 AUTOINCRESEMENT가 아니라 ID부분을 직접 입력해서 하는 부분이면 문제가 발생합니다.
그래서 이 MERGE INTO문을 활용해서 데이터가 있으면 INSERT하고 없으면 UPDATE하는 구문을 만들었습니다.
이렇게 해도 제 생각이지만, Thread한 놈은 이미 데이터가 없는 것을 확인하고 insert를 시도 하려고 하고, 다른 Thread놈은 저 놈이 insert를 아직 하지 않았으니까 검색해서 안나오니 insert를 해보려고 하니 둘 다 insert를 시도하게 되더라구요.

이게 예제 입니다.
우선 테이블구조입니다.
테이블은 autoincreament가 아닌 수동적인 기본키를 사용합니다.
[code]CREATE TABLE "INSERTTABLE" ( "ID" NUMBER NOT NULL ENABLE, "DATA" VARCHAR2(4000) NOT NULL ENABLE, CONSTRAINT "INSERTTABLE_PK" PRIMARY KEY ("ID") ENABLE )
[/code]


applicationContext.xml
[code]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:component-scan base-package="thread" />
   
    <!-- oracle용 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        p:driverClassName="oracle.jdbc.driver.OracleDriver"
        p:url="jdbc:oracle:thin:@localhost:1521:XE"
        p:username="mudchobo" p:password="1234" />
 
    <!-- SqlMap setup for iBATIS Database Layer -->
    <bean id="sqlMapClient"
        class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
        p:dataSource-ref="dataSource"
        p:configLocation="classpath:config/SqlMapConfig.xml" />
   
    <bean id="sqlMapClientTemplete"
        class="org.springframework.orm.ibatis.SqlMapClientTemplate"
        p:sqlMapClient-ref="sqlMapClient"/>
           
</beans>
[/code]
SqlMapConfig.xml
[code]<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
    <sqlMap resource="config/Insert.xml" />
</sqlMapConfig>
[/code]
Insert.xml
[code]<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap     
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Sqlmap">
       <insert id="insertData">
           MERGE INTO INSERTTABLE
           USING DUAL
           ON (ID = 1)
           WHEN MATCHED THEN
           UPDATE SET
           DATA = 'HERMUSSERI'
           WHEN NOT MATCHED THEN
           INSERT (ID, DATA)
           VALUES (1, 'MUDCHOBO')
       </insert>
      
</sqlMap>
[/code]
ThreadTestDao.java
[code]package thread;

public interface ThreadTestDao {
    public void insertData();
}
[/code]
ThreadTestDaoImpl.java
[code]package thread;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class ThreadTestDaoImpl implements ThreadTestDao {

    @Autowired
    private SqlMapClientTemplate sqlMapClientTemplate;

    @Override
    public void insertData() {
        sqlMapClientTemplate.insert("insertData");
    }
}
[/code]
TestThread.java
[code]package thread;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Scope("prototype")
@Component
public class TestThread extends Thread {

    @Autowired
    private ThreadTestDao threadTestDao;
   
    @Override
    public void run() {
        threadTestDao.insertData();
    }
}
[/code]
ThreadTest.java
[code]package thread;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ThreadTest {

    public static void main(String[] args) {
        String configLocation = "config/applicationContext.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(
                configLocation);

        TestThread testThread1 = (TestThread) context
                .getBean("testThread");
        TestThread testThread2 = (TestThread) context
                .getBean("testThread");
       
        testThread1.start();
        testThread2.start();
    }
}
[/code]
실행할 때 계속 몇번을 실행해보면-_-; unique constraint 또는 ORA-00001: 무결성 제약 조건(MUDCHOBO.INSERTTABLE_PK)에 위배됩니다를 볼 수 있을 겁니다.

이게 제 생각인데, 첫번째 스레드가 돌면서 데이터를 확인하니 없길래 insert를 하려던 찰나에 두번째 스레드놈도 거의 동시에 데이터를 확인하니 없어서 insert를 시키려다가 에러가 나는 듯한데요.

트랜잭션도 먹이고 별 지롤을 다 했는데 안되길래 그냥 싱크방식으로 변경해버렸습니다.
insertData라는 메소드에
[code]@Override
    synchronized public void insertData() {
        sqlMapClientTemplate.insert("insertData");
    }
[/code]
메소드 앞에 synchronized를 붙입니다.
이건 어떤 스레드가 호출을 했으면 다음 스레드는 기다린 다음에 접근하게 되는 즉 싱크방식으로 처리를 시킬 수 있는 메소드가 됩니다.
이렇게 처리하면 효율은 좀 떨어지겠지만, 유니크 중복에러는 그나마 막을 수 있습니다.

다른 방법 있으면 좀 알려주세요 ㅠㅠ 고생하고 있습니다 ㅠ




 
Posted by 머드초보
,
 
이 큐브리드는 설치후기라고 쓰는게 맞을 듯 해요-_-;

그냥 국산DBMS가 뭐가 있을까 라는 생각에 검색을 해봤습니다. 알티베이스는 JCO가서 알게 된거라 다른 것도 뭔가 있을 듯해서 찾아봤습니다. 그랬더니 큐브리드라는 것이 나오더군요. 한번 설치를 해볼까? 라는 생각에 설치를 시도했습니다.
이럴수가-_-; 그냥 인스톨하니 SERVER랑 CLIENT가 다 설치되고, 알아서 작동도 되는군요.
오른쪽 아래에 tray아이콘을 생성해서 서버를 start하거나 stop할 수 있게 해놨구요.

큐브리드 매니저라는 것을 제공하는데 처음 비밀번호는 admin, admin인 것 같습니다.
그리고 처음에 설치할 때 sample을 설치할 것인지를 묻는데 이것을 설치하면 subway라는 데이터베이스를 생성하는 것 같습니다.

매니저를 통해서 접속을 해보면, demodb랑 subway 2개의 db가 있는 것을 볼 수 있습니다.
subway를 클릭하면 dba라는 계정으로 권한이 있는 듯 한데, 처음에 비밀번호는 없습니다.
그냥 dba 하고 비밀번호 비어두고 로그인하면 로그인이 됩니다.
dba 비밀번호 바꿔주고 ^^ db별로 start를 시킬 수 있는 듯 합니다. 데이터베이스서버를 가동해봅시다.
bus, gate, line, running, station, transit 등의 테이블이 있네요.

우선 설치면에서는 MySQL이나 Altibase보단 훨씬 쉽네요-_-; 다음신공으로 DB가 설치가 되다니-_-;
jdbc도 CUBRID\Server\java\jspserver.jar 파일이 JDBC드라이버 같네요.
JDBC도 당연히 되는 듯 합니다.

저는 DBMS는 Oracle, MySQL, MSSQL, DB2 뭐 그외에는 별로 안쓰는줄 알았는데 국산 DBMS도 있는 줄 처음 알았어요 ^^ 앞으로도 많은 발전이 있었으면 하네요.

PS. 아 그리고 이 큐브리드가 보니까 NHN에 납품하는 것 같던데 맞나요?--; 네이버가 이것을 쓰는건가-_-;
 
Posted by 머드초보
,
 

저번달에 JCO놀러갔다가 알티베이스라는 국산DBMS를 알게 되었습니다. 그래서 한번 사용해볼까 라는 생각을 가지고 있었는데 시간이 없어서 그냥 있다가 갑자기 생각나서 설치를 해봤습니다.

Windows용은 설치가 완전 쉽습니다-_-; installer를 제공해서 걍 설치를 하면 알아서 환경변수도 등록해주고, 알아서 다 해주네요. 나중에 Linux나 Unix용으로도 한번 해봐야겠습니다.

우선 altibase홈페이지에서 Windows용으로 설치파일을 받습니다. 회원가입을 해야합니다.
http://adc.altibase.com/
여기서 Product -> Package클릭 후 WINDOWS용으로 클릭하면 나옵니다.
32BIT이면 32BIT용으로 받고, 64BIT이면 B4BIT용으로 받아야합니다.
저는 이걸로 altibase-WIN_NT_5.0-32bit-4.3.9.75-release-VC6.exe

실행하면 설치화면이 나오고 다음신공으로 설치를 합니다. 설치가 완료되면 환경변수를 등록해야하는데
자동으로 환경변수를 등록하게 됩니다.
ALTIBASE_HOME이라는 환경변수를 등록하고 해당 BIN디렉토리를 PATH로 잡아주더군요.

라이센스를 받아야합니다.
홈페이지에서 Member -> Download Info를 클릭하면(http://adc.altibase.com/member/down_info.jsp)
자기가 뭘 다운받았는지 다 나옵니다. 오른쪽에 보시면 라이센스신청클릭해서 신청하면 됩니다.
여기서 Windows에서는 Mac Address를 입력 잘해야합니다.
잘못 입력했더니 Internal Error : Invalid Protocol이라면서 안되더군요.
참고로 ipconfig/all해서 나오는 것 중에 랜카드가 여러개 있으면 가장 위에 것을 입력해야하는 것 같습니다.
가장 위에 것을 입력했더니 되더군요 ^^

라이센스가 메일로 날아오는데 이 license라는 파일을 ALTIBASE_HOME/conf 디렉토리에 복사하면됩니다.
그다음 이렇게 하면 됩니다.


C:\Documents and Settings\Owner>isql -u sys -p manager -sysdba
-----------------------------------------------------------------
     Altibase Client Query utility.
     Release Version 4.3.9.75
     Copyright 2000, ALTIBASE Corporation or its subsidiaries.
     All Rights Reserved.
-----------------------------------------------------------------
ISQL_CONNECTION = TCP, SERVER = 127.0.0.1, PORT_NO = 20300
iSQL(sysdba)> startup process;
Trying connect to database server. Connected with database server.

TRANSITION TO PHASE : PROCESS
Command execute success.
iSQL(sysdba)> create database mydb initsize=10M noarchivelog;
DB Info (Page Size     = 32768)
        (Page Count    = 385)
        (Total DB Size = 12615680)
        (DB File Size  = 1073741824)
        Creating MMDB FILES     [SUCCESS]
        Creating Catalog Tables [SUCCESS]
        Creating DRDB FILES     [SUCCESS]
  [SM] Rebuilding Indices [Total Count:0] **** [SUCCESS]
DB Writing Completed. All Done.
Create success.
iSQL(sysdba)> shutdown abort;
Database server killed..
iSQL(sysdba)> startup service;
Trying connect to database server. Connected with database server.

TRANSITION TO PHASE : PROCESS

TRANSITION TO PHASE : CONTROL

TRANSITION TO PHASE : META
  [SM] Recovery Phase - 1 : Preparing Database
  [SM] Recovery Phase - 2 : Loading Database
                          : Dynamic Memory Version => Loading Type-2
  [SM] Recovery Phase - 3 : Skipping Recovery & Starting Threads...
                            Refining Disk Table
  [SM] Refine Memory Table : ...................................................
... [SUCCESS]
  [SM] Rebuilding Indices [Total Count:64] ****.................................
................................................................................
............... [SUCCESS]

TRANSITION TO PHASE : SERVICE
--- STARTUP Process SUCCESS ---
Command execute success.
iSQL(sysdba)> exit
C:\Documents and Settings\Owner>

근데 그냥 위처럼 안하고 clean이라고 쳐도 돼요-_-;
그리고 나중에 서버구동할 때에는 그냥 isql접속 안하고 server start 라고 치면 돼요.
종료할 때는 server stop이라고 치면 되구요 ^^
어쨌든 이제 됐는지 확인해봅시다.

이클립스(eclipse)에서 제공하는 Data Source Explorer를 이용해서 접속해봅시다.
우선 Altibase용 JDBC가 필요하겠죠? 이것도 ALTIBASE홈페이지에서 받도록 합시다.
Product -> Environment에 있습니다. http://adc.altibase.com/product/environment.jsp
다운로드받고 Data Source Explorer 설정을 해봅시다.

오른쪽 아래에 Data Source Explorer가 안보인다면 Windows -> Other -> Data Source Explorer 확인 ^^

Databases대고 오른쪽버튼을 누르고 New클릭
Generic JDBC Connection 클릭
Name은 대충 AltibaseTest라고 써놓고 Next
Select a driver from the drop-down에서 ...을 클릭해서 Add
Generic JDBC Driver선택, Add Jar/ZIP클릭 후 다운받은 Altibase.jar 선택
Driver Name은 Altibase Driver라고 바꿈.
아래부분에 Driver Class를 ...클릭해서 Altibase.jdbc.driver.AltibaseDriver 선택
방금 추가한 Altibase Driver를 선택
Database는 mydb, URL은 jdbc:Altibase://127.0.0.1:20300/mydb
User name은 sys
Password는 manager
Finish후에 AlitibaseTest오른쪽버튼 대고 Connect!
접속 되면 된겁니다 ^^ 아마도-_-;

이제 설치밖에 안해봤는데 사용자계정 추가하고, 뭐 이것저것 알아볼라면 또 삽질해야하네요 ^^
어쨌든 국산인데 이런 훌륭한 DBMS가 있는 줄 몰랐네요. 지켜봐야겠네요^^

 
Posted by 머드초보
,