數據庫中間件的核心目的之一就是盡可能透明的線性擴展數據庫能力。其主要功能介紹參考(http://www.onexsoft.com/zh/oneproxy.html)。 但是透明只是相對的,下面就簡要敘述OneProxy的每個功能點及其限制。
1、透明連接池,
a)不支持使用“use”命令來切換當前數據庫, 出於性能考慮,我們不想在每次取得連接或歸還連接時進行還原,這個操作需要一次額外的網絡IO;如果要訪問不同數據庫下的表,請使用不同的用戶進行連接(不同用戶可提定不同的默認數據庫),或者在表名前面加上庫名進行訪問(比如:db.tablename)。
b)不支持set命令,但除“set autocommit={0|1}”外,因為這些操作會影響會話的上下文,除非放在事務中(由開發人員自己負責)。
c)不支持帶傳出參數的存貯過程調用,實際上是通過執行幾句“SET”語句來聲明會話級變量,以進行參數傳遞的,如果不在一個事務中,則不同的調用就不能保證使用的是同一個連接了(除非放在事務中),故而OneProxy默認禁止存貯過程調用。
d)不支持客戶端級別和服務器端級別的Prepared接口,因為綁定變量及語句都是會話級別的。請不用擔心,MySQL JDBC驅動本身就不是真正的Prepared接口的(除非顯式指定了“useServerPrepStmts”參數);針對PHP PDO編程接口,請在連接數據庫時指定“ATTR_EMULATE_PREPARES”選項,使用拼接SQL的方式進行底層交互(並不會影響安全性,增加SQL注放攻擊的概率)。對於Web應用來講連接池相對更重要,並且使用真正的Prepared接口需要更多的網絡調用來完成一個SQL來回,並不利於性能。
2、自動故障切換
3、讀寫分離
4、水平分庫分表
a)不支持多列分區,分區鍵只支持單個列,分區和子分區的列可以不同。這個限制可以讓中間件的分區定位代碼更加高效。
b)分區鍵的值必須是常量,在SQL中為分區鍵指定值是必須是明確的值,不能是函數或表達式。
c)分區鍵不支持OR語句,其允許單值查找(“where pkey = xxx”),可以是多值列表比較(“where pkey in (1,2,3)”),或區間查找(“where pkey >; … and pkey & <; …”,包括“between”操作)。但不支持多個“or”條件(“where pkey = 1 or pkey = 2”)。
d)分區鍵不允許為空,並且不應當被程序后續更新, OneProxy無法檢測出更新后的目標值是否符合分區配置,也不支持分區之間的記錄移動。
e)對於“insert”和“replace”語句,請顯式指定字段列表,例如:“insert into xxx (col1, col2,…) values (…,…)”。
分區鍵類型可以是“int”、 “char”、 “date”或“timestamp”中的一種,其中“date”表示不含時間信息的日期(如“2015-11-11”),而“timestamp”表示帶時間的日期(如“2015-11-11 00:00:00”)。
5、結果集合並
a)臨時結果集有大小限制,目前是100萬行,以避免用完內存,可以通過“proxy-cache-rows”選項進行調整。
b)不支持count distinct,對某個字段統計維一值個數(“count(distinct …)”)的操作。
c)不支持avg,對字段求平均值(”avg(…)”)不被直接支持,請轉換成計數(“count(…)”)和求和(“sum(…)”)兩個操作,再作除法。
d)不支持having不支持分組匯總下的“having xxx”條件過濾。
e)不支持跨實例join。
f)跨庫關聯查詢,僅僅支持按相同維度分表的分表。
6、並行查詢
a)僅支持拆分的表
7、安全控制和SQL審計
8、SQL防火牆
9、OneProxy自身高可用
a)需要依賴VIP
10、分布式sequence
11、SQL關聯度分析
12、事務監控
