CI 묻고 답하기

제목 DB Connection 예외처리
글쓴이 Densetsu 작성시각 2013/05/28 11:56:39
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 25908   RSS
오늘만 두번째 질문이네요 ㅎㅎ
모르는게 많아 여기 자료를 올려 주시는 분들 지식을 쏙쏙 빼먹는 재미로 살고 있.. ㄷㄷ
각설하고..

현재 제가 사용하는 CI는 실서버에서 이용하는 mysql 과
외부에서 데이터 통신할 때 사용하는 mssql 2가지를 동시에 사용하고 있습니다.

그래서 상단에
$this->db2 = $this->load->database('db2', TRUE); // mssql
이렇게 선언해서 사용하는데요.

외부에서 사용하는 mssql 서버에 통신이 잘 안되거나 하면 오류를 뱉으면서 멈춰버리는 현상이 있는데요.
(error 메시지 뿌리고 정지)
그래서 구현하고 싶은것은 mssql 서버에 통신시도 해보고 반응 없으면
그냥 무시하고 다음을 진행하는 부분을 추가하고 싶습니다.

정확하게 볼줄은 몰라서.. 대충 보니.. 코어쪽 수정해야 되는거 같은데요;
제가 막 손대는 것 보다 혹시 관련해서 해결책을 알고 계신분이 계실꺼 같아서 문의 드립니다.
아시는 분 답변 부탁 드리겠습니다.
참고로 버전은 2.1.0 입니다.
읽어 주셔서 감사합니다. (--)(__)
 다음글 경로 설정 질문이요 (12)
 이전글 session 관련(오라클 이용) (4)

댓글

변종원(웅파) / 2013/05/28 17:53:53 / 추천 0
제 기억에 database는 대체나 확장이 안됩니다.
코어에서 connect 부분을 보시면 에러일 경우 show_error()함수를 사용합니다.
이 부분을 try ..  catch 로 대체를 하셔야할 것 같습니다.

참고 http://stackoverflow.com/questions/3418254/database-error-handling-problem-in-codeingniter




// No connection resource?  Throw an error
  if ( ! $this->conn_id)
  {
   log_message('error', 'Unable to connect to the database');

   if ($this->db_debug)
   {
    $this->display_error('db_unable_to_connect');
   }
   return FALSE;
  }


변종원(웅파) / 2013/05/28 18:05:57 / 추천 0
Densetsu / 2013/05/31 16:03:18 / 추천 0
웅파 //

답글이 늦었습니다.
항상 관심 가져주셔서 감사 드립니다 (__)
아는게 워낙 없는지라.. 쿨럭; 게다가 코어는 건드리기 무섭;

힌트를 주셔서 허접하게나마 처리 했습니다.
다른 코어들은 워낙에 예외처리를 잘해놔서.. catch 해도 에러만 제대로 뱉어내내요 ㅎㅎ
그래서 제가 처리한 내용은 다음과 같습니다.

1.
  $db['mssql']['autoinit'] = TRUE -> FALSE 변경

2. 
  상단에
  var $_db2 = true;
  선언하고

  try {
   $this->db2 = $this->load->database('mssql', TRUE); 
   $connected = $this->db2->db_connect();
   if(!$connected) $this->_db2 = false;
  } catch (Exception $e) {
   
  }

3.
function SELECT_QUERY()
{
  if($this->_db2)
  {
        ..............................
  }
}

  db_connect(); 로 활용했어요.

물론 저렇게 하니까 매번 실행할 때 $this->_db2 요놈이 true 인지 체크하는 걸 넣어야 되는게 문제지만..
당장은 사용할 수 있겠습니다. 쿨럭;
저렇게 하니 무시하고 넘어가긴 하네요;

허접한 실력이지만 혹시 비슷한 상황이 있거나 하신 분들이 계실꺼 같아 공유합니다 ㅠㅠ

웅파님, 다시 한번 감사의 말씀을 드립니다 (--) (__)

--------------------------------------------------------------------------------------------

2013.06.04 내용 추가

위의 내용으로 테스트 진행 했었는데 체크만 하고 정상적으로 DB를 불러오지 못하네요.
결국은 Core 쪽 건드려야 했지만.. 로직을 건드리는 것이 아닌 함수를 추가해서 해결했습니다.

1번은 내용 같습니다.

2.
/system/database/DB_driver.php 파일에서
 function db_connection_check()
 {
  if (is_resource($this->conn_id) OR is_object($this->conn_id))
  {
   return TRUE;
  }
  
  $this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect();
  
  if(!$this->conn_id) return FALSE;
  
  if ($this->database != '')
  {
   if ( ! $this->db_select())
   {
    return FALSE;
   }else{  
    if ( ! $this->db_set_charset($this->char_set, $this->dbcollat))
    {
     return FALSE;
    }
    return TRUE;    
   } 
  } 
  return TRUE; 
 }

암떼나 추가합니다.

3.
  상단에
  var $_db2 = true;
  선언하고

  try {
   $this->db2 = $this->load->database('mssql', TRUE);
   $connected = $this->db2->db_connection_check();
   if($connected) $this->db2->initialize();
   else $this->_db2 = false;
  } catch (Exception $e) {
   
  }  

이렇게 수정합니다.

4번은 위의 3번 내용과 같습니다.

허접해서 원.. 쿨럭;
쩜오 팁입니다 ㅎㅎ
변종원(웅파) / 2013/05/31 16:05:35 / 추천 0
팁 게시판에 올리셔도 될거 같네요. ^^
Densetsu / 2013/05/31 16:18:05 / 추천 0

웅파 //

댓글 뭐 잘못됐나 수정하다가.. 금새 댓글 달아주셨네요 ㅎㅎ
팁이라뇨; 당치 않습니다..
허접하다고 욕만 잔뜩이죠.. ㅎㅎ

변종원(웅파) / 2013/05/31 16:24:30 / 추천 0
Densetsu/ 작성자가 꼭 고수이어야 하는게 아니라 어느 누군가에게 도움이 되면 팁이고 강좌입니다. ^^