제목 | [예제] 다중디비 사용하기 | ||
---|---|---|---|
글쓴이 | ci세상 | 작성시각 | 2009/11/07 01:17:12 |
|
|||
메뉴얼중에서 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님 말씀대로 하나도 건드리지않고 처리되면 더 좋긴 하겠죠. ^^; |
자세한 설명 너무 감사합니다.
^^;