以前我要插入数据库直接使用MYSQL的 mysql_real_query函数直接就入库了,网上搜索看到预处理更快,然后试着实现了一下,但是经过测试发现一样的,和以前效率没区别,都是1000多条每秒。
顺表问下,MYSQL无法支持多线程吗?我只要取消加锁 MYSQL就提示个错误 接着就崩溃数据库执行错误2:Lost connection to MySQL server during query
然后就崩溃了怎么会是?还有这个效率怎么这么慢lpszSQLQuery参数的内容是:INSERT INTO `data_httpdown_2013-07-19` (`probe_id`,`src_mac`,`dst_mac`,`src_ip`,`dst_ip`,`src_name`,`dst_name`,`dst_equip_type`,`dst_app_id`,`ip_version`,`ip_tunnel`,`src_port`,`dst_port`,`proto_type`,`proto_sub_type`,`operation`,`log_type`,`log_level`,`opstatus`,`rule_id`,`group_id`,`rulekeyword`,`domain`,`url`,`summary`,`content`,`file_name`,`log_time`,`str_time`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)BOOL CDataBase_MySQL::DataBase_MySQL_InsertHttpdown(LPCTSTR lpszSQLQuery,NETCORE_XML_ROOT *pSt_XMLRoot,NETCORE_XML_RULE *pSt_XMLRule,NETCORE_XML_HTTPDOWN *pSt_XMLHttpDown,DEVICEASSOCIATE_ADDR *pSt_SourceAddr,DEVICEASSOCIATE_ADDR *pSt_DestAddr,int nPid,DWORD dwAppId,LPCTSTR lpszStringTimer)
{
    DataBase_IsErrorOccur = FALSE;    pthread_mutex_lock(&st_csDatabase);
    MYSQL_STMT *pSt_MySQLStmt = NULL;
    MYSQL_BIND st_MySQLBinds[29];    DWORD ulCount = 0;
    DWORD ulLen = 0;
    printf("%s\n",lpszSQLQuery);    memset(&st_MySQLBinds,'\0',sizeof(st_MySQLBinds));    if (NULL == (pSt_MySQLStmt = mysql_stmt_init(&st_MySQL)))
    {
        DataBase_IsErrorOccur = TRUE;
        DataBase_dwErrorCode = ERROR_HELPCOMPONENTS_DATABASE_MYSQL_EXEC_NODATA;
        printf("数据库执行错误1:%s\n",mysql_error(&st_MySQL));
        return FALSE;
    }
    if (0 != mysql_stmt_prepare(pSt_MySQLStmt,lpszSQLQuery,_tcslen(lpszSQLQuery)))
    {
        printf("数据库执行错误2:%s\n",mysql_stmt_error(pSt_MySQLStmt));
        return FALSE;
    }
    ulCount = mysql_stmt_param_count(pSt_MySQLStmt);
    if (29 != ulCount)
    {
        printf("数据库执行错误5:%ld,%s\n",ulCount,mysql_error(&st_MySQL));
        return FALSE;
    }    st_MySQLBinds[0].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[0].buffer = pSt_XMLRoot->tszDeviceId;
    st_MySQLBinds[0].buffer_length = sizeof(pSt_XMLRoot->tszDeviceId);
    st_MySQLBinds[0].is_null = 0;
    ulLen = _tcslen(pSt_XMLRoot->tszDeviceId);
    st_MySQLBinds[0].length = &ulLen;    st_MySQLBinds[1].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[1].buffer = pSt_XMLRoot->tszSourceAddr;
    st_MySQLBinds[1].buffer_length = sizeof(pSt_XMLRoot->tszSourceAddr);
    st_MySQLBinds[1].is_null = 0;
    ulLen = _tcslen(pSt_XMLRoot->tszSourceAddr);
    st_MySQLBinds[1].length = &ulLen;    st_MySQLBinds[2].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[2].buffer = pSt_XMLRoot->tszDestAddr;
    st_MySQLBinds[2].buffer_length = sizeof(pSt_XMLRoot->tszDestAddr);
    st_MySQLBinds[2].is_null = 0;
    ulLen = _tcslen(pSt_XMLRoot->tszDestAddr);
    st_MySQLBinds[2].length = &ulLen;    st_MySQLBinds[3].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[3].buffer = pSt_XMLRoot->tszSourceAddr;
    st_MySQLBinds[3].buffer_length = sizeof(pSt_XMLRoot->tszSourceAddr);
    st_MySQLBinds[3].is_null = 0;
    ulLen = _tcslen(pSt_XMLRoot->tszSourceAddr);
    st_MySQLBinds[3].length = &ulLen;    st_MySQLBinds[4].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[4].buffer = pSt_XMLRoot->tszDestAddr;
    st_MySQLBinds[4].buffer_length = sizeof(pSt_XMLRoot->tszDestAddr);
    st_MySQLBinds[4].is_null = 0;
    ulLen = _tcslen(pSt_XMLRoot->tszDestAddr);
    st_MySQLBinds[4].length = &ulLen;    st_MySQLBinds[5].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[5].buffer = pSt_SourceAddr->tszDeviceName;
    st_MySQLBinds[5].buffer_length = sizeof(pSt_SourceAddr->tszDeviceName);
    st_MySQLBinds[5].is_null = 0;
    ulLen = _tcslen(pSt_SourceAddr->tszDeviceName);
    st_MySQLBinds[5].length = &ulLen;    st_MySQLBinds[6].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[6].buffer = pSt_DestAddr->tszDeviceName;
    st_MySQLBinds[6].buffer_length = sizeof(pSt_DestAddr->tszDeviceName);
    st_MySQLBinds[6].is_null = 0;
    ulLen = _tcslen(pSt_DestAddr->tszDeviceName);
    st_MySQLBinds[6].length = &ulLen;    st_MySQLBinds[7].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[7].buffer = (char *)&nPid;
    st_MySQLBinds[7].is_null = 0;
    st_MySQLBinds[7].length = 0;    st_MySQLBinds[8].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[8].buffer = (char *)&dwAppId;
    st_MySQLBinds[8].is_null = 0;
    st_MySQLBinds[8].length = 0;    st_MySQLBinds[9].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[9].buffer = pSt_XMLRoot->tszIPVersion;
    st_MySQLBinds[9].buffer_length = sizeof(pSt_XMLRoot->tszIPVersion);
    st_MySQLBinds[9].is_null = 0;
    ulLen = _tcslen(pSt_XMLRoot->tszIPVersion);
    st_MySQLBinds[9].length = &ulLen;    st_MySQLBinds[10].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[10].buffer = pSt_XMLRoot->tszIPTunnel;
    st_MySQLBinds[10].buffer_length = sizeof(pSt_XMLRoot->tszIPTunnel);
    st_MySQLBinds[10].is_null = 0;
    ulLen = _tcslen(pSt_XMLRoot->tszIPTunnel);
    st_MySQLBinds[10].length = &ulLen;    st_MySQLBinds[11].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[11].buffer = (char *)&pSt_XMLRoot->nSourcePort;
    st_MySQLBinds[11].is_null = 0;
    st_MySQLBinds[11].length = 0;    st_MySQLBinds[12].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[12].buffer = (char *)&pSt_XMLRoot->nDestPort;
    st_MySQLBinds[12].is_null = 0;
    st_MySQLBinds[12].length = 0;    st_MySQLBinds[13].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[13].buffer = (char *)&pSt_XMLRoot->nProType;
    st_MySQLBinds[13].is_null = 0;
    st_MySQLBinds[13].length = 0;    st_MySQLBinds[14].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[14].buffer = (char *)&pSt_XMLRoot->nProTypeSub;
    st_MySQLBinds[14].is_null = 0;
    st_MySQLBinds[14].length = 0;    st_MySQLBinds[15].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[15].buffer = (char *)&pSt_XMLRoot->nOperatorType;
    st_MySQLBinds[15].is_null = 0;
    st_MySQLBinds[15].length = 0;    st_MySQLBinds[16].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[16].buffer = (char *)&pSt_XMLRoot->nLogType;
    st_MySQLBinds[16].is_null = 0;
    st_MySQLBinds[16].length = 0;    st_MySQLBinds[17].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[17].buffer = (char *)&pSt_XMLRoot->nLogLeave;
    st_MySQLBinds[17].is_null = 0;
    st_MySQLBinds[17].length = 0;    st_MySQLBinds[18].buffer_type = MYSQL_TYPE_LONG;
    st_MySQLBinds[18].buffer = (char *)&pSt_XMLRoot->bOPStatus;
    st_MySQLBinds[18].is_null = 0;
    st_MySQLBinds[18].length = 0;    st_MySQLBinds[19].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[19].buffer = pSt_XMLRule->tszRuleId;
    st_MySQLBinds[19].buffer_length = sizeof(pSt_XMLRule->tszRuleId);
    st_MySQLBinds[19].is_null = 0;
    ulLen = _tcslen(pSt_XMLRule->tszRuleId);
    st_MySQLBinds[19].length = &ulLen;    st_MySQLBinds[20].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[20].buffer = pSt_XMLRule->tszGroupId;
    st_MySQLBinds[20].buffer_length = sizeof(pSt_XMLRule->tszGroupId);
    st_MySQLBinds[20].is_null = 0;
    ulLen = _tcslen(pSt_XMLRule->tszGroupId);
    st_MySQLBinds[20].length = &ulLen;    st_MySQLBinds[21].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[21].buffer = pSt_XMLRule->tszRuleKeyWord;
    st_MySQLBinds[21].buffer_length = sizeof(pSt_XMLRule->tszRuleKeyWord);
    st_MySQLBinds[21].is_null = 0;
    ulLen = _tcslen(pSt_XMLRule->tszRuleKeyWord);
    st_MySQLBinds[21].length = &ulLen;    st_MySQLBinds[22].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[22].buffer = pSt_XMLHttpDown->tszDomain;
    st_MySQLBinds[22].buffer_length = sizeof(pSt_XMLHttpDown->tszDomain);
    st_MySQLBinds[22].is_null = 0;
    ulLen = _tcslen(pSt_XMLHttpDown->tszDomain);
    st_MySQLBinds[22].length = &ulLen;    st_MySQLBinds[23].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[23].buffer = pSt_XMLHttpDown->tszUrl;
    st_MySQLBinds[23].buffer_length = sizeof(pSt_XMLHttpDown->tszUrl);
    st_MySQLBinds[23].is_null = 0;
    ulLen = _tcslen(pSt_XMLHttpDown->tszUrl);
    st_MySQLBinds[23].length = &ulLen;    st_MySQLBinds[24].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[24].buffer = pSt_XMLHttpDown->tszSummary;
    st_MySQLBinds[24].buffer_length = sizeof(pSt_XMLHttpDown->tszSummary);
    st_MySQLBinds[24].is_null = 0;
    ulLen = _tcslen(pSt_XMLHttpDown->tszSummary);
    st_MySQLBinds[24].length = &ulLen;    st_MySQLBinds[25].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[25].buffer = pSt_XMLHttpDown->tszContext;
    st_MySQLBinds[25].buffer_length = sizeof(pSt_XMLHttpDown->tszContext);
    st_MySQLBinds[25].is_null = 0;
    ulLen = _tcslen(pSt_XMLHttpDown->tszContext);
    st_MySQLBinds[25].length = &ulLen;    st_MySQLBinds[26].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[26].buffer = pSt_XMLHttpDown->tszFileName;
    st_MySQLBinds[26].buffer_length = sizeof(pSt_XMLHttpDown->tszFileName);
    st_MySQLBinds[26].is_null = 0;
    ulLen = _tcslen(pSt_XMLHttpDown->tszFileName);
    st_MySQLBinds[26].length = &ulLen;    st_MySQLBinds[27].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[27].buffer = pSt_XMLRoot->tszTimer;
    st_MySQLBinds[27].buffer_length = sizeof(pSt_XMLRoot->tszTimer);
    st_MySQLBinds[27].is_null = 0;
    ulLen = _tcslen(pSt_XMLRoot->tszTimer);
    st_MySQLBinds[27].length = &ulLen;    st_MySQLBinds[28].buffer_type = MYSQL_TYPE_STRING;
    st_MySQLBinds[28].buffer = (char *)lpszStringTimer;
    st_MySQLBinds[28].buffer_length = sizeof(lpszStringTimer);
    st_MySQLBinds[28].is_null = 0;
    ulLen = _tcslen(lpszStringTimer);
    st_MySQLBinds[28].length = &ulLen;    if (0 != mysql_stmt_bind_param(pSt_MySQLStmt,st_MySQLBinds))
    {
        printf("数据库执行错误3:%s\n",mysql_stmt_error(pSt_MySQLStmt));
        return FALSE;
    }
    if (0 != mysql_stmt_execute(pSt_MySQLStmt))
    {
        printf("数据库执行错误4:%s\n",mysql_stmt_error(pSt_MySQLStmt));
        return FALSE;
    }    mysql_stmt_close(pSt_MySQLStmt);
    pthread_mutex_unlock(&st_csDatabase);
    return TRUE;
}