0

我们正在使用 NetScaler 9(我们在 v10)中引入的新 DataStream 功能来进行内容切换(在此处描述: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 语句或注释的情况下,内容切换器无法检测到这是一个选择查询,它会绕过我们的只读虚拟服务器。

我要告诉我们所有的开发人员,他们必须在每个查询中为每个表完全别名,并避免使用语句(是的,无论如何这是一件好事),而且他们不能在他们的 sql 中使用注释(这很愚蠢)。

有谁知道如何配置我的 NetScaler DataStream 内容切换以忽略注释和使用语句?

4

3 回答 3

2

关于将查询发送到何处的决定是在成功验证后收到的第一行完成的......所以忽略评论将不起作用。您可以设置一个响应者策略,它会发回一条错误消息,说“请不要在发送到负载平衡 VIP 的命令中使用 SQL 注释”。有点严厉,但是您的开发人员会很快收到消息..但是没有办法忽略评论,但仍然根据 select 语句做出决定。但是,我的印象是 select 语句取决于第一个分号......所以在你上面的例子中,它应该(理论上)仍然找到 select 语句。但是,我需要对其进行测试以确定行为。

另外 - USE 语句很关键。这是在其上发出所有后续命令的 DB。最好不要使用 USE 语句,而是将 select 语句更改为: select col1 from database.table1;

一旦看到 USE 语句,它就会阻止任何后续命令沿同一连接流水线传输……因此,如果有很多 Use 语句,您将无法享受 DataStream 附带的连接多路复用功能。

于 2014-09-29T22:43:31.890 回答
0

我们了解到块级注释是可以接受的,但单行注释不是。

这被正确地忽略了:

/* my comment */

这些注释样式被视为查询的一部分:

-- my comment
# my comment
于 2014-10-02T15:41:50.890 回答
0

当 SET autocommit=0 完全合理时有点荒谬。在那种情况下怎么办。

于 2015-03-11T21:47:47.677 回答