안녕하세요.
예를들어, TimerQueueCallBack함수가 10초마다 한번씩 불리도록 setting되어 있고,
이 함수 안에서 다음과 같은 일을 하는데... 함수 안의 시간이 10초이상이 걸릴 경우..
databuf[i]값들이 어떻게 되나요? 깨지는 건지요?
public static CircularFIFO<byte[]> cirQueue = new CircularFIFO<byte[]>(1000);
private void TimerQueueCallBack(object obj)
{
byte[][] databuf = new byte[100][];
if (cirQueue.Count > 0)
{
size = cirQueue.Count;
for (int i = 0; i < size; i++ )
{
lock (cirQueue)
{
databuf[i] = cirQueue.Remove();
}
}
for (int i = 0; i < size; i++)
{
WriteToDatabase(databuf[i], strConn_1);
//Thread.Sleep(100);
WriteToDatabase(databuf[i], strConn_2);
}
}
예를들어 Queue에는 10개가 들어와서 lock을 걸어서 10개를 모두 deque해서 databuf[i]에 넣었는데,
for문을 돌면서 2개의 DB(로컬,원격)에 쓸때 (DB가 연결되어있지 않을경우, table 여러개를 insert or update등으로)
처음에는 빠르다가 1.5초 나중에는 15초 혹은 그 이상도 간혹 나오는 경우 DB에 다 쓰지도 못한 상황에서
10초마다 불리는 Timer callback함수인 TimerQueueCallBack()가 불리는 경우
이전 실행지점에서 정상적으로 DB에 쓰일까요? 아니면 데이터가 깨지나요?
(WriteToDatabase()함수 안에서도 여러가지 데이터들이 변수등으로 실행중...)
이럴땐 어떻게 해야하는지? 조언 부탁드립니다.
함수 전체를 lock을 걸고 하는 것은 말이 되는지요?
DB Connection timeout을 1초로는 줄수 있는데, 0.1초등으로 주려니까 프로그램 다운이 되더라구요..
strConn_1 = "...Pwd:1111"+" Connection Timeout=1";
혹시 연결되어있지 않은 DB를 conn.Open할때 걸리는 평균시간과 최대한 빨리 catch()처리하려면 어떻게 해야하는지요?
참고로, DB는 Mysql을 쓰고 있습니다.
[최초 등록일: ]
[최종 수정일: 11/11/2015]