CI 묻고 답하기

제목 db연결이 사용도중 자꾸 끊였다가 연결되었다 반복하는 이유가 무엇일까요?
카테고리 CI 2, 3
글쓴이 정수리 작성시각 2018/12/10 17:49:06
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 13163   RSS

포럼에서 여러 많은 분들께서 도움을 주셔서

 

다행히 오라클db에 연동에 성공하였습니다.

 

db에서 데이터를 읽어오는 작업을 하면

 

한번씩 

 

Unable to connect to your database server using the provided settings.

 

연결관련 에러가 뜨더라구요;;

 

저게 계속 뜨는게 아니구요 한번씩 발생합니다;

 

class Test_model extends CI_Model{

	public $continfo;

	function __construct()
	{
		parent::__construct();
		$this->continfo = $this->load->database($this->continfoSet(), TRUE);
	}
        
        function getSub($params='')
	{
		
		$sql = 'SELECT LOW_SUB_CTRT_FLD_NM as subType, CTRT_YMD as subDate, LOW_SUB_CTRT_CTRT_AMT as subMoney, LOW_SUB_CTRT_RATE as subPercent, ENTP_NM as subCompany, REPREVE_NM AS subCEO FROM V_TCM_SUBCTRT_LINK where CTRT_ACCT_BOOK_MNG_NO = ?';

		$query = $this->continfo->query($sql, $params);

		$this->continfo->close();

		return $query->result_array();
	}

         function continfoSet()
	{
		
		$config['hostname'] = CONTINFO_IP;
		$config['username'] = '아이디';
		$config['password'] = '패스워드';
		$config['database'] = 'db명';
		$config['dbdriver'] = 'oci8';
		$config['dbprefix'] = '';
		$config['pconnect'] = TRUE;
		$config['db_debug'] = TRUE;
		$config['cache_on'] = FALSE;
		$config['cachedir'] = '';
		$config['char_set'] = 'utf8';
		$config['dbcollat'] = 'utf8_general_ci';
		$config['swap_pre'] = '';
		$config['autoinit'] = TRUE;
		$config['stricton'] = FALSE;
		$config['port'] = CONTINFO_PORT;
		
		return $config;		
	}


}

연결후에 셀렉트해온후 강제로 db연결을 끊는 과정인데

 

왜 저런 에러가 중간에 발생하는것일까요??

 

어디부터 살펴봐야 힌트를 얻을수있을까요??;;

 다음글 ci3 파일세션 질문 드립니다. (1)
 이전글 HTTP2 를 ubuntu에 적용했습니다 (1)

댓글

변종원(웅파) / 2018/12/10 18:02:50 / 추천 0
close는 왜 하시는지 궁금하네요?
kaido / 2018/12/10 18:38:48 / 추천 0

예상되는 패턴은

connect pool 로 호출 하고나서 중간에 colse 해놓고는 다시 connect pool obj 로 접속 call 을 불렀을것 같네요.

close 한게 문제 될것 같으며, oracle 은 접속 유지를 해야만 하는 db 입니다.

 

var_dump($this);

해당 명령어로 CI에서 담고 있는 모든 obj 를 확인 가능합니다.

SQL 호출 부분과 close 부분 으로 나눠서 DB 관련 obj 체크해보시면 무언가 다른것을 보실것 입니다.

 

pconnect 로 호출 하면 DB obj 형태로 떠놓고는 query 실행 할때마다 새로 접속 하지 않고 기존 obj로 접속 합니다.

레퍼런스로 호출해도 그렇습니다.

중간에 이유없이 강제로 close 하셨다면 다시 connect  하는 부분이 필요할 것입니다.

정수리 / 2018/12/11 08:59:16 / 추천 0

@변종원

이전에 다른 프로그램을 만들 때 프로그램이 늦어 지는 부분이 있어

서버팀에서 확인해보니 db에서 리소스가 남아있어서 느려진다고하여

close를 해주니 속도가 느려지는 현상이 사라져 close를 사용하게 되었습니다.

오라클의 경우 주 db가 아니며  특정에 대해 한번씩 조회하기에 사용이후 close 강제로 연결을 끊었습니다.

정수리 / 2018/12/11 09:19:03 / 추천 0

@kaido

답변감사합니다.

말씀하신대로 

호출 이후에 

var_dump($this)

close()

var_dump($this)비교해보니

//호출 이후
[pconnect] => 1
    [conn_id] => Resource id #44
    [result_id] => 1
    [db_debug] => 1
    [benchmark] => 0.023853063583374
    [query_count] => 1
    [bind_marker] => ?
    [save_queries] => 1
    [queries] => Array
        (
            [0] => select A.CTRT_ACCT_BOOK_MNG_NO as col005, A.CTRT_NM as col006, B.SUPERV_USER_NM as col020, B.SUPERV_DEPT_CD, C.DEPT_NM as col002 from V_TCM_SUMMARYLIST A JOIN V_TCM_CTRTSUPERV_LINK B ON A.CTRT_ACCT_BOOK_MNG_NO = B.CTRT_ACCT_BOOK_MNG_NO JOIN V_TCM_DEPT_LINK C ON B.SUPERV_DEPT_CD = C.DEPT_CD  where A.CTRT_NM like '%tt%'
        )

//close이후
[pconnect] => 1
    [conn_id] => 
    [result_id] => 1
    [db_debug] => 1
    [benchmark] => 0.023853063583374
    [query_count] => 1
    [bind_marker] => ?
    [save_queries] => 1
    [queries] => Array
        (
            [0] => select A.CTRT_ACCT_BOOK_MNG_NO as col005, A.CTRT_NM as col006, B.SUPERV_USER_NM as col020, B.SUPERV_DEPT_CD, C.DEPT_NM as col002 from V_TCM_SUMMARYLIST A JOIN V_TCM_CTRTSUPERV_LINK B ON A.CTRT_ACCT_BOOK_MNG_NO = B.CTRT_ACCT_BOOK_MNG_NO JOIN V_TCM_DEPT_LINK C ON B.SUPERV_DEPT_CD = C.DEPT_CD  where A.CTRT_NM like '%tt%'
        )

conn_id 부분에서 다르더라구요.

두개 모두 쿼리문에 있는데

close이후의 경우 conn_id부분에 아무것도 없다보니

연결이 안되었다는 에러가 출력되는 것일까요?

close부분을 주석처리 한 후 테스트를 해보아도 원인은 똑같이 발생합니다.

kaido / 2018/12/11 09:24:31 / 추천 0

네 그렇습니다

실행한 쿼리에 대해서 재차 다시 실행을 하기 위해서 이전에 실행한 쿼리 오브젝트는 남겨두고 close 때 커넥션을 날려버립니다. 

[정확히는 DATA OBJ 전체 입니다.]

CI 내에서 캐시 쿼리 처리 하기 위해 남겨두는것 입니다. [DB의 캐싱 하고는 다른것 입니다.]

가령

$sql = $this->db->query( select * from TEST );

$sql2 = $this->db->query( select * from TEST );

2번 DB에 접속 해서 데이터를 가져올까요?

아닙니다. [queries] 1번 쿼리와 동일한게 있다고 판단하면 1번 쿼리를 그대로 다시 사용합니다.

정수리 / 2018/12/11 10:10:21 / 추천 0

@kaido

답변감사합니다.

아직 제가 부족한 부분이 많아서 그런지

올려주신 답변에 대해 정확히 이해 하기가 어렵네요 ㅜㅜ

현재 서버를 재시작 후 테스트 해보니 에러 메세지는 출력되지 않네요...