MYSQL UDF 套接字

标签 mysql c performance sockets

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

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

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

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

我面临的问题是存储过程通常需要<10ms,但有时需要超过1s。甚至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/

相关文章:

c - 将简单的套接字变成 SSL 套接字

java - Android - 是否可以每毫秒至少运行一次线程更新?

mysql - 如何在 Mac OS X 10.6.6 上安装 mysql 和 ruby​​ 以及 mysql/ruby

mysql - nodejs中的同步mysql查询

c++ - 是否可以使用内存缓冲区(或 PE 资源)来支持只读 SQLite 数据库?

python - 在 python 中使用 try except - 成本是多少?

MySQL:qcache_not_cached

php - 基本 PHP SQL - 从 URL 查询多个内容

php - 某列分组显示的SQL语句

c - 为什么我的数组中有重复项?