数据库中间件的核心目的之一就是尽可能透明的线性扩展数据库能力。其主要功能介绍参考(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、事务监控