mysqlconnector 사용하여 쿼리에 timeout 넣는 방법

안녕하세요, 쿼리 timeout 관련 질문 드립니다.

mysqlconnector ( 버전 : v4.0.30319) 를 사용하여 아래 코드로 데이터가 큰 테이블(약 40gb)에서 select 쿼리 실행 시 timeout 을 10초로 넣어 봤지만, 타임아웃이 적용 되지 않습니다.

 public DataTable ExecuteReaderTimeOut(string strSql)
        {
            try
            {
                if (strSql.Trim() != "")
                {
                    DataTable dt = new DataTable(); 
                    string connStr = ConnectionString;

                    int MySQLProcessID = -1;

                    using (MySqlConnection conn = new MySqlConnection(connStr))
                    {
                        conn.Open();
                        MySQLProcessID = conn.ServerThread;
                        string sql = strSql;
                         
                        using (var cmd = new MySqlCommand(sql, conn))
                        {
                            cmd.CommandTimeout = 10;
                            using (var reader = cmd.ExecuteReader())
                            {
                                dt.Load(reader);
                            }
                        } 
                    }
                    return dt;
                }
                else
                    return null;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

sql 컨넥션에서도 아래 처럼 해봤지만 적용이 안되네요…

String connectionString = "Server=myserver; Port=3306; Database=databasename; Uid=userid; Pwd=password;Connection Timeout=10";

작성한 코드가 문제인 것인지, 아니면 mysqlconnector 가 문제인 것인지, 그것도 아니라면 db 설정? 을 확인해야하는 것인지 모르겠습니다, 알려주시면 감사하겠습니다!!

1 Like

connectionString의 timeout은 connection Timeout에 대한 설정입니다.

우선 CommandTimout이 10초에 되어있는지 확인하기 위해
TryCatch의 SqlException으로 한번 해보시는방향어떨까요?

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(query, connection);
    command.CommandTimeout = 10; // Timeout을 10초로 설정

    try
    {
        connection.Open();
        // ExecuteReader를 사용하여 결과 집합 읽기
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                // 여기에 데이터 처리 코드 작성
            }
        }
    }
    catch (SqlException e)
    {
        // Timeout이나 다른 SQL 오류 처리
        Console.WriteLine(e.Message);
    }
}
1 Like

커맨드 타임아웃도 넣었는데 되지 않는다면…
불러오고 난 뒤에 display하는데에 시간이 소요되면서 생기는 문제일 가능성이 큽니다.

쿼리 결과가 return되기까지 얼마나 걸리는지 확인해보세요.
쿼리 결과가 10초가 안 걸린다면, 화면에 표시하는데에 시간이 많이 걸릴 것 같습니다.

1 Like

sql 예외 처리 넣어서 해보겠습니다! 감사합니다

1 Like

30초 넘게 걸리네요 ㅜㅠㅜ

SqlException, MySqlException 를 안타고 위 이미지처럼 에러가 납니다…

이럴 경우 어디를 확인하면 좋을까여…

문제를 분해해서 풀이를 하여야 합니다. 그렇지 않으면 전문가도 문제를 풀지 못해요. 문제를 잘 분해해서 각개격파 해야 합니다.

  • 설정한 CommandTimeout이 적용되지 않음
    SELECT 1 WHERE SLEEP(15) = 0 쿼리로 CommandTimeout 동작성 확인
    → 결과에 따라 적절한 CommandTimeout 사용법 숙지, MySql Provider 버전 및 특징 파악, 관련된 동작성 파악

  • 데이터가 큰 테이블 질의를 무엇을 위해 어떤 결과를 내야 하는지 문제 이해 및 풀이 분해 —

  • 예외 이해 – 예) System.OutOfMemoryException 예외의 경우, 어떤 이유로 인해 메모리를 모두 소진했다는 의미로 — 관련 예외가 왜 발생하는지 검색 – 일반적인 경우 2Gb 메모리(예시)를 다 사용할 이유가 없으므로 문제 원인을 찾아 해결해야 함

화이팅입니다.

감사합니다!! 알려주신 조언대로 하나씩 각개격파 해보겠습니다!!!

해당 내용의 쿼리로 해보니 Command Timeout 10초로 해둔게 적용이 됩니다!!

그리고 아래와 같은 예외 메세지가 떳습니다.

The Command Timeout expired before the operation completed.

데이터가 큰 테이블 질의를 무엇을 위해 어떤 결과를 내야 하는지 문제 이해 및 풀이 분해

데이터가 큰 테이블에 쿼리를 실행한 이유는 Command Timeout 이 작동되는지 테스트하기 위함 이였는데요, SELECT 1 WHERE SLEEP(15) = 0 <== 이 쿼리로 테스트하면 됩니다!
혹시 몰라서 SELECT 1 WHERE SLEEP(25) = 0 로 늘리고 해봐도 Command Timeout 10초 적용이 되네요

1 Like