8000 Mysql连接数过大问题和字符串转义问题。 · Issue #643 · sogou/workflow · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Mysql连接数过大问题和字符串转义问题。 #643

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
csyourui opened this issue Nov 15, 2021 · 4 comments
Closed

Mysql连接数过大问题和字符串转义问题。 #643

csyourui opened this issue Nov 15, 2021 · 4 comments
Labels
documentation Improvements or additions to documentation

Comments

@csyourui
Copy link

hi 我最近在使用workflow中遇到了两个问题:

  1. 在每一个Http回调中启动一次mysql的task任务,使用时发现当http调用过大时会导致db连接数过大占满了db,workflow中可以通过什么途径限制db连接上限?这块有什么优化空间吗?
  2. 在使用Mysql的set_query()方法时,发现插入字符串未经过转义的问题,请问workflow有实现EscapeString方法吗?
@holmes1412
Copy link
Contributor

你好,第一个问题,控制并发连接数有几个方法可以解决:

最简单的,可以参考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的当前字符集转义字符串有关?所以我们需要调研一下再决定是否支持~

@Barenboim
Copy link
Contributor

通过改最大连接数的方法不太好,会导致MySQL任务失败。
最佳方法是用WFResourcePool。
https://github.com/sogou/workflow/blob/master/docs/about-conditional.md

@Barenboim
Copy link
Contributor

直接给你写个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归还资源。

@csyourui
Copy link
Author

明白了,辛苦各位了

@Barenboim Barenboim added the documentation Improvements or additions to documentation label Nov 15, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

3 participants
0