728x90
반응형
<select id="selectFilename" parameterClass="Map" resultClass="String">
SELECT
$column$
FROM
TABLE_NAME
WHERE
seq = #seq#
</select>
위와 같이 작성된 쿼리를 처음 호출 했을 경우엔 정상적으로 작동한다.
예를 들어 column에 'name1'이란 값을 넣었다고 하면
select name1 from TABLE_NAME WHERE seq = 111
이란 쿼리가 실행된다.
문제는 두번째 호출했을 경우 발생한다.
두번째 호출에서 column에 'name2'란 값을 넣게되면
로그엔 정상적으로
select name2 from TABLE_NAME WHERE seq = 111
이렇게 실행되지만, 실제론 에러가 발생하면서
'com.microsoft.sqlserver.jdbc.SQLServerException: 열 이름 name1이(가) 잘못되었습니다.'
라는 에러내용이 뜬다.
이런 경우가 발생하는 이유는
<select> 일 경우 반환되는 칼럼의 값이 동일하다고 가정하기 때문이다.
즉 동일한 id의 <select> 에서 발생하는 칼럼의 결과를 ResultSetMetaData에 저장하게 된다.
위의 경우라면 첫번째 호출된 결과로 metadata엔 'name1'이란 칼럼명이 저장되어 있게 된다는 것이다.
그런데 두번째 호출이 왔을 땐 호출의 결과가 'name2'이고 iBatis는 이 컬럼명을 metadata에서 검색하게 되는데,
저장되어 있는 컬럼이 name1이기 때문에 제대로 mapping 시키지 못하고 에러를 발생시키는 것이다.
이럴 경우엔 remapResults="true" 란 속성을 추가하게 되면
metadata에서 결과를 비교하는 게 아니라 새로운 쿼리를 작성하게 된다.
그래서 위의 에러는 해결할 수가 있다.
하지만 매번 새로운 쿼리를 작성하게 됨으로, 메모리에 부하가 걸리는 문제가 발생하게 된다.
위와 같이 작성된 쿼리를 처음 호출 했을 경우엔 정상적으로 작동한다.
예를 들어 column에 'name1'이란 값을 넣었다고 하면
select name1 from TABLE_NAME WHERE seq = 111
이란 쿼리가 실행된다.
문제는 두번째 호출했을 경우 발생한다.
두번째 호출에서 column에 'name2'란 값을 넣게되면
로그엔 정상적으로
select name2 from TABLE_NAME WHERE seq = 111
이렇게 실행되지만, 실제론 에러가 발생하면서
'com.microsoft.sqlserver.jdbc.SQLServerException: 열 이름 name1이(가) 잘못되었습니다.'
라는 에러내용이 뜬다.
이런 경우가 발생하는 이유는
<select> 일 경우 반환되는 칼럼의 값이 동일하다고 가정하기 때문이다.
즉 동일한 id의 <select> 에서 발생하는 칼럼의 결과를 ResultSetMetaData에 저장하게 된다.
위의 경우라면 첫번째 호출된 결과로 metadata엔 'name1'이란 칼럼명이 저장되어 있게 된다는 것이다.
그런데 두번째 호출이 왔을 땐 호출의 결과가 'name2'이고 iBatis는 이 컬럼명을 metadata에서 검색하게 되는데,
저장되어 있는 컬럼이 name1이기 때문에 제대로 mapping 시키지 못하고 에러를 발생시키는 것이다.
이럴 경우엔 remapResults="true" 란 속성을 추가하게 되면
metadata에서 결과를 비교하는 게 아니라 새로운 쿼리를 작성하게 된다.
그래서 위의 에러는 해결할 수가 있다.
하지만 매번 새로운 쿼리를 작성하게 됨으로, 메모리에 부하가 걸리는 문제가 발생하게 된다.
728x90