CI 코드

제목 [예제] 다중디비 사용하기
글쓴이 ci세상 작성시각 2009/11/07 01:17:12
댓글 : 5 추천 : 0 스크랩 : 1 조회수 : 28588   RSS
메뉴얼중에서 http://codeigniter-kr.org/user_guide/database/connecting.html 해당 부분에 있는 여러데이터베이스 연결하기 부분을 이용하면 데이터베이스 분산, 트랜잭션등 다양한 디비 응용기술을 이용가능합니다.

<데이터베이스 분산>
1. 동일서버내 디비분산
2. 다른서버별 디비분산

<트랜잭션>
1. 롤백
2. 커밋
=> 부분적 코드상으로 구현가능

########## database.php 설정 #########
$active_group = "";
$active_record = TRUE;

$db['cidb1']['hostname'] = "localhost";
$db['cidb1']['username'] = "root";
$db['cidb1']['password'] = "apmsetup";
$db['cidb1']['database'] = "cidb1";
$db['cidb1']['dbdriver'] = "mysql";
$db['cidb1']['dbprefix'] = "";
$db['cidb1']['pconnect'] = FALSE;
$db['cidb1']['db_debug'] = TRUE;
$db['cidb1']['cache_on'] = FALSE;
$db['cidb1']['cachedir'] = "";
$db['cidb1']['char_set'] = "utf8";
$db['cidb1']['dbcollat'] = "utf8_general_ci";

$db['cidb2']['hostname'] = "localhost";
$db['cidb2']['username'] = "root";
$db['cidb2']['password'] = "apmsetup";
$db['cidb2']['database'] = "cidb2";
$db['cidb2']['dbdriver'] = "mysql";
$db['cidb2']['dbprefix'] = "";
$db['cidb2']['pconnect'] = FALSE;
$db['cidb2']['db_debug'] = TRUE;
$db['cidb2']['cache_on'] = FALSE;
$db['cidb2']['cachedir'] = "";
$db['cidb2']['char_set'] = "utf8";
$db['cidb2']['dbcollat'] = "utf8_general_ci";
★ 주의 : $db['cidb1']['pconnect'] = FALSE; 는 꼭! FALSE이어야 합니다.

만약 TRUE라고 되어 있으면 

  $this->DB1 = $this->load->database('cidb1', TRUE);
  $this->DB2 = $this->load->database('cidb2', TRUE); 

라고 지정을 한다면 DB2만 사용가능하고 DB1은 사용불가하게 됩니다.


########## 컨트롤러 사용 #########
<?php

class Welcome extends Controller {

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

		$this->DB1 = $this->load->database('cidb1', TRUE);
		$this->DB2 = $this->load->database('cidb2', TRUE); 
	}
	
	// 각 서버별 출력
	function index()
	{

		$query1 = $this->DB1->query(" SELECT * FROM member ");

		foreach ($query1->result() as $row)
		{
			echo "cidb1 >> $row->id / $row->name <br>";
		}


		$query2 = $this->DB2->query(" SELECT * FROM member ");

		foreach ($query2->result() as $row)
		{
			echo "cidb2 >> $row->id / $row->name <br>";
		}

	}

	// 동일 서버에 존재할때
	function mode2()
	{
		$query1 = $this->DB1->query(" SELECT * FROM cidb1.member UNION ALL SELECT * FROM cidb2.member");

		foreach ($query1->result() as $row)
		{
			echo "$row->id / $row->name <br>";
		}
	}

	// 다른 서버에 존재할때
	function mode3()
	{
		// 배열로 가공처리
	}
}
※ 위 컨트롤러에서 보듯이 동일서버내에서는 디비간 참조, 합치기등이 쿼리상으로 구현이 가능하지만

다른 서버로 분리가 될 경우에는 ~~ 배열로 재 가공을 하는 방법을 이용해야 한다.



######## 다른서버 구성시 주의사항 ########

동일서버가 아닌 다른서버상에서 디비를 참조할 때 한대의 디비서버가 다운된다면 전체 시스템이 먹통되는 경우가 발생 할 수 있기 때문에 자동백업, failover 기능등을 구현해 두어야 합니다.

첨부파일 htdocs.zip (387.7 KB)
 다음글 위지윅에디터 ckeditor 사용하기(CodeIgnit... (5)
 이전글 HOOK으로 레이아웃 한방에 훅~ (3)

댓글

emc / 2009/11/07 13:01:15 / 추천 0
메뉴얼에 설명이 되어 있었군요.

자세한 설명 너무 감사합니다.

^^;
emc / 2009/11/07 14:05:41 / 추천 0
한가지 더 문의합니다.
다중디비 사용시에는 디버그 화면에서 원래 쿼리가 나오지 않는가요?
ci세상 / 2009/11/07 15:25:53 / 추천 0
xdebug나 phpunit로 이클립스 콘솔상에서는 디버그 움직임이 포착되는데요..

ci 프로파일러 $this->output->enable_profiler(TRUE); 이걸 사용해서 체크해 보실때에는 코어를 수정해야 합니다.
emc / 2009/11/09 18:34:17 / 추천 0
코어수정하지 않고, 되면 너무 좋은데.. ^^;
ci 버그로 올리면 좋겠네요.
변종원(웅파) / 2009/11/09 21:00:09 / 추천 0
코어 수정하지 않고 확장하시면 되긴하지만..
emc님 말씀대로 하나도 건드리지않고 처리되면 더 좋긴 하겠죠. ^^;