Unix 도메인 유형 소켓을 여는 MySQL 사용자 정의 함수를 만들었습니다.MYSQL UDF 소켓
SELECT socketOpen("/path/to/file", "message");
을 항상 <은 10ms에서 실행 :
내 문제는 내가 지금처럼 직접 내 함수를 호출하는 경우이다. 그래서 좋습니다. 하지만 매번이 함수를 수동으로 호출하고 싶지 않기 때문에 데이터베이스에 삽입 한 다음이 함수를 호출하는 저장 프로 시저를 만들었습니다.
내가 직면 한 문제는 저장 프로 시저 은 일반적으로이10ms가 소요되지만 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;
}
나는이 문제에 대한 통찰력을 부탁드립니다. 고맙습니다.