我创建了一个 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;
}
我会很感激你对这个问题的洞察力。谢谢你。