Mysql连接数过大问题和字符串转义问题。
csyourui opened this issue · 4 comments
hi 我最近在使用workflow中遇到了两个问题:
- 在每一个Http回调中启动一次mysql的task任务,使用时发现当http调用过大时会导致db连接数过大占满了db,workflow中可以通过什么途径限制db连接上限?这块有什么优化空间吗?
- 在使用Mysql的set_query()方法时,发现插入字符串未经过转义的问题,请问workflow有实现EscapeString方法吗?
你好,第一个问题,控制并发连接数有几个方法可以解决:
最简单的,可以参考https://github.com/sogou/workflow/blob/master/docs/about-config.md 看看配置单个目标的最大连接数,学着里边的例子把一个远端目标的连接数改小:
struct WFGlobalSettings settings = GLOBAL_SETTINGS_DEFAULT;
settings.endpoint_params. max_connections = 50;
WORKFLOW_library_init(&settings);
注意这样会修改掉全局的配置。
另外比较建议的方式是自己控制http发出的mysql请求并发数,workflow中的series就是可以用来做任务的控制的。还有如果只想改一个目标的settings,也可以把这个目标地址通过upstream的方式配置,就可以独享自己的一份settings了,参考这里:https://github.com/sogou/workflow/blob/master/docs/about-upstream.md
第二个问题,mysql的set_query()目前没有提供转义功能,需要你先转好。我看了下,官方客户端这个函数的实现也许还可能需要和当前mysql的当前字符集转义字符串有关?所以我们需要调研一下再决定是否支持~
通过改最大连接数的方法不太好,会导致MySQL任务失败。
最佳方法是用WFResourcePool。
https://github.com/sogou/workflow/blob/master/docs/about-conditional.md
直接给你写个demo吧:
#include "workflow/WFResourcePool.h"
#include "workflow/WFTaskFactory.h"
#include "workflow/WFHtttpServer.h"
#include "workflow/MySQLResult.h"
WFResourcePool respool(50); // 假设最大50个并发
void mysql_callback(WFMySQLTask *task)
{
respool.post(NULL); // 归还资源
...
}
void process(WFHttpTask *server_task)
{
WFMySQLTask *mysql_task = WFTaskFactory::create_mysql_task(..., mysql_callback);
WFConditional *cond = respool.get(mysql_task);
series_of(server_task)->push_back(cond);
}
int main()
{
WFHttpServer(process);
....
}
比你原来的代码只多两行:
1、产生mysql_task之后,通过respool.get得到一个条件任务。用条件任务代替mysql_task。
2、mysql_callback里,先通过respool.post归还资源。
明白了,辛苦各位了