CI 묻고 답하기

제목 다중 DB 쿼리 캐싱
글쓴이 배강민 작성시각 2010/04/02 10:31:10
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 27596   RSS
배강민
안녕하십니까?

최근  CI 매력에 빠져서 이래저래 테스트해보고 있습니다.

mysql과 oracle 두군데 다중 연결 및 쿼리 캐싱을 테스트하고 있습니다.

일단 mysql은 디폴트로 autoload.php에 걸어서 기본 연결로 하고

oracle은 database.php 에 정보만 추가하고 필요시 연결해서 쓰는데까지 성공했습니다.

한페이지에서 두 DB에서 셀렉트한 결과를 때리는데...

쿼리 캐싱을 on하고서 생성된 파일을 보니.. 디폴트로 한 mysql의 쿼리만 캐싱이 생겼습니다.

흠.. 디폴트로 하는것만 생기는 것인가요?

아시는 분 계시면 답변 부탁드립니다.

즐거운 금요일되세요~
 다음글 foreach 질문입니다~! (4)
 이전글 모델의 멤버 변수 사용 효용성 문의 (4)

댓글

변종원(웅파) / 2010/04/02 11:13:25 / 추천 0

ci포럼에서 검색을 해봐도 답이 없고 소스를 봐도 문제가 될만한 것을 발견하지 못했습니다.

database.php 설정을 올려봐주시고 캐시 디렉토리가 각각 따로 설정됐는지 퍼미션은 충분한지 체크바랍니다.

그리고 mysql과 oracle을 바꿔서(오라클을 default로) 테스트해보면 답이 나올 것 같네요.

배강민 / 2010/04/02 12:00:50 / 추천 0
$active_group = "default";
$active_record = TRUE;

$db['default']['hostname'] = "호스트";
$db['default']['username'] = "아이디";
$db['default']['password'] = "비빈";
$db['default']['database'] = "db네임";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = PATH_STATIC."/system/cacheDB";
$db['default']['char_set'] = "euckr";
$db['default']['dbcollat'] = "utf8_general_ci";

//필요에 따라 연결해서 사용...
$db['oracleKwrf']['hostname'] = "호스트";
$db['oracleKwrf']['username'] = "아이디";
$db['oracleKwrf']['password'] = "비빈";
$db['oracleKwrf']['database'] = "db네임"; //의미는 없음
$db['oracleKwrf']['dbdriver'] = "oci8";
$db['oracleKwrf']['dbprefix'] = "";
$db['oracleKwrf']['pconnect'] = TRUE;
$db['oracleKwrf']['db_debug'] = TRUE;
$db['oracleKwrf']['cache_on'] = FALSE;
$db['oracleKwrf']['cachedir'] = PATH_STATIC."/system/cacheDB";
$db['oracleKwrf']['char_set'] = "euckr";
$db['oracleKwrf']['dbcollat'] = "utf8_general_ci";
위는 database.php이고요...

아래는 controller

<?php

class Test extends Controller {

	function Test()
	{
		parent::Controller();

		$this->oracleKwrf = $this->load->database('oracleKwrf', TRUE);

		//html 캐쉬 생성
		//$this->output->cache(5); //5분단위...
					
		//모델 호출 (기본)
		$this->load->model('test_model');
				
	}
	
	function index()
	{
		
		//쿼리 캐쉬 on
		$this->db->cache_on();
					
		//회원리스트 호출 (mysql)
		$data['members'] = $this->test_model->members_list();

		//직급리스트 호출 (mysql)
		$data['memberClass'] = $this->test_model->memberClass_list();
		
		//wide_code (oracle)
		$data['wideCode'] = $this->test_model->wideCode_list();
		
		//쿼리 캐쉬 off
		$this->db->cache_off();
					
		//뷰
		$this->layout->view('test_view', $data);
		
		//쿼리 캐쉬 제거
		//$this->db->cache_delete('test', 'index');
		//$this->db->cache_delete_all(); 
	}
}

/* End of file test.php */
/* Location: ./system/application/controllers/test.php */
아래는 모델

<?php

	class Test_model extends Model {
	
	    function Test_model()
	    {
	        parent::Model();
	    }
		
		//회원리스트 (mysql)
		function members_list()
		{			
			$this->db->trans_start();
			$qry = 'SELECT m_id, m_name FROM member';
			$rst = $this->db->query($qry);
			$this->db->trans_complete();		
						
			$data = $rst->result_array();
			
			return $data;
		}

		//직급 리스트 (mysql)
		function memberClass_list()
		{			
			$this->db->trans_start();
			$qry = 'SELECT mc_index, mc_name FROM member_class';
			$rst = $this->db->query($qry);
			$this->db->trans_complete();		
						
			$data = $rst->result_array();
			
			return $data;
		}
				
		//wide_code (oracle)
		function wideCode_list()
		{			
			$this->db->trans_start();
			$qry = "SELECT * FROM wide_info";
			$rst = $this->oracleKwrf->query($qry);
			$this->db->trans_complete();		
						
			$data = $rst->result_array();
			
			return $data;
		}		
	}

/* End of file test_model.php */
/* Location: ./system/application/models/test_model.php */
아래는 view
<?php foreach ($members as $row): ?>
<?=$row['m_id']?><?=iconv("EUC-KR", "UTF-8", $row['m_name'])?><br />
<?php endforeach; ?>

<?php foreach ($memberClass as $row): ?>
<?=$row['mc_index']?><?=iconv("EUC-KR", "UTF-8", $row['mc_name'])?><br />
<?php endforeach; ?>

<?php foreach ($wideCode as $row): ?>
<?=$row['WIDE_CODE']?><?=iconv("EUC-KR", "UTF-8", $row['WIDE_NAME'])?><br />
<?php endforeach; ?>
입니다.. 캐쉬폴더를 다르게 해야하나해서 테스트해보니 아니되구용...

저 cacheDB 폴더에 디폴트인 mysql의 쿼리캐싱은 잘 쌓이고 있습니다..

시간되시면 한번 살펴봐주시기 바랍니다.

감사합니다.
배강민 / 2010/04/02 13:30:04 / 추천 0
참고로 웹표출은 정상적으로 나옵니다.. 에러도 없이..
변종원(웅파) / 2010/04/02 13:33:33 / 추천 0
매뉴얼에 있네요. 저도 얼핏 보고 넘어갔던 터라..

http://codeigniter-kr.org/user_guide/database/caching.html 어떤 함수들은 캐시시스템에서 작동하지않음 참조

또한, 두개의 데이터베이스 리소스(result_id ,conn_id) 는 사용할수 없습니다. 왜냐하면, 그 리소스들은 런타임 작동(run-time operation)의 부산물이기 때문입니다.

결론은 현 상태로는 안된다입니다.
배강민 / 2010/04/02 13:36:07 / 추천 0
흠.. 그말이 그말이었나보군요... 메뉴얼에서 보긴했는데... 이해가 잘 안됬었는데...흠...

그렇다면 역시 주 접속을 디폴트로 가고 다중은 캐싱은 포기해햐겠군요... CI를 뜯어고쳐보지 않는이상...흠...

감사합니당...