2017년 11월 20일 월요일

MYSQL 변경후 크래시 헤결

MySQL 버전 : 5.7.19
사용언어 : C++
환경 : OLEDB를 통하여 디비 접근
문제 : MSSQL -> MYSQL로 변경환후 for문을 통해서 백만건 정도를 돌리면 크래시가 발생함

예시)
    #include <ppl.h>

    size_t proc_count = 1000000;
    proc_count++;
    Concurrency::parallel_for(size_t(0), proc_count, [&](size_t i) {
        i;

        std::wstring Conn(L"Provider=MSDASQL.1; Extended Properties=\"Driver={MySQL ODBC 5.3 Unicode Driver};\"; Server=127.0.0.1; Port=1401; Database=Member; User Id=root; Password=1234");
        CDataSource kDataSource;
        CSession kSession;
        CCommand<CDynamicAccessor> rs;

        HRESULT hr = kDataSource.OpenFromInitializationString(Conn.c_str());
        if (SUCCEEDED(hr))
        {
            hr = kSession.Open(kDataSource);
            if (SUCCEEDED(hr))
            {
                hr = rs.Open(kSession, L"select heroidx from tbl_hero limit 1");
                if (SUCCEEDED(hr))
                {
                    rs.MoveNext();
                    rs.Close();
                    kSession.Close();
                    kDataSource.Close();
                }
                else
                {
                    kSession.Close();
                    kDataSource.Close();
                }
            }
            else
            {
                kDataSource.Close();
            }
        }
    }


atldbcli.h에서 메모리 해제될때 발생했음
우선 Connector/C++로 코드를 작성하니 문제가 없음
그래서 https://dev.mysql.com/downloads/connector/ 있는 최신 파일로 모두 설치해 보았지만 문제가 해결되지 않았음
그러다 다른 컴에 설치했을때 문제가 발생하는 경우도 있고 아닌 경우도 발견함
그래서 ms dll쪽 이슈가 있는게 아닐까 판단해서 아래에서 파일을 다운 받아 설치하니 문제가 해결됨
https://www.microsoft.com/en-us/download/details.aspx?id=53339

Microsoft® ODBC Driver 13.1 for SQL Server


그러나 정확히 해당 문제가 원인이지는 판단을 하기에 근거가 부족한 상태임
이렇게 해결까지 대략 3일정도 소요됨

참고사이트
1. Using Access database from Visual C++
2. OLE DB 프로그래밍