Mycat探索之旅(3)----Mycat的全局序列號

来源:http://www.cnblogs.com/doctorJoe/archive/2016/03/09/5259011.html
-Advertisement-
Play Games

一、本地文件方式 原理:此方式MyCAT將sequence配置到文件中,當使用到sequence中的配置後,MyCAT會更下classpath中的sequence_conf.properties文件中 sequence當前的值。 配置方式: sequence_conf.properties中配置:


一、本地文件方式

原理:此方式MyCAT將sequence配置到文件中,當使用到sequence中的配置後,MyCAT會更下classpath中的sequence_conf.properties文件中

sequence當前的值。

配置方式:

  • sequence_conf.properties中配置:

在sequence_conf.properties文件中做如下配置:

#default global sequence

GLOBAL.HISIDS=

#最小值

GLOBAL.MINID=10001

#最大值

GLOBAL.MAXID=20000

#當前值

GLOBAL.CURID=10000

  • server.xml中配置:
<!--

sequnceHandlerType=0表示:使用本地文件的方式配置mycat的全局序列號,對應sequence_conf.properties文件

sequnceHandlerType=1表示:使用資料庫表的方式配置mycat的全局序列號

-->

<property name="sequnceHandlerType">0</property>
  • 配置完成後重啟mycat服務

測試:

clip_image001

二、使用資料庫方式

原理:在資料庫中建立一張表,存放sequence名稱(name),sequence當前值(current_value),步長(increment int類型每次讀

取多少個sequence,假設為K)等信息;

Sequence獲取步驟:

1).當初次使用該sequence時,根據傳入的sequence名稱,從資料庫這張表中讀取current_value,和increment到MyCat中,

並將資料庫中的current_value設置為原current_value值+increment值;

2).MyCat將讀取到current_value+increment作為本次要使用的sequence值,下次使用時,自動加1,當使用increment次

後,執行步驟1)相同的操作.

MyCat負責維護這張表,用到哪些sequence,只需要在這張表中插入一條記錄即可。若某次讀取的sequence沒有用完,系統就

停掉了,則這次讀取的sequence剩餘值不會再使用。

配置方式:

server.xml配置:

<!--

sequnceHandlerType=0表示:使用本地文件的方式配置mycat的全局序列號,對應sequence_conf.properties文件

sequnceHandlerType=1表示:使用資料庫表的方式配置mycat的全局序列號

-->

<property name="sequnceHandlerType">1</property>

資料庫配置:

1) 創建MYCAT_SEQUENCE表

– 創建存放sequence的表

DROP TABLE IF EXISTS MYCAT_SEQUENCE;

– name sequence名稱

– current_value 當前value

– increment 增長步長! 可理解為mycat在資料庫中一次讀取多少個sequence. 當這些用完後, 下次再從資料庫中讀取.

/*創建存放sequence的表*/

CREATE TABLE MYCAT_SEQUENCE (
    NAME VARCHAR (50),
    current_value INT NOT NULL,
    increment INT NOT NULL DEFAULT 100,
    PRIMARY KEY (NAME)
) ENGINE = INNODB;

 

clip_image002

– 插入一條sequence

INSERT INTO MYCAT_SEQUENCE (
    NAME,
    current_value,
    increment
)
VALUES
    ('GLOBAL', 100000, 100);

clip_image003

2) 創建相關function

– 獲取當前sequence的值 (返回當前值,增量)

-- ----------------------------
-- 函數結構: `mycat_seq_currval`
-- 獲取當前sequence的值(返回當前值,增量)
-- ----------------------------

DROP FUNCTION
IF EXISTS mycat_seq_currval;

CREATE  FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
    DETERMINISTIC
BEGIN
    DECLARE retval VARCHAR(64);
    SET retval="-1,0";
    SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval 
        FROM MYCAT_SEQUENCE  WHERE name = seq_name;
    RETURN retval ;
END

 

clip_image004

– 設置sequence值

-- ----------------------------
-- 函數結構: `mycat_seq_setval`
-- 設置sequence的值
-- ----------------------------

DROP FUNCTION IF EXISTS mycat_seq_setval;

CREATE  FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) 
    CHARSET latin1
    DETERMINISTIC
BEGIN
    DECLARE retval VARCHAR(64);
    DECLARE inc INT;
    SET inc = 0;
    SELECT increment INTO inc FROM MYCAT_SEQUENCE WHERE name = seq_name;
    UPDATE MYCAT_SEQUENCE SET current_value = value WHERE name = seq_name;
    SELECT concat(CAST(value as CHAR),",",CAST(inc as CHAR)) INTO retval;
    RETURN retval;
