Discuz!NT3.1 資料庫讀寫分離 程式碼
Discuz!NT 3.1版本為專案使用者專門開發了負載均衡、資料庫讀寫分離、分散式快取和檢測工具一系列套件,為超大型社群建設提供了完美的技術解決方案。但在標準版中沒有實現讀寫分離的.在此為標準版實現了資料讀寫分離
1. 第一步 實現資料庫負載均衡類
/// <summary>
/// 負載均衡排程介面
/// </summary>
public interface ILoadBalanceScheduling
{
/// <summary>
/// 獲取應用當前負載均衡排程演算法下的快照連結資訊
/// </summary>
/// <returns></returns>
DbSnapInfo GetConnectDbSnap();
}
以上是Discuz!NT 3.1中提供的:讀資料庫 的負載均衡排程介面 (注:在標準版中少了Discuz.EntLib.dll)接下來我們來實現上面介面
using System;
using System.Collections.Generic;
using System.Text;
using Discuz.Config;
using DCG = Discuz.Common.Generic;
namespace Discuz.EntLib
{
public class DBLoadBalanceScheduling : ILoadBalanceScheduling
{
/// <summary>
/// 鎖物件
/// </summary>
private static object m_lockHelper = new object();
#region ILoadBalanceScheduling 成員
public DbSnapInfo GetConnectDbSnap()
{
lock (m_lockHelper)
{
DbSnapAppConfig snapConfigs = DbSnapConfigs.GetConfig();
if (DbSnapConfigs.GetEnableSnapList().Count <= 0)
throw new NotImplementedException();
return DBLoadBalanceManager.GetDbSnapInfo();
}
}
#endregion
}
class DBLoadBalanceManager
{
/// <summary>
/// 鎖物件
/// </summary>
private static object m_lockHelper = new object();
private static DCG.List<DbSnapInfo> enableSnapList = null;
private static int i = -1;
public static DbSnapInfo GetDbSnapInfo()
{
lock (m_lockHelper)
{
DbSnapAppConfig snapConfigs = DbSnapConfigs.GetConfig();
enableSnapList = DbSnapConfigs.GetEnableSnapList();
int count = enableSnapList.Count;
while (true)
{
i = (i + 1) % count;
int cw = enableSnapList[i].Weight;
if (i == 0)
{
cw = cw - GetGcd();
if (cw <= 0)
{
cw = GetMax();
if(cw == 0)
throw new NotImplementedException();
}
}
if (enableSnapList[i].Weight >= cw)
return enableSnapList[i];
}
}
}
private static int GetMax()
{
int max = 0;
foreach (DbSnapInfo info in enableSnapList)
{
if (max <= info.Weight)
{
max = info.Weight;
}
}
return max;
}
private static int GetMin()
{
int min = 0;
for (int i = 0; i < enableSnapList.Count; i++)
{
if (i == 0)
{
min = enableSnapList[i].Weight;
}
if (min > enableSnapList[i].Weight)
{
min = enableSnapList[i].Weight;
}
}
return min;
}
private static int GetGcd()
{
int gcd = 1;
int min = GetMin();
for (int i = min; i <= 2; i--)
{
if (GetMod(i))
{
gcd = i;
break;
}
}
return gcd;
}
/// <summary>
/// 是否能被所有權重整除
/// </summary>
/// <param name="num"></param>
/// <returns>能true,不能false</returns>
private static bool GetMod(int num)
{
bool flag = true;
foreach (DbSnapInfo info in enableSnapList)
{
if (0 != (info.Weight % num))
{
flag = false;
break;
}
}
return flag;
}
}
}
可以在Discuz!NT 3.1中新增一個Discuz.EntLib類庫專案 並新增一個DBLoadBalanceScheduling.cs檔案並加上面程式碼
2.第二步新增資料庫負載均衡config檔案
由於Discuz!NT 3.1中需要dbsnap.config檔案,所以需要在"專案路徑/web/config/"下新增“dbsnap.config”檔案,內容如下:
<?xml version="1.0"?>
<DbSnapAppConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AppDbSnap>true</AppDbSnap>
<WriteWaitTime>6</WriteWaitTime>
<LoadBalanceScheduling>DBLoadBalanceScheduling</LoadBalanceScheduling>
<RecordeLog>false</RecordeLog>
<DbSnapInfoList>
<DbSnapInfo>
<SouceID>0</SouceID>
<Enable>true</Enable>
<DbconnectString>第一個資料連線串</DbconnectString>
<Weight>1</Weight>
</DbSnapInfo>
<DbSnapInfo>
<SouceID>1</SouceID>
<Enable>true</Enable>
<DbconnectString>第一個資料連線串</DbconnectString>
<Weight>1</Weight>
</DbSnapInfo>
</DbSnapInfoList>
</DbSnapAppConfig>
完成以上操作便可以在Discuz!NT 3.1中實現讀寫分離和讀資料庫的負載均衡
相關文章
- Discuz!NT資料庫讀寫分離方案資料庫
- 資料庫讀寫分離資料庫
- 資料庫的讀寫分離資料庫
- 大資料資料庫讀寫分離分庫分表大資料資料庫
- 資料庫讀寫分離Master-Slave資料庫AST
- 資料庫治理利器:動態讀寫分離資料庫
- Spring實現資料庫讀寫分離Spring資料庫
- golang saas框架,資料庫級別隔離、讀寫分離Golang框架資料庫
- 資料讀寫壓力大,讀寫分離
- Spring Aop實現資料庫讀寫分離Spring資料庫
- MyCat分庫分表、讀寫分離
- Mycat 讀寫分離+分庫分表
- 做資料庫分離讀寫時,sqlServer資料庫資料同步的問題:資料庫SQLServer
- 資料庫的讀寫分離與負載均衡策略資料庫負載
- 資料庫讀寫分離,主從同步實現方法資料庫主從同步
- 【資料庫訪問優化方案之讀寫分離】資料庫優化
- OneProxy5.8.1資料庫讀寫分離特性試驗資料庫
- 讀寫分離的的資料同步?
- 淺談高效能資料庫叢集——讀寫分離資料庫
- 使用Spring AOP切面解決資料庫讀寫分離Spring資料庫
- 資料庫 讀寫分離 為什麼提高效能資料庫
- 讀寫分離 & 分庫分表 & 深度分頁
- (7)資料庫讀寫分離,主從同步實現方法(資料庫設定)資料庫主從同步
- ssm讀寫分離多資料來源SSM
- MySQL 中讀寫分離資料延遲MySql
- 深度:微服務化的資料庫設計與讀寫分離微服務資料庫
- ShardingSphere(七) 讀寫分離配置,實現分庫讀寫操作
- RDS讀寫分離,海量資料一鍵搞定
- MyCat 讀寫分離 資料庫分庫分表 中介軟體 安裝部署,及簡單使用資料庫
- 資料庫讀寫分離這個坑,你應該踩過吧?資料庫
- 華納雲:雲資料庫中自動讀寫分離是什麼?資料庫
- 資料庫中介軟體sharding-jdbc實現讀寫分離資料庫JDBC
- Docker實現Mariadb分庫分表、讀寫分離Docker
- 直播賣貨系統,如何實現mysql資料庫的讀寫分離MySql資料庫
- 資料庫中介軟體 Sharding-JDBC 原始碼分析 —— JDBC實現與讀寫分離資料庫JDBC原始碼
- Spring動態資料來源+Mybatis攔截器實現資料庫讀寫分離SpringMyBatis資料庫
- Redis的讀寫分離Redis
- Laravel讀寫分離原理Laravel