답변해주셔서 감사합니다.
제가..소스를 제대로 파악을 못했던거같아요
소스내용을 보니 SELECT문 위주로 ADOConnection과
스레드를 계속 돌리면서 들어오는 쿼리를 리스트형식으로 저장해서
주로 UPDATE, INSERT 시키는 ADOConnection
두개가 있더라구요
근데 연결이 끊어졌을경우
하나는 ADOConnection delete안시키고 close open 만시키고
다른 하나는 ADOConnection 를 아예 delete시키더라구요
전 ADOConnection 이거 두개가 아니라 공통으로 하나만 쓰는줄알고
뒤죽박죽으로 코딩해놔서...당연히 안되었었구..
다시 소스 전부다 수정하고 하니까 잘되네요.ㅠㅠ
고맙습니다..
땅주인 님이 쓰신 글 :
: 재접속 했을 때 Select 자체가 안된다는 것인가요?
:
: 위에 답변한 것은, 이미 끊어진 상태에서 insert/update한 자료에 대해서
: SELECT할 수 없다는 것인데..Select 자체가 안된다는 의미는 아니었거든요.
:
: 그런데, 끊어지고 재접속했는데.. Select 자체가 안된다는 의미인 거지요?
:
: 이상하네요.. 함 해봐야겠네요..
: .....
: 테스트를 해보았는데.. 잘 되는데요..
: 아래는 제가 테스트한 코드입니다. 재접속하고 Select 잘 되는데... 이상하네요..
:
:
: //---------------------------------------------------------------------------
: // open
: void __fastcall TForm2::Button4Click(TObject *Sender)
: {
: ADOConnection1->Connected = true;
: }
: //---------------------------------------------------------------------------
: // reopen => 재접속하는 루틴으로 간주..
: void __fastcall TForm2::Button5Click(TObject *Sender)
: {
: if ( ADOConnection1->Connected ) {
: ADOConnection1->Connected = false;
: Sleep(1000); // Sleep for while
: }
: ADOConnection1->Connected = true;
: }
: //---------------------------------------------------------------------------
: // query
: void __fastcall TForm2::Button6Click(TObject *Sender)
: {
: UnicodeString sName;
: UnicodeString sSQL = " SELECT * FROM USER ";
:
: ADOQuery1->Active = false;
: ADOQuery1->SQL->Clear();
: ADOQuery1->SQL->Text = sSQL;
: ADOQuery1->Active = true;
:
: while ( !ADOQuery1->Eof ) {
: sName = ADOQuery1->FieldByName("UserName")->AsString;
: ShowMessage(sName);
: ADOQuery1->Next();
: }
: }
: //---------------------------------------------------------------------------
: // Afterconnect event
: void __fastcall TForm2::ADOConnection1AfterConnect(TObject *Sender)
: {
: m_bConnected = true;
: ShowMessage("Connected");
: }
: //---------------------------------------------------------------------------
: // Afterdisconnect event
: void __fastcall TForm2::ADOConnection1AfterDisconnect(TObject *Sender)
: {
: m_bConnected = false;
: ShowMessage("Disconnected");
: }
: //---------------------------------------------------------------------------
:
:
: 알론소 님이 쓰신 글 :
: : 우선 답변감사드립니다.
: : 제가 정리를 안해서 썼나보군요.ㅠㅠ
: : 아무튼 답변하신 내용을 읽어봤는데요.
: :
: : 디비와 연결이 끊어졌는데 다시연결하면
: : 당연히 select가 안된다고 하셨는데
: : 왜 안되는지 궁금해요..
: : 다시 연결되었으니까 디비에서 읽어올수도있고
: : 넣을수도있지않나요??
: :
: : ADO Component에서 끊어졌는지 안끊어졌는지
: : 알려주지않으니 나름대로 타이머만들어서
: : 일정주기가 되면 select문을 통해 의미없는
: : 쿼리를 날리는걸 해놨구요
: : exception이 떨어진다면
: : 끊어졌거나뭐 에러라고 생각하여
: : close 시키고 다시 open시킵니다
: :
: : 근데 open을 해서 재연결해도 select가 되질않으니
: : db접속정보를 다시 넣어야하나 해서
: : 다시넣어서 open해서 재연결했더니
: : 역시나 select도안되지 insert도안되고 다안되니까
: : 전 이부분이 왜 안되는지 궁금합니다
: :
: : 위에도 썼지만 다시 open 시켜 재연결해서
: : select가 당연히 안되는거라면
: : 왜안되는지도 궁금하구요..ㅠㅠ
: : 안되는거라면 재연결해서 다시 디비를 읽는
: : 방법없을까요.ㅠㅠ
: :
: :
: :
: :
: :
: :
: : 땅주인 님이 쓰신 글 :
: : : 알론소 님이 쓰신 글 :
: : : : ADOConnection을 생성시키고
: : : : DB접속정보를 입력한뒤에
: : : : Open()함수를 이용해서 오픈시키거든요
: : : :
: : : : 근데 만약에 DB와 연결이 끊어졌는데
: : : : select라던지 update가 안되고
: : : : 오라클 연결접속 에러라던지 이런 에러가뜨면
: : : :
: : : : 이제 ADOConnection은 CLOSE가 되고
: : : : 연결 안되었으니
: : : : conneted는 false가 될것이고
: : : :
: : : : 계속 DB와의 재접속을 시도하는데
: : : : OPEN()가 되면 이제 연결이 된거잖아요
: : : :
: : : : 그럼 이제 SELECT라던디 INSERT UPDATE같이
: : : : 이런 것들을 수행이 되야하는데 연결이되었으니
: : : : 연결만 되었을뿐이지
: : : : 수행이 되지않으면 무슨문제인가요???
: : : :
: : : : 연결이 끊어지지않는다면 문제는 안생깁니다.
: : : : 근데 연결이 끊어지고 다시 재접속 되는경우에
: : : : 연결은 되었는데 select가 안되는거에요 물론 db에 데이터도
: : : : 들어가지도않구요
: : : :
: : : : 그래서 다시 연결되어서 open()을 할때
: : : : 그전에 디비접속정보를 다시 또넣었습니다.
: : : : 그런대도 안되던데 왜그런지모르겠습니다
: : : :
: : : : 도움좀주세요.ㅠㅠ
: : :
: : : 정리를 좀 해서 쓰시지.. 읽어봐도 아리까리 해서..
: : : 암튼..
: : : 디비가 끊어진 상태에서 insert를 하고(당연히 Exception이 나겠지요..)
: : : 다시 디비를 연결해서 select를 하면 데이터는 당연히 없겠지요.
: : :
: : : MySQL에서 그런 경우를 보았는데.. 세션 유지 시간을 짧게 잡아놔서..
: : : 일정 시간이 지나면 DB Connection이 끊어지는 경우를 보았는데요..
: : : ADO Component에서 이벤트로 알려주지도 않구요..
: : : 그래서,
: : : 일정 시간 주기로 해서 DB에 의미 없는 쿼리를 계속 날리는 것으로 해결을 했는데요.(30초 Term)
: : : 만약, 이런 쿼리에 응답이 없거나 Exception이 계속 날 겨우 DB가 끊어진 것으로 간주하고
: : : 재접속하는 루틴등을 만들어 주어야 합니다. DB 접속 상태가 불안한 경우에 한하지요.
: : :
: : : 그런데, DB Connection이 불안한 것이 아마 네트워크 상태가 불안하던 지,
: : : 서버가 상태가 좋지 않던가 그런 경우가 더 많을 것 같네요.
: : : DB Connection 유지에 많은 공을 드리는 것을 잘 보지를 못해서..
: : : 암튼, DB가 자꾸 끊어진다면 네트워크나, 서버의 상태를 점검하는게 먼저이지 않을까 하네요.
: : : 그럼 이만..