DBUtil教程之數據庫集群備份
在現在系統中,海量數據成為軟件工程師要面對的主要問題。很多人都把數據庫優化集中在編程和數據庫的結構,再構建一些索引和視圖,但是在編程和表結構都到了極致的時候,數據庫優化該何去何從。
Oracle公司現在有一個比較熱門的數據庫集群技術,叫做rac。rac應該是現在數據庫集群中最優化和最熱門的技術。但是只是局限于同類型和同構數據庫上面。
RAC是一個負載均衡的代表,它的集群主要是面對不是大而復雜的數據庫查詢,而是面對大量的連接。但是如果我們面對是一個異類異構數據庫怎么解決。
近年來,有一種比較熱門的數據庫進入我們生活,列式數據庫。它是一個高查詢性能,低插入性能的數據庫。現在主要代表是sybaseiq,主要開源的 列式數據庫有monetdb 。但是列式數據庫問題很多,主要是插入慢、數據庫不穩定、數據庫傳統語法支持不強、穩定性低、線程低和擴展性低。但是達到幾百萬行以上數據以后,列式數據 庫的查詢速度是mysql的10倍以上。
在一個大型系統中,行式和列式數據庫優勢互補,合理使用成為開發人員必須關心的問題。我們今天的集群也是主要面對這個問題。
集群原理:
在dbutil的集群中,我們是用了一個行式數據庫和若干個列式數據庫組成,每次更新數據的時候,我們是用廣播模式,把增刪改數據通過廣播模式,群 體更新所有的數據。當查詢數據時候,我們會通過連接池模式,找出最少人使用的數據,查詢數據。并且可以設置每天定時同步數據,把存放在行式數據的數據,定 時同步到所有的節點。
配置方法:
在我們之前幾個文章簡單見過DBUtil的使用,配置方法和之前的教程大同小異。
1.配置xml
- <!-- 集群測試數據庫 -->
- <Resource jndi="jdbc/Cluster1" driverClass="com.mysql.jdbc.Driver"
- dbUserName="root" dbPassWord="root"
- jdbcUrl="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8"
- initSize="2" minPoolSize="1" maxPoolSize="10" maxStatements="50"
- maxIdleTime="60" />
- <Resource jndi="jdbc/Cluster2" driverClass="com.mysql.jdbc.Driver"
- dbUserName="root" dbPassWord="root"
- jdbcUrl="jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf-8"
- initSize="2" minPoolSize="1" maxPoolSize="10" maxStatements="50"
- maxIdleTime="60" />
- <!-- 集群 -->
- <Cluster jndiCluster="jdbc/Cluster" mainDB="jdbc/Cluster1"
- synchronous="off" synchronousTime="00:00" protect="on">
- <Resource jndi="jdbc/Cluster1" />
- <Resource jndi="jdbc/Cluster2" />
- </Cluster>
配置xml也是首先配置2個數據庫節點,然后加入集群。
- jndiCluster:是集群的唯一標識符
- mainDB:集群的主數據庫,建議用mysql數據庫
- synchronous:同步數據
- synchronousTime:同步時間
- protect:保護模式(查詢數據,不用主數據庫,只是獲取集群數據庫的數據)
2.更新數據
- package com.shine.DBUtil;
- import com.shine.DBUtil.manage.DBManager;
- import com.shine.DBUtil.utils.ClusterList;
- public class ClusterUpdateExample {
- /**
- * 集群更新例子
- *
- * @param args
- */
- public static void main(String[] args) {
- System.out.println("ClusterUpdateExample...");
- DBUtil
- .getInstance()
- .init(
- "E:\\workspace\\JavaFramework2.5\\src\\com\\shine\\DBUtil\\config\\dbXml.xml");
- ClusterList list = DBManager.getInstance()
- .getClusterConnectionNameList("jdbc/Cluster");
- System.out.println("主數據庫為:" + list.getMainDB());
- String sql = "insert into test1(test) value('test')";
- DBUtil.getInstance().executeClusterUpdate("jdbc/Cluster", sql);
- }
- }
3.查詢數據
- package com.shine.DBUtil;
- import com.shine.DBUtil.model.DBModel;
- public class ClusterSelectExample {
- /**
- * 集群查詢
- *
- * @param args
- */
- public static void main(String[] args) {
- System.out.println("ClusterSelectExample...");
- DBUtil
- .getInstance()
- .init(
- "E:\\workspace\\JavaFramework2.5\\src\\com\\shine\\DBUtil\\config\\dbXml.xml");
- String sql = "select * from test1";
- String clusterJndi = "jdbc/Cluster";
- DBModel dbmodel1 = DBUtil.getInstance().executeClusterQuery(
- clusterJndi, sql);
- DBModel dbmodel2 = DBUtil.getInstance().executeClusterQuery(
- clusterJndi, sql);
- }
- }
實際上集群數據庫的同步最好是不要選擇定時同步,除非特殊需要,因為如果用到數據庫集群,必然會有海量的數據。而DBUtil的定時同步是整庫同步,使用者應該根據業務邏輯分表,部分同步比較實際。
原文鏈接:http://blog.csdn.net/arjick/article/details/6758872
【編輯推薦】