END

 

clip_image005

– 獲取下一個sequence值

-- ----------------------------
-- 函數結構: `mycat_seq_nextval`
-- 獲取下一個sequence的值
-- ----------------------------
DROP FUNCTION IF EXISTS mycat_seq_nextval;
CREATE  FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
    DETERMINISTIC
BEGIN
    DECLARE retval VARCHAR(64);
    DECLARE val BIGINT;
    DECLARE inc INT;
    DECLARE seq_lock INT;
    set val = -1;
    set inc = 0;
    SET seq_lock = -1;
    SELECT GET_LOCK(seq_name, 15) into seq_lock;
    if seq_lock = 1 then
      SELECT current_value + increment, increment INTO val, inc 
          FROM MYCAT_SEQUENCE WHERE name = seq_name for update;
      if val != -1 then
          UPDATE MYCAT_SEQUENCE SET current_value = val WHERE name = seq_name;
      end if;
      SELECT RELEASE_LOCK(seq_name) into seq_lock;
    end if;
    SELECT concat(CAST((val - inc + 1) as CHAR),",",CAST(inc as CHAR)) INTO retval;
    RETURN retval;
END

 

clip_image006

3) sequence_db_conf.properties相關配置,指定sequence相關配置在哪個節點上:

clip_image007

這裡設置的是dn1節點,那麼上面的函數及表都是建立在dn1節點對應的資料庫實例上的

註意:MYCAT_SEQUENCE表和以上的3個function,需要放在同一個節點上。function請直接在具體節點的資料庫上執行

測試:

insert into travelrecord(id,name)values(next value for MYCATSEQ_GLOBAL,'hexmith');

clip_image008

insert into travelrecord(id,name)values(next value for MYCATSEQ_GLOBAL,'Mycat');

clip_image009

在前面的測試中,我添加到MYCAT_SEQUENCE表中的數據設置的步長是100,此處吻合。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 網頁字體: font-size: 16px;font-family: "Microsoft Yahei", Arial, Helvetica, sans-serif; 網路常用來顯高大上的名言警句字體 font: 12px "宋體", Arial, Helvetica, sans-serif; 普通
  • 有沒有辦法讓程式員徹底拋棄書寫SQL思想,完全的使用面向對象思想開發軟體呢? 需要一種可行的ORM框架。 什麼是ORM? 不同的資料庫使用的SQL語法不同,比如PL/SQL(Oracle)和T/SQL(SQL SERVER); 同樣的功能不同的資料庫有不同的實現方式; 程式過分依賴SQL對程式的移植
  • MySQL 教程 MySQL 安裝 MySQL 管理與配置 MySQL PHP 語法 MySQL 連接 MySQL 創建資料庫 MySQL 刪除資料庫 MySQL 選擇資料庫 MySQL 數據類型 MySQL 創建數據表 MySQL 刪除數據表 MySQL 插入數據 MySQL 查詢數據 MySQL
  • 目前為止,學習編程一年有餘,寫過管理系統,寫過商城,寫過桌面,接觸的多了,亂七八糟的點太多,一堆前段框架,後臺類庫,紛紛雜雜,更新迭代之快也是令人咋舌。於是我就在想,作為一名程式員,哪些內容是實打實的乾貨呢,互聯網的內容是學習不完的,只有當你用到它時,才去學習,這是我的理解。零零散散的東西除去,越來
  • execute,簡寫為exec,除了用來執行存儲過程,一般都用來執行動態Sql sp_executesql,sql2005中引入的新的系統存儲過程,也是用來處理動態sql的,如: exec sp_executesql @sql, N'@count int out,@id varchar(20)',
  • -- =============================================-- Author: <Author,,Name>-- Create date: <Create Date,,>-- Description: <Description,,>-- ============
  • ORACLE 10g提供了一個腳本sqltrpt.sql用來查詢最耗費資源的SQL語句,其輸出的結果分為兩部分: 15 Most expensive SQL in the cursor cache 15 Most expensive SQL in the workload repository 另外...
  • 國內最大的程式員社區CSDN網站的用戶資料庫被黑客公開發佈,600萬用戶的登錄名及密碼被公開泄露,隨後又有多家網站的用戶密碼被流傳於網路,連日來引發眾多網民對自己賬號、密碼等互聯網信息被盜取的普遍擔憂。 網路安全成為了現在互聯網的焦點,這也恰恰觸動了每一位用戶的神經,由於設計的漏洞導致了不可收拾的惡
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...