posts - 42,  comments - 84,  trackbacks - 0
            2008年6月2日
          CJDBC官網(wǎng)http://c-jdbc.ow2.org/
          cjdbc與hibernate的整合
          Configuring C-JDBC with Hibernate

          C-JDBC just has to be defined as any JDBC driver in Hibernate, leaving the syntax set to the proper database. Here is a configuration example to use Hibernate with a C-JDBC cluster made of Sybase backends:
          ## C-JDBC
          hibernate.dialect                 net.sf.hibernate.dialect.SybaseDialect
          hibernate.connection.driver_class org.objectweb.cjdbc.driver.Driver
          hibernate.connection.username     user
          hibernate.connection.password     pass
          hibernate.connection.url          jdbc:cjdbc://localhost:25322/test       
                
                轉(zhuǎn)自:http://lzj0470.javaeye.com/blog/445348
          一、前言
                   cjdbc ( http://c-jdbc.objectweb.org/ ) 是一個(gè)open source的數(shù)據(jù)庫集群中間件,任何基于jdbc的應(yīng)用都可以通過它透明地訪問數(shù)據(jù)庫集群,它可以進(jìn)行各個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)復(fù)制,并且可以實(shí)現(xiàn)各個(gè)節(jié)點(diǎn)的查詢負(fù)載均衡。通過這樣的軟件,偶們可以方便的實(shí)現(xiàn)RAIDb - Redundant Array of Inexpensive Database 廉價(jià)數(shù)據(jù)庫冗余陣列。
                  大型應(yīng)用隨著用戶量訪問越來越大,增加數(shù)據(jù)庫存儲和做好數(shù)據(jù)庫冗余可以增加系統(tǒng)的可靠性和性能。

                  下面利用cjdbc,把兩臺對等的 Mysql 做 RAIDb,本文假定你已經(jīng)搭建好兩臺對等的 Mysql環(huán)境并建好一個(gè)需要做集群冗余的數(shù)據(jù)庫 clusterdb。
          二、配置環(huán)境
          Mysql: 5.0.19, 并使用 InnoDB 作為 Mysql 引擎

          C-jdbc: 2.0.2

          Jdk: 1.5
          三、選擇合適的 C-JDBC RAIDb 機(jī)制

          cjdbc有幾種RAIDb的機(jī)制可以選擇,如RAIDb-0,RAIDb-1等等,可以根據(jù)不同的情況選擇不同的RAIDb的機(jī)制。各種 RAIDb的機(jī)制詳情請查看 cjdbc 的文檔和 Demo。

          RAIDb-1有如下功能:
          完全鏡像處理機(jī)制,每個(gè)節(jié)點(diǎn)上都有完整的數(shù)據(jù)庫結(jié)構(gòu),這種方式提供了最好的容錯(cuò)處理,并且通過設(shè)置合理的Loading Balance策略,可以帶來查詢性能相當(dāng)好的提高。但是由于對于任何的寫操作(create/update/delete),需要在各個(gè)節(jié)點(diǎn)上進(jìn)行傳播復(fù)制,寫操作就會比原來慢一些了,如下圖:



          這里選擇 RAIDb-1 做為 cjdbc RAIDb 機(jī)制。

          四、給兩臺對等的 Mysql 建表,假設(shè)兩臺 Mysql 的IP分別是 192.168.0.2和192.168.0.3
          bash> mysql -h192.168.0.2 -uroot
          bash> use clusterdb
          bash> create table user (id int(3) not null auto_increment primary key, name char(50) not null) engine innodb;
          bash> exit;

          bash> mysql -h192.168.0.3 -uroot
          bash> use clusterdb
          bash> create table user (id int(3) not null auto_increment primary key, name char(50) not null) engine innodb;
          bash> exit;
          五、在 Linux 下安裝 C-JDBC Controller
          bash> mkdir -p /usr/local/c-jdbc
          bash> cd /usr/local/c-jdbc
          bash> tar xvfz c-jdbc-2.0.2-bin.tar.gz
          bash> export CJDBC_HOME=/usr/local/c-jdbc
          六、把 Mysql JDBC Driver 放到 C-JDBC Controller 中來

          這里我們使用 mysql-connector-java-3.1.12-bin.jar 驅(qū)動程序,把它放到
          /usr/local/c-jdbc/drivers 中

          七、配置 C-JDBC Controller
          1、在 /usr/local/c-jdbc/config/virtualdatabase 目錄中創(chuàng)建 虛擬數(shù)據(jù)庫配置文件,并把它命名為 mysql-raidb1-distribution.xml,內(nèi)容如下:

          <?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">

          <Distribution>
          </Distribution>

          <AuthenticationManager>
          <Admin>
          <User username="admin" password="c-jdbc"/>
          </Admin>
          <VirtualUsers>
          <VirtualLogin vLogin="boss" vPassword="boss"/>
          </VirtualUsers>
          </AuthenticationManager>

          <DatabaseBackend name="mysqlNode211" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://192.168.0.2/clusterdb" connectionTestStatement="select 1">
          <ConnectionManager vLogin="boss" rLogin="boss_user" rPassword="123456">
          <VariablePoolConnectionManager initPoolSize="10" minPoolSize="10" maxPoolSize="50" idleTimeout="30" waitTimeout="10"/>
          </ConnectionManager>
          </DatabaseBackend>

          <DatabaseBackend name="mysqlNode213" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://192.168.0.3/clusterdb" connectionTestStatement="select 1">
          <ConnectionManager vLogin="boss" rLogin="boss_user" rPassword="123456">
          <VariablePoolConnectionManager initPoolSize="10" minPoolSize="10" maxPoolSize="50" idleTimeout="30" waitTimeout="10"/>
          </ConnectionManager>
          </DatabaseBackend>

          <RequestManager>
          <RequestScheduler>
          <RAIDb-1Scheduler level="passThrough"/>
          </RequestScheduler>

          <LoadBalancer>
          <RAIDb-1>
          <WaitForCompletion policy="first"/>
          <RAIDb-1-LeastPendingRequestsFirst/>
          </RAIDb-1>
          </LoadBalancer>
          </RequestManager>

          </VirtualDatabase>

          </C-JDBC>

          2、在 /usr/local/c-jdbc/config/controller 目錄中創(chuàng)建 C-JDBC controller 配置文件,并把它命名為 uud-controller-distributed.xml,內(nèi)容如下:

          <?xml version="1.0" encoding="UTF8" ?>
          <!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="25323">
          <JmxSettings>
          <RmiJmxAdaptor port="1091"/>
          </JmxSettings>
          <VirtualDatabase configFile="mysql-raidb1-distribution.xml" virtualDatabaseName="myDB" autoEnableBackends="true"/>
          </Controller>
          </C-JDBC-CONTROLLER>

          3、在 /usr/local/c-jdbc/config/demo 目錄中創(chuàng)建啟動 C-JDBC controller sh,并把它命名為 uud-distributed-raidb1-controller.sh,內(nèi)容如下:

          #!/bin/sh

          export CJDBC_HOME=/usr/local/c-jdbc
          export JAVA_HOME=/opt/jdk1.5

          cd $CJDBC_HOME/bin

          echo "Waiting for mysql servers to finish start up"

          echo "Starting Controller"
          ./controller.sh -f ../config/controller/uud-controller-distributed.xml &

          八、啟動 C-JDBC Controller
          bash> cd /usr/local/c-jdbc/demo
          bash> chmod u+rwx uud-distributed-raidb1-controller.sh
          bash> ./uud-distributed-raidb1-controller.sh &

          如果啟動正常,顯示的信息如下:

          Waiting for mysql servers to finish start up
          Starting Controller
          2006-04-20 10:32:21,126 INFO controller.core.Controller C-JDBC controller (2.0.2)
          2006-04-20 10:32:21,189 INFO controller.core.Controller Loading configuration file: ../config/controller/uud-controller-distributed.xml
          2006-04-20 10:32:21,278 INFO controller.core.Controller JMX is enabled
          2006-04-20 10:32:21,308 INFO controller.core.Controller Starting JMX server on host: 127.0.0.1
          2006-04-20 10:32:21,674 INFO backend.DatabaseBackend.mysqlNode211 Adding connection manager for virtual user "boss"
          2006-04-20 10:32:21,749 INFO backend.DatabaseBackend.mysqlNode213 Adding connection manager for virtual user "boss"
          2006-04-20 10:32:21,809 INFO controller.RequestManager.myDB Request manager will parse requests with the following granularity: NO_PARSING
          2006-04-20 10:32:21,814 INFO controller.virtualdatabase.myDB Configuring jgroups using: file:/usr/local/c-jdbc/config/jgroups.xml

          -------------------------------------------------------
          GMS: address is 127.0.0.1:32773
          -------------------------------------------------------
          2006-04-20 10:32:26,476 INFO controller.virtualdatabase.myDB Group myDB connected to /127.0.0.1:32773[/127.0.0.1:32773]
          2006-04-20 10:32:26,476 INFO controller.virtualdatabase.myDB First controller in group myDB
          2006-04-20 10:32:26,477 WARN controller.virtualdatabase.myDB No recovery log has been configured, enabling backend without checkpoint.

          [1]+ Done ./uud-distributed-raidb1-controller.sh

          八、編寫 C-JDBC 客戶端程序
          1、把 C-JDBC Drivers(/usr/local/c-jdbc/drivers/c-jdbc-driver.jar) 放置到 CLASSPATH 中
          2、編寫插入 10 條數(shù)據(jù)到 Mysql 中,程序如下:

          /**
          * @author 胡榮華
          * @Company 世紀(jì)龍 21cn
          */
          package com.cjdbc.test;

          import java.sql.Connection;
          import java.sql.PreparedStatement;
          import java.sql.DriverManager;

          /**
          *
          */
          public class GenerateSampleData {

          public void generate() {
          Connection conn = null;
          PreparedStatement pstmt = null;
          try {
          // 這是 c-jdbc drivers 的 Drivers class,注意不是 mysql 的 Drivers class
          Class.forName("org.objectweb.cjdbc.driver.Driver").newInstance();
          // 192.168.0.1 是 cjdbc controller 所在的 ip
          // myDB 是在 文件 mysql-raidb1-distribution.xml 里定義的 <VirtualDatabase name="myDB">
          // user=boss&password=boss 是在 文件 mysql-raidb1-distribution.xml 里定義的
          // <VirtualUsers>
          // <VirtualLogin vLogin="boss" vPassword="boss"/>
          // </VirtualUsers>

          String url = "jdbc:cjdbc://192.168.0.1:25323/myDB?user=boss&password=boss";

          conn = DriverManager.getConnection(url);

          try{
          conn.setAutoCommit(false);
          pstmt = conn.prepareStatement("insert into user values ('', ?)");

          int numOfTestRecords = 10;
          System.out.println("Update Record Start.");
          for (int i=0;i<numOfTestRecords;i++) {
          String newkey = i + "-" + i;
          pstmt.setString(1, "hua_" + newkey);
          pstmt.executeUpdate();

          }
          conn.commit();
          System.out.println("Update Record Success.");
          }
          catch(Exception ex){
          conn.rollback();
          ex.printStackTrace();
          }
          finally{
          try {
          if( pstmt != null )
          pstmt.close();
          if( conn != null)
          conn.close();
          }
          catch(Exception e) {
          e.printStackTrace();
          }
          }
          } catch (Exception e) {
          e.printStackTrace();
          }
          }

          /**
          * @param args
          */
          public static void main(String[] args) {
          // TODO Auto-generated method stub
          GenerateSampleData g = new GenerateSampleData();
          g.generate();

          }

          }

          3、程序執(zhí)行完畢后,分別到 Mysql Node 192.168.0.2 和 192.168.0.3 查詢,看看是否已同步了數(shù)據(jù),如果兩個(gè) Mysql Node 都有相同的數(shù)據(jù),說明 C-JDBC 環(huán)境搭建成功。

          posted @ 2010-03-25 20:23 Dong 閱讀(411) | 評論 (0)編輯 收藏

          最近做了一個(gè)日志管理系統(tǒng)
          個(gè)人覺得采用了一套非常非常創(chuàng)新或者變態(tài)的開發(fā)方式,就像題目說的那樣,使用web的方法開發(fā)桌面應(yīng)用程序,當(dāng)然所有的技術(shù)都是基于java的。
          總結(jié)一下在整個(gè)項(xiàng)目中使用到的技術(shù)

          1、底層服務(wù)器的開發(fā)socket通信、http報(bào)文解析、反射機(jī)制(這些技術(shù)其實(shí)就是開發(fā)了一款小型的服務(wù)器,讓我們的web代碼能夠在本地運(yùn)行起來,之所以選擇自己開發(fā)服務(wù)器的原因是,tomcat對于我們這個(gè)小桌面程序來說還是太大了點(diǎn),如果作為桌面啟動,用戶不可能等待程序啟動這么長的時(shí)間,我給這個(gè)服務(wù)器起了個(gè)名字叫做jnet
          2、SWT,包括的瀏覽器控件和窗口等。
          3、使用installanywhere來打包程序,方便發(fā)布
          4、前臺展現(xiàn)數(shù)據(jù)使用了ext2.2
          5、擴(kuò)展自己開發(fā)的服務(wù)器jnet,開發(fā)出自己的“action”,應(yīng)該來說還是符合MVC的
          數(shù)據(jù)庫使用的是access,采用jdbc的方式訪問,你知道,如果在桌面軟件上使用hibernate...

          好了,不說廢話
          先貼出成品的效果圖

          1、桌面圖標(biāo)


          2、登錄界面


          3、登錄效果圖


          4、主界面


          是不是覺得還不錯(cuò)呢?JAVA也可以揚(yáng)眉吐氣開發(fā)出這樣的桌面系統(tǒng),可惜的是因?yàn)槭褂玫搅薙WT,所以整個(gè)項(xiàng)目并不能跨平臺,放到linux系統(tǒng)下去運(yùn)行。
          好了先理一理,發(fā)一張項(xiàng)目的原理圖


          看圖說話,我們整個(gè)項(xiàng)目的構(gòu)架,就是這個(gè)樣子的,采用SWT封裝了IE作為前臺展現(xiàn),后臺使用自己開發(fā)的服務(wù)器作為后臺來處理數(shù)據(jù),中間數(shù)據(jù)通信方式當(dāng)然就只能是http了

          所以中心思想就是,我開發(fā)了個(gè)服務(wù)器,這個(gè)服務(wù)器能夠讓用戶擴(kuò)展自己的類,自己的方法,然后用戶就可以根據(jù)自己的需要來書寫自己的系統(tǒng),最最最重要的就是,讓我們這些寫慣了J2EE的人能夠使用已經(jīng)形成的思維來編寫桌面系統(tǒng),我們可以不需要再去學(xué)swing和swt,可以使用html的方式來做前臺的布局,因?yàn)槔蠈?shí)說我每次寫桌面程序的時(shí)候,總會把代碼弄得一團(tuán)糟,在web系統(tǒng)上容易規(guī)規(guī)矩矩的寫出分層的代碼,桌面系統(tǒng)...布局就讓我頭大(我的意思是當(dāng)你跑出去接私活干的時(shí)候,不用再學(xué)一套東西,呵呵)。

          好了,這個(gè)帖子只是一個(gè)簡單的介紹,整個(gè)系統(tǒng)具體的實(shí)現(xiàn)方式,會在后續(xù)的帖子中一步步解析,大家有什么意見或者建議可以給我留言,謝謝!
          posted @ 2009-03-19 15:16 Dong 閱讀(4377) | 評論 (23)編輯 收藏

            開發(fā)的時(shí)候有時(shí)候會碰到這樣的情況,我們在寫程序的時(shí)候并不知道需要調(diào)用某個(gè)對象的哪個(gè)方法,只有程序運(yùn)行后,我們才能夠知道。或許我們需要根據(jù)客戶端傳過來的某個(gè)String參數(shù)的值來判斷我們應(yīng)該執(zhí)行哪個(gè)方法。在這種情況下JAVA的反射執(zhí)行就可以幫上忙了。下面是我做的一個(gè)簡單的測試代碼,提供給大家做個(gè)參考。

          import java.lang.reflect.InvocationTargetException;
          import java.lang.reflect.Method;

          /**
           * 
          @author Dong
           * 測試JAVA reflect機(jī)制
           
          */

          public class TestRef{
              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args){
                      TestBean test 
          = new TestBean();
                      Method[] methods 
          = test.getClass().getMethods();
                      test.setAbc(
          "---");
                      
          for(int i=0;i<methods.length;i++){
                          
          if(methods[i].getName().equalsIgnoreCase("getabc")){
                              
          try {
                                  System.out.println(methods[i].invoke(test));
                              }
           catch (IllegalArgumentException e) {
                                  e.printStackTrace();
                              }
           catch (IllegalAccessException e) {
                                  e.printStackTrace();
                              }
           catch (InvocationTargetException e) {
                                  e.printStackTrace();
                              }

                          }

                      }

              }

          }

          posted @ 2008-06-05 16:36 Dong 閱讀(10216) | 評論 (7)編輯 收藏
          (String[])ArrayList.toArray(new String[0]);
          posted @ 2008-06-02 11:25 Dong 閱讀(811) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 兖州市| 顺昌县| 礼泉县| 桦川县| 河东区| 曲麻莱县| 中江县| 绍兴县| 毕节市| 朔州市| 浮梁县| 崇义县| 中江县| 大竹县| 云梦县| 临澧县| 永康市| 祁门县| 北安市| 迭部县| 亚东县| 嘉黎县| 利津县| 石家庄市| 沾益县| 赤壁市| 太保市| 道孚县| 四平市| 九龙县| 旅游| 洛宁县| 和林格尔县| 琼海市| 宜兰市| 苏尼特右旗| 永兴县| 若羌县| 改则县| 鹤庆县| 重庆市|