我们使用在DataStream 9中引入的新的NetScaler特性(我们在v10上)来进行内容切换(在这里描述:http://support.citrix.com/proddocs/topic/netscaler/ns-dbproxy-wrapper-con.html)。我们有一个只读虚拟服务器,可以在几个只读MySql奴隶之间进行平衡。我们使用内容切换将所有“选择”发送到只读服务器。
该策略配置如下:
mysql.req.query.command.contains("select")我们的用户向我们的数据库服务器发送多部分查询。它们通常很简单,比如:
use database;
select col1 from table1;有时,他们会将评论放在查询的首位。例如:
-- this is my query
select col1 from table1;我们所发现的是,如果查询以select开头,那么一切都很顺利。但是,在查询之前有一个use语句或注释的情况下,内容swticher无法检测到这是一个select查询,并且它绕过了我们的只读虚拟服务器。
我要告诉我们的所有开发人员,他们必须将每个查询中的每个表完全化名,避免使用语句(是的,这无论如何都是件好事),而且他们不能在sql中使用注释(这太愚蠢了)。
有人知道我如何配置我的NetScaler DataStream内容切换到忽略注释和使用语句吗?
发布于 2014-09-29 22:43:31
关于在何处发送查询的决定是在成功身份验证后收到的第一行上完成的.所以忽视这个评论是行不通的。您可以设置一个响应方策略,该策略返回一条错误消息:“请不要在发送给负载平衡VIP的命令中使用SQL注释”。有点严厉,但是你的开发人员会很快得到信息..但是没有办法忽略这个注释,但是仍然可以根据select语句做出决定。然而,我的印象是select语句到第一个分号.因此,在上面的示例中,它(理论上)仍然应该找到select语句。不过,我需要测试一下,才能确定自己的行为。
而且-- USE语句是关键的。这是发出所有后续命令的DB。最好不要使用use语句,而是将select语句更改为:从col1选择database.table1;
一旦看到USE语句,它将防止任何后续命令在同一连接上流水线化.因此,如果有大量Use语句,您将无法享受DataStream附带的连接多路复用功能。
发布于 2014-10-02 15:41:50
我们了解到块级注释是可以接受的,但是单行注释是不可接受的。
这一点完全被忽略了:
/* my comment */这些注释样式被视为查询的一部分:
-- my comment
# my comment发布于 2015-03-11 21:47:47
当设置autocommit=0是完全合理的,有点可笑。在那种情况下呢。
https://stackoverflow.com/questions/26107296
复制相似问题