首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MYSQL UDF套接字

MYSQL UDF套接字
EN

Stack Overflow用户
提问于 2013-08-26 19:17:54
回答 1查看 774关注 0票数 2

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

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

代码语言:javascript
复制
SELECT socketOpen("/path/to/file", "message");

它总是在<10 It中执行。所以这很好。但是,由于我不想每次都手动调用这个函数,所以我创建了一个存储过程,它对数据库进行插入,然后调用这个函数。

我面临的问题是,存储过程通常需要小于10 1s,但有时需要超过1s。即使是5秒。我不明白这是怎么发生的。有没有缓存问题什么的?

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

代码语言:javascript
复制
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;
}

我很感激你对这个问题的洞察力。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-30 09:51:57

由于我没有得到任何答复,而且我已经解决了这个问题,我想分享我对这个问题的解决方案。

这个问题的起因与我所发现的大不相同。

运行上述代码的机器是Raspberry pi,这一点我没有考虑到。事实证明,大部分延迟是由过程中的UPDATE语句造成的。当我将表引擎改为MyISAM时,从那时起,一切都顺利了。

在测试代码时,有时仍然会出现轻微的延迟。我已经解决了这个问题,让插座没有阻塞。这意味着,如果出现问题,套接字将永远不会打开,但我认为这比不确定地阻止更好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18451416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档