我们正在使用NetScaler 9中引入的新DataStream功能(我们在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;
我们发现,如果查询只是以选择开头,那么一切都在顺畅地进行。但是,如果在查询之前存在use语句或注释,则内容swticher无法检测到这是一个select查询,它会绕过我们的只读虚拟服务器。
我即将告诉所有开发人员他们必须在每个查询中对每个表进行完全别名并避免使用语句(是的,这无论如何都是好事),并且他们也不能在他们的sql中使用注释(&# 39;愚蠢的)。
有谁知道如何配置我的NetScaler DataStream内容切换以忽略注释和使用语句?
答案 0 :(得分:2)
关于在何处发送查询的决定是在成功验证后收到的第一行完成的......所以忽略评论不会起作用。 您可以设置一个响应者策略,该策略发回一条错误消息,说明"请不要在发送给负载均衡VIP的命令中使用SQL注释"。有点严厉,但你的开发人员会很快得到消息..但是没有办法忽略评论,但仍然根据select语句做出决定。但是,我的印象是select语句是第一个半冒号...所以在上面的例子中,它应该(理论上)仍然可以找到select语句。我需要测试一下,以确定行为。
此外 - USE声明至关重要。这是发出所有后续命令的DB。 最好不要使用USE语句,而是将select语句更改为: 从database.table1;
中选择col1一旦看到USE语句,它就会阻止任何后续命令在同一连接中被流水线化......所以如果有很多Use语句,你将无法享受DataStream附带的连接多路复用功能。 / p>
答案 1 :(得分:0)
我们了解到Block Level注释是可以接受的,但单行注释却没有。
这被正确忽略:
/* my comment */
这些评论样式被视为查询的一部分:
-- my comment
# my comment
答案 2 :(得分:0)