gpt4 book ai didi

MYSQL UDF 套接字

转载 作者:行者123 更新时间:2023-11-29 01:59:40 25 4
gpt4 key购买 nike

我创建了一个 MySQL 用户定义函数来打开一个 unix 域类型套接字。

我的问题是,如果我像这样直接调用我的函数:

SELECT socketOpen("/path/to/file", "message");

它总是在 <10 毫秒内执行。所以这很好。但是因为我不想每次都手动调用这个函数,所以我创建了一个存储过程,它执行一个插入数据库然后调用这个函数。

我面临的问题是存储过程通常 需要 <10 毫秒,但有时会超过 1 秒。甚至5s。我不明白这是怎么发生的。是否存在缓存问题或其他问题?

下面是使用的代码,为清楚起见去掉了错误检查:

char *socketOpen(UDF_INIT *initid __attribute__((unused)),
UDF_ARGS *args, char *result, unsigned long *length,
char *is_null, char *error __attribute__((unused)))
{
int sockfd, portno, n, servlen;
struct sockaddr_un serv_addr;
struct hostent *server;
char socket_path[100];
char message[100];

memcpy(socket_path,args->args[0],args->lengths[0]);
socket_path[args->lengths[0]] = 0;
memcpy(message,args->args[1],args->lengths[1]);
message[args->lengths[1]] = 0;

sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

bzero((char *) &serv_addr, sizeof(serv_addr));

serv_addr.sun_family = AF_UNIX;
strcpy(serv_addr.sun_path, args->args[0]);

servlen=strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);
connect(sockfd,(struct sockaddr *) &serv_addr, servlen);

n = write(sockfd, message, strlen(message));

bzero(message,100);

n = read(sockfd, message, 100);

close(sockfd);
strcpy(result, message);
*length = strlen(message);
return result;
}

非常感谢您对这个问题的洞察力。谢谢。

最佳答案

由于我没有收到回复并且我已经解决了问题,所以我想分享我对问题的解决方案。

问题的原因与我预期的完全不同。

运行上面代码的机器是Raspberry pi,我没有考虑到这个慢。事实证明,大部分延迟是由过程中的 UPDATE 语句引起的。一旦我将表 ENGINE 更改为 MyISAM,从那时起一切都很顺利。

尽管在测试代码时,有时仍有轻微延迟。我已经通过使套接字成为非阻塞来解决这个问题。这意味着如果出现问题,套接字将永远不会打开,但我认为这比无限期阻塞要好。

关于MYSQL UDF 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18451416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com