2013-08-26 5 views
2

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; 
} 

나는이 문제에 대한 통찰력을 부탁드립니다. 고맙습니다.

답변

1

나는 응답이 없으므로 문제를 해결하고 해결책을 문제와 공유하고 싶습니다.

문제의 원인은 내가 ancipated와 상당히 다릅니다.

위의 코드를 실행하는 시스템은 느린 속도를 고려하지 않은 Raspberry pi입니다. 대부분의 지연은 프로 시저의 UPDATE 문으로 인해 발생합니다. 엔진 테이블을 MyISAM으로 변경하자마자 모든 것이 순조롭게 진행되었습니다.

코드를 테스트하는 동안 때때로 약간의 지연이있었습니다. 소켓을 비 블로킹으로 수정했습니다. 그 말은 무언가가 잘못 될 경우 소켓이 절대 열리지 않는다는 것을 의미하지만, 무기한 차단보다 낫다는 것을 의미합니다.