티스토리 뷰

반응형

DB 에러코드인데 JUNIT 테스트 중에 발견했다. 

eclipse에서 나오는 에러 메시지는 Cause: java.sql.BatchUpdateException: Prepared statement needs to be re-prepared 로 나온다. 



참고 사이트 https://forums.mysql.com/read.php?98,643054,643287#msg-643287



서칭하면서 발견한 이에 대한 해결방법은 table_definition_cache 값을 늘려주는 것이다. 

처음에는 mariadb 설정 파일을 찾아보면서 table_definition_cache를 찾아보았는데 

설정파일에서 설정하는 것이 아니라 mariadb (또는 mysql) 에서 설정해주면 된다

고 처음에 썼지만 (이런 무식한... ㅠㅠ) 설정파일에서도 설정이 가능하다. 

다만 설정파일에 설정한 경우에는 서버나 mysql을 재시작하여도 그대로 적용되지만

mariadb에서 설정한 경우에는 재시작했을 때 설정파일에 설정된 값으로 초기화된다고 한다.



서버 시스템 변수 참고 사이트 https://mariadb.com/kb/en/library/server-system-variables/



위 링크된 사이트에서 table_definition_cache 부분만 찾아보자면,

table_definition_cache

  • 설명 : 캐시 할 수있는 테이블 정의 수. 테이블 정의는 .frm 파일에서 가져오고, 많은 수의 테이블이 있으면 캐시 크기가 커져 테이블 열기 속도가 빨라질 수 있습니다. table_open_cache 와 달리 table_definition_cache는 파일 설명자를 사용하지 않으므로 훨씬 작습니다.
  • 명령 행 : --table-definition-cache=#
  • 범위 : 글로벌
  • 동적 : 예
  • 데이터 형식: numeric
  • 기본값: 400
  • 범위 : 400 ~까지524288


현재 값 확인 쿼리문 : SHOW VARIABLES LIKE 'table_definition_cache%';

값 설정 쿼리문 :  SET GLOBAL table_definition_cache = 변경하려는 값;

값은 위의 범위 사이의 값으로 정하여 넣으면 된다. 


값을 정할 때에도 참고하는 변수들이 있다고 한다. 

그에 대해서는 아래 사이트의 글을 참고하기 바란다.


https://dba.stackexchange.com/questions/183566/what-should-i-set-my-table-definition-cache-to



*추가(20190109)

위 에러가 mysql에서 발생하는 버그이기 때문에 mariadb를 사용할 경우에는 

mysql driver 대신 mariadb driver를 사용하면 해결할 수 있다. 

그러나 mariadb driver 1.4버전에서는 에러가 그대로 나타나고 2.3버전에서는 해결되는 것을 확인했다.

mariadb driver로 바꿀 경우에는 꼭 버전을 확인하기 바란다. 



*관련문서 : https://dev.mysql.com/doc/refman/5.5/en/statement-repreparation.html

(해석 - 의역한 것이니 잘못된 부분이 있으면 댓글로 지적해 주세요.)


13.5.4 Automatic Prepared Statement Repreparation

 

'준비된 명령문(prepared statements)'에 의해 참조되는 테이블 또는 뷰의 메타데이터 변경이 감지되면 다음에 그 명령문이 실행될 때 자동으로 명령문에 대해 재준비가 실행된다. 

재준비는 다음의 '준비된 명령문'에 대해 적용된다.

① ('준비된 명령문'을 사용하는) SQL 레벨에서 실행되는 경우 

② (mysql stmt prepare() C API Function을 사용하는) 2진 클라이언트/서버 프로토콜을 사용하면서 실행되는 경우


서버는 3회까지 재준비를 시도한다. 만약 모든 시도가 실패할 경우 에러가 발생한다.


메타데이터 변경은 create, drop, alter, rename,  또는 truncate tables,  또는 analyze, optimize, 또는 repair tables 같은 DDL 명령문 때문에 일어난다. 재준비 또한 참조된 테이블 또는 뷰들이 table definition cache에서 지워진(flushed) 후에 발생한다. 암묵적으로 캐시에서 새 항목을 위한 공간을 마련하기 위해서든, 명시적으로 FLUSH TABLES 명령을 실행했든. 


(SELECT, INSERT, UPDATE 같은) 테이블 내용 변화는 재준비를 유발하지 않는다. 


재준비는 자동적으로 실행되며, 재준비가 발생한 결과로 '준비된 명령문' 성능은 저하된다. 

재준비는 원래 준비에 적용된 기본 데이터베이스(the default database)와 SQL 모드를 사용한다.

Com_stmt_reprepare 상태 변수는 재준비들의 숫자를 추적한다.



반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함