如果有數據路由功能的中間件,分庫分表後應用程序可以避免修改。
比如mysql 的proxy 、 mycat 等。
一般分庫分表也都要使用這些工具,不然對開發的程序侵入性太大,也不好維護。
『貳』 mysql讀寫分離在sql里怎麼保證查詢走主庫增刪改走從庫
你說反了吧,增刪改應該走主庫,查詢走從庫
一般是藉助資料庫中間件來完成的,不會自己的手動寫這些的
例如:藉助ShardingProxy,只要配置中寫明主庫和從庫,然後後端連接此中間件,那麼不需要修改代碼,有關增刪改的會被攔截然後到主庫執行,有關查詢的會到從庫執行
詳細的可以到官方網站shardingsphere學習,比手動寫容易多了
『叄』 怎麼用C#寫個資料庫加,刪除,修改,查的中間件服務
先資料庫ado.net及三層架構
三層架構數據訪問層資料庫切操作都三層自看懂
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace B2C.DBUtility
{
/// <summary>
/// 實現所SQL Server資料庫所訪問操作
/// </summary>
public class SqlDBHelp
{
private static string _connStr = "server=.;database=B2C;trusted_connection=true";
private static SqlConnection sqlcon;
/// <summary>
/// 獲取用於資料庫操作連接類
/// </summary>
private static SqlConnection Connection
{
get
{
if (sqlcon == null)
{
sqlcon = new SqlConnection(_connStr);
sqlcon.Open();
}
else if (sqlcon.State == ConnectionState.Broken || sqlcon.State == ConnectionState.Closed)
{
sqlcon.Close();
sqlcon.Open();
}
return sqlcon;
}
}
/// <summary>
/// 根據查詢語句返執行受影響行數
/// </summary>
/// <param name="strsql">Insert、Update、Delete語句</param>
/// <returns>執行受影響行數</returns>
public static int GetExecute(string strsql)
{
int i=-1;
try
{
SqlCommand sqlcmd = new SqlCommand(strsql, Connection);
i= sqlcmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
CloseConnection();
}
return i;
}
/// <summary>
/// 根據查詢語句返執行受影響行數
/// </summary>
/// <param name="strsql">Insert、Update、Delete語句</param>
/// <param name="p">給SQL語句傳遞參數集合</param>
/// <returns>執行受影響行數</returns>
public static int GetExecute(string strsql,params SqlParameter[] p)
{
int i = -1;
try
{
SqlCommand sqlcmd = new SqlCommand(strsql, Connection);
sqlcmd.Parameters.AddRange(p);
i = sqlcmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
CloseConnection();
}
return i;
}
/// <summary>
/// 根據查詢語句獲取查詢結集
/// </summary>
/// <param name="strsql">Select語句</param>
/// <returns>查詢結-表數據</returns>
public static DataTable GetTable(string strsql)
{
DataTable dt = null;
try
{
SqlDataAdapter sda = new SqlDataAdapter(strsql, Connection);
dt = new DataTable();
sda.Fill(dt);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
CloseConnection();
}
return dt;
}
/// <summary>
/// 根據查詢語句獲取查詢結集
/// </summary>
/// <param name="strsql">Select語句</param>
/// <param name="p">給SQL語句傳遞參數集合</param>
/// <returns>查詢結-表數據</returns>
public static DataTable GetTable(string strsql,params SqlParameter[] p)
{
DataTable dt = null;
try
{
SqlDataAdapter sda = new SqlDataAdapter(strsql, Connection);
sda.SelectCommand.Parameters.AddRange(p);
dt = new DataTable();
sda.Fill(dt);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
CloseConnection();
}
return dt;
}
/// <summary>
/// 根據查詢語句返值
/// </summary>
/// <param name="strsql">Select語句</param>
/// <returns>單值</returns>
public static string GetSingle(string strsql)
{
object o = "";
try
{
SqlCommand sqlcmd = new SqlCommand(strsql, Connection);
o = sqlcmd.ExecuteScalar();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
CloseConnection();
}
return o.ToString();
}
/// <summary>
/// 根據查詢語句返值
/// </summary>
/// <param name="strsql">Select語句</param>
/// <param name="p">給SQL語句傳遞參數集合</param>
/// <returns>單值</returns>
public static string GetSingle(string strsql,params SqlParameter[] p)
{
object o = "";
try
{
SqlCommand sqlcmd = new SqlCommand(strsql, Connection);
sqlcmd.Parameters.AddRange(p);
o = sqlcmd.ExecuteScalar();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
CloseConnection();
}
return o.ToString();
}
/// <summary>
/// 根據查詢語句返輕量級SqlDataReader象
/// </summary>
/// <param name="strsql">Select語句</param>
/// <returns>輕量級SqlDataReader象</returns>
public static SqlDataReader GetReader(string strsql)
{
SqlCommand sqlcmd = new SqlCommand(strsql,Connection);
return sqlcmd.ExecuteReader(CommandBehavior.CloseConnection);
}
/// <summary>
/// 根據查詢語句返輕量級SqlDataReader象
/// </summary>
/// <param name="strsql">Select語句</param>
/// <param name="p">給SQL語句傳遞參數集合</param>
/// <returns>輕量級SqlDataReader象</returns>
public static SqlDataReader GetReader(string strsql,params SqlParameter[] p)
{
SqlCommand sqlcmd = new SqlCommand(strsql, Connection);
sqlcmd.Parameters.AddRange(p);
return sqlcmd.ExecuteReader(CommandBehavior.CloseConnection);
}
public static bool GetTransOperate(string[] strsqls)
{
bool isflag = false;
SqlTransaction trans=Connection.BeginTransaction();
SqlCommand sqlcmd = new SqlCommand();
try
{
foreach (string s in strsqls)
{
sqlcmd.CommandText = s;
sqlcmd.Connection = sqlcon;
sqlcmd.ExecuteNonQuery();
}
isflag = true;
trans.Commit();
}
catch (Exception ex)
{
isflag = false;
trans.Rollback();
throw new Exception(ex.Message);
}
finally
{
CloseConnection();
}
return isflag;
}
/// <summary>
/// 關閉資料庫連接
/// </summary>
private static void CloseConnection()
{
if (sqlcon != null)
{
sqlcon.Close();
}
}
}
}
『肆』 直接操作資料庫和通過中間件操作資料庫的區別
個人覺得:
好處:
1 首先,直接操作資料庫,速度有所保證
2 sql直接寫,靈活,當然前提是你對sql的語句要強。
中間件:
1 可以以操作對象的方式操作資料庫
2 有成熟的回滾機制。
壞處:
直接操作資料庫,如果對回滾方式不明確,可能導致垃圾數據。
操作中間價需要了解中間件的相關操作機制。
操作中間價操作資料庫,有時會有所限制,不靈活。
『伍』 如何實現資料庫,中間件統一部署
雖然雲計算時代,傳統資料庫存在著先天性的弊端,但是NoSQL資料庫又無法將其替代。如果傳統數據易於擴展,可切分,就可以避免單機(單庫)的性能缺陷。
MyCat的目標就是:低成本地將現有的單機資料庫和應用平滑遷移到「雲」端,解決數據存儲和業務規模迅速增長情況下的數據瓶頸問題。2014年MyCat首次在上海的《中華架構師》大會上對外宣講引發圍觀,更多的人參與進來,隨後越來越多的項目採用了MyCat。
MyCat截至到2015年4月,保守估計已經有超過60個項目在使用,主要應用在電信領域、互聯網項目,大部分是交易和管理系統,少量是信息系統。比較大的系統中,數據規模單表單月30億。
MyCat是什麼?
從定義和分類來看,它是一個開源的分布式資料庫系統,是一個實現了MySQL協議的伺服器,前端用戶可以把它看作是一個資料庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生協議與多個MySQL伺服器通信,也可以用JDBC協議與大多數主流資料庫伺服器通信,其核心功能是分表分庫,即將一個大表水平分割為N個小表,存儲在後端MySQL伺服器里或者其他資料庫里。
MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流資料庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在MyCat里,都是一個傳統的資料庫表,支持標準的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度
『陸』 ASP與SQL中間件連接的問題
如果你的中間件是DLL格式,那你就在客戶端調用這個DLL就行啦!調用Dll的方法很簡單,首先要在變成環境裡面引用這個Dll文件,然後知道裡面的函數名和參數,直接調用就行了。
『柒』 sqlserver資料庫中間件有哪些
針對不同的應用需求涌現出多種各具特色的中間件產品。但至今中間件還沒有一個比較精確的定義,因此,在不同的角度或不同的層次 上,對中間件的分類也會有所不同。由於中間件需要屏蔽分布環境中異構的操作系統和網路協議,它必須能夠提供分布環境下的通訊服務,將這種通訊服務稱之為平台。基於目的和實現機制的不同,可以將平台分為以下主要幾類:
遠程過程調用(Remote Procere Call)
面向消息的中間件(Message-Oriented Middleware)
對象請求代理(Object Request Brokers)
『捌』 mysql中間件有哪些
mysql-proxy是官方提供的mysql中間件產品可以實現負載平衡,讀寫分離,failover等,但其不支持大數據量的分庫分表且性能較差。下面介紹幾款能代替其的mysql開源中間件產品,Atlas,cobar,tddl,讓我們看看它們各自有些什麼優點和新特性吧。
Atlas
Atlas是由 Qihoo 360, Web平台部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增加了一些新的功能特性。360內部使用Atlas運行的mysql業務,每天承載的讀寫請求數達幾十億條。
Altas架構:
Atlas是一個位於應用程序與MySQL之間,它實現了MySQL的客戶端與服務端協議,作為服務端與應用程序通訊,同時作為客戶端與MySQL通訊。它對應用程序屏蔽了DB的細節,同時為了降低MySQL負擔,它還維護了連接池。
以下是一個可以參考的整體架構,LVS前端做負載均衡,兩個Altas做HA,防止單點故障。
Altas的一些新特性:
1.主庫宕機不影響讀
主庫宕機,Atlas自動將宕機的主庫摘除,寫操作會失敗,讀操作不受影響。從庫宕機,Atlas自動將宕機的從庫摘除,對應用沒有影響。在mysql官方的proxy中主庫宕機,從庫亦不可用。
2.通過管理介面,簡化管理工作,DB的上下線對應用完全透明,同時可以手動上下線。
3.自己實現讀寫分離
(1)為了解決讀寫分離存在寫完馬上就想讀而這時可能存在主從同步延遲的情況,Altas中可以在SQL語句前增加 /*master*/ 就可以將讀請求強制發往主庫。
主庫可設置多項,用逗號分隔,從庫可設置多項和權重,達到負載均衡。
4.自己實現分表
(1)需帶有分表欄位。
(2)支持SELECT、INSERT、UPDATE、DELETE、REPLACE語句。
(3)支持多個子表查詢結果的合並和排序。
這里不得不吐槽Atlas的分表功能,不能實現分布式分表,所有的子表必須在同一台DB的同一個database里且所有的子表必須事先建好,Atlas沒有自動建表的功能。
5.之前官方主要功能邏輯由使用lua腳本編寫,效率低,Atlas用C改寫,QPS提高,latency降低。
6.安全方面的提升
(1)通過配置文件中的pwds參數進行連接Atlas的用戶的許可權控制。
(2)通過client-ips參數對有許可權連接Atlas的ip進行過濾。
(3)日誌中記錄所有通過Altas處理的SQL語句,包括客戶端IP、實際執行該語句的DB、執行成功與否、執行所耗費的時間 ,如下面例子。
圖4
7.平滑重啟
通過配置文件中設置lvs-ips參數實現平滑重啟功能,否則重啟Altas的瞬間那些SQL請求都會失敗。該參數前面掛接的lvs的物理網卡的ip,注意不是虛ip。平滑重啟的條件是至少有兩台配置相同的Atlas且掛在lvs之後。
source:https://github.com/Qihoo360/Atlas
alibaba.cobar
Cobar是阿里巴巴(B2B)部門開發的一種關系型數據的分布式處理系統,它可以在分布式的環境下看上去像傳統資料庫一樣為您提供海量數據服務。那麼具體說說我們為什麼要用它,或說cobar--能幹什麼?以下是我們業務運行中會存在的一些問題:
1.隨著業務的進行資料庫的數據量和訪問量的劇增,需要對數據進行水平拆分來降低單庫的壓力,而且需要高效且相對透明的來屏蔽掉水平拆分的細節。
2.為提高訪問的可用性,數據源需要備份。
3.數據源可用性的檢測和failover。
4.前台的高並發造成後台資料庫連接數過多,降低了性能,怎麼解決。
針對以上問題就有了cobar施展自己的空間了,cobar中間件以proxy的形式位於前台應用和實際資料庫之間,對前台的開放的介面是mysql通信協議。將前台SQL語句變更並按照數據分布規則轉發到合適的後台數據分庫,再合並返回結果,模擬單庫下的資料庫行為。
Cobar應用舉例
應用架構:
應用介紹:
1.通過Cobar提供一個名為test的資料庫,其中包含t1,t2兩張表。後台有3個MySQL實例(ip:port)為其提供服務,分別為:A,B,C。
2.期望t1表的數據放置在實例A中,t2表的數據水平拆成四份並在實例B和C中各自放兩份。t2表的數據要具備HA功能,即B或者C實例其中一個出現故障,不影響使用且可提供完整的數據服務。
cabar優點總結:
1.數據和訪問從集中式改變為分布:
(1)Cobar支持將一張表水平拆分成多份分別放入不同的庫來實現表的水平拆分
(2)Cobar也支持將不同的表放入不同的庫
(3) 多數情況下,用戶會將以上兩種方式混合使用
注意!:Cobar不支持將一張表,例如test表拆分成test_1,test_2, test_3.....放在同一個庫中,必須將拆分後的表分別放入不同的庫來實現分布式。
2.解決連接數過大的問題。
3.對業務代碼侵入性少。
4.提供數據節點的failover,HA:
(1)Cobar的主備切換有兩種觸發方式,一種是用戶手動觸發,一種是Cobar的心跳語句檢測到異常後自動觸發。那麼,當心跳檢測到主機異常,切換到備機,如果主機恢復了,需要用戶手動切回主機工作,Cobar不會在主機恢復時自動切換回主機,除非備機的心跳也返回異常。
(2)Cobar只檢查MySQL主備異常,不關心主備之間的數據同步,因此用戶需要在使用Cobar之前在MySQL主備上配置雙向同步。
cobar缺點:
開源版本中資料庫只支持mysql,並且不支持讀寫分離。
source:http://code.alibabatech.com/wiki/display/cobar/Home
TDDL
淘寶根據自己的業務特點開發了TDDL(Taobao Distributed Data Layer 外號:頭都大了 ©_Ob)框架,主要解決了分庫分表對應用的透明化以及異構資料庫之間的數據復制,它是一個基於集中式配置的 jdbc datasource實現,具有主備,讀寫分離,動態資料庫配置等功能。
TDDL所處的位置(tddl通用數據訪問層,部署在客戶端的jar包,用於將用戶的SQL路由到指定的資料庫中):
淘寶很早就對數據進行過分庫的處理, 上層系統連接多個資料庫,中間有一個叫做DBRoute的路由來對數據進行統一訪問。DBRoute對數據進行多庫的操作、數據的整合,讓上層系統像操作一個資料庫一樣操作多個庫。但是隨著數據量的增長,對於庫表的分法有了更高的要求,例如,你的商品數據到了百億級別的時候,任何一個庫都無法存放了,於是分成2個、4個、8個、16個、32個……直到1024個、2048個。好,分成這么多,數據能夠存放了,那怎麼查詢它?這時候,數據查詢的中間件就要能夠承擔這個重任了,它對上層來說,必須像查詢一個資料庫一樣來查詢數據,還要像查詢一個資料庫一樣快(每條查詢在幾毫秒內完成),TDDL就承擔了這樣一個工作。在外面有些系統也用DAL(數據訪問層) 這個概念來命名這個中間件。
下圖展示了一個簡單的分庫分表數據查詢策略:
主要優點:
1.資料庫主備和動態切換
2.帶權重的讀寫分離
3.單線程讀重試
4.集中式數據源信息管理和動態變更
5.剝離的穩定jboss數據源
6.支持mysql和oracle資料庫
7.基於jdbc規范,很容易擴展支持實現jdbc規范的數據源
8.無server,client-jar形式存在,應用直連資料庫
9.讀寫次數,並發度流程式控制制,動態變更
10.可分析的日誌列印,日誌流控,動態變更
『玖』 我想設計一個訪問SQL Server資料庫的中間件,請問需要注意哪些事項
ADO、ODBC他們都是拜訪資料庫的中心件,我是想設計一個象他們一樣拜訪資料庫的中心件,而不是應用他們去拜訪資料庫。
『拾』 我的軟體是用的sql2000的資料庫,升級win10後,改裝sql2008的資料庫,測試連接成功,
嘗試 應用管理員身份 運行程序