사용자 도구

사이트 도구


php:codeigniter:sp_호출관련_이슈

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
php:codeigniter:sp_호출관련_이슈 [2018/01/09 18:51]
endofsky [개선점 및 한계]
— (현재)
줄 1: 줄 1:
-====== 복수의 SP 호출 시 주의사항 ====== 
-  - 기존 CodeIgniter (3.x 기준) 에서 SP 호출 이후 다른 query 호출 시 오류 발생 
-  - 이에 mysqli mockup driver patch 수행 
-  - 한 transaction에서 복수의 SP 호출 시 이전 호출 method에서 close_result();​ 선언해주어야함 
-**Example : ** 
-<code php> 
-$query = $this->​db->​query($spCall);​ 
-$rows = $query->​result_array();​ 
-// 다음 resultset으로 이동하여 release 진행. 혹시 향후 유사 오류 발생시 while 구문을 통해 잔여 resultset을 모두 명시적으로 release 필요. 
-// 필수 실행 조건 : SP호출이면서 동일 transaction내 다음 DB 호출이 예상 될 경우 
-$query->​close_result();​ 
-</​code>​ 
  
-===== 오류 세부 내용 ===== 
-한 transaction에서 복수의 SP call 진행 시 (Error Number: 2014 - Commands out of sync; you can't run this command now) 오류 발생 
-https://​stackoverflow.com/​questions/​7767231/​calling-stored-procedure-in-codeigniter 참조 
- 
-===== Fix 내용 ===== 
-  - /​system/​database/​drivers/​mysqli_fix/​ 에 mysqli wrapper class로 이루어진 driver 생성 
-    * mysqli_fix_result.php 에 close_result() function 추가 
-  - /​application/​config/​database.php 부분 
-    * '​dbdriver'​ => '​mysql'​ 을모두 '​dbdriver'​ => '​mysqli_fix'​ 로 변경 
- 
-===== 개선점 및 한계 ===== 
-  - mockup driver 생성으로 CodeIgniter 마이너 업그레이드 시 영향 없음 (메이저 업그레이드 시에도 db driver 구조 변경이 없으면 사용 상 이슈 없음) 
-  - 독립적인 mysqli 함수 사용으로 CodeIgniter가 제공하는 DBCache 사용 시 오류 발생 
-  - 해결방안 : [[php:​codeigniter:​캐시_사용_관련|캐시 사용 가이드]] 참조 
- 
- 
-====== Multi-resultset 을 반환하는 SP 사용 ====== 
-  - 상기와 같은 에러로 인해 CodeIgniter에서는 공식적으로 SP call을 지원하지 않음 
-  - 이에 multi resultset을 반환하는 경우 CodeIgniter framework의 dbutil 로는 받아 올 수 없어 patch 진행 (대상 : mysqli mockup driver) 
-  - 첫 번째 resultset을 받을 경우 기존과 같이 $query->​result_array();​ 활용 
-  - 이후 resultset은 $query->​next_result();​ 를 선언하여 포인터 이동 가능 
-  - $query->​next_result_array();​ 를 활용하면 다음 resultset으로 포인터 이동과 동시에 결과 값을 array객체로 리턴 받을 수 있음 
- 
-** Example : ** 
-<code php [예제1] 포인터 이동 후 객체 수신.php>​ 
-$query = "call sp_name($param1,​ $param2, ... )"; // query 정의 
-$query = $this->​db->​query($query);​ // query 수행 
- 
-# 첫 번째 resultset 수신 
-$result['​list'​] = $query->​result_array();​ 
- 
-# 두 번째 resultset 수신 
-$query->​next_result();​ // 다음 포인터로 이동 
-$result['​totalCnt'​] = $query->​result_array();​ // 결과 저장 
- 
-</​code>​ 
- 
-<code php [예제2] next_result_array()를 활용하여 바로 다음 결과 수신.php>​ 
-$query = "call sp_name($param1,​ $param2, ... )"; // query 정의 
-$query = $this->​db->​query($query);​ // query 수행 
- 
-# 첫 번째 resultset 수신 
-$result['​list'​] = $query->​result_array();​ 
- 
-# 두 번째 resultset 수신 
-$result['​totalCnt'​] = $query->​next_result_array();​ 
-</​code>​ 
- 
-===== 개선점 및 한계 ===== 
-  - CodeIgniter의 SP사용 제약사항 해소 및 mockup driver활용을 통한 마이너 버전업 대비 가능 
-  - 해당 기능 적용으로 인해 framework에서 제공하는 dbcache 사용이 사실상 불가능해짐. ((//​CodeIgniter의 dbcache방식은 resultset 객체를 cache파일 등에 저장시킨 후에, 이후 호출 시 cache의 resultset을 db_result class의 멤버변수에 저장하는 방식임. 만약 여러 resultset을 리턴하는 SP의 경우 해당 멤버변수를 배열형으로 변경 후, dbcache 모듈 자체를 index에 따라 리턴 해 주도록 업데이트 해야 함. 해당 작업은 framework의 core모듈을 직접 건드리게 되어 향후 framework의 버전 업에 대응 할 수 없게 됨. 대안으로는 꼭 cache를 사용해야 할 경우 dbcache가 아닌 CodeIgniter에서 제공하는 다른 종류의 cache(viewcache나 일반 cache기능) 을 사용하는 방안이 있음// )) 
php/codeigniter/sp_호출관련_이슈.1515491507.txt.gz · 마지막으로 수정됨: 2018/01/09 18:51 저자 endofsky