DB연계시 사용되는 JDBC Receiver Adapter에서 Bind Mode를 사용할때는 일반적으로 생성하던 구조와 다르게 metadata라는 어트리뷰트와 값이 추가가 되어야하는데 이런 설정을 통해 DB연계방식으로 개발된 인터페이스의 성능이 좋아지는 경우도 있었던것 같습니다. 하지만 개발(DATE,DECIMAL같은 컬럼타입의 함수 등)이나 모니터링 상 제약이 있는 부분도 있어 연계하는 시스템의 환경에 따라 사용여부가 결정될것 같고 이런부분들에 대해 간단하게 정리하려고 합니다.
Statement, PreparedStatement 차이
기본적으로 PO에서 JDBC Adapter를 생성하여 XML SQL형석으로 실행시 JDBC에서의 Statement로 쿼리를 실행된다고 이해를 합니다. 즉 10개의 쿼리를 각 각 수행한다고 보시면 되는데요. 이 과정에서 하드파싱으로 인하여 연계한 시스템의 DBA한테 바인딩? 처리해달라고 요청을 가끔 받기도 합니다. 그럼 바인딩 처리와 관련된 PreparedStatement와는 어떤차이가 있을지 찾아보면 제일 큰 차이가 캐시사용여부라고 합니다. 예를 들어 동일한 쿼리를 반복적으로 수행하기보다 캐시에 담긴 쿼리를 재사용하면서 안에 변경되는 값만 바인딩 처리하여 DB에 적은부하와 성능을 좋게 할수 도 있다고 하며 실제로도 이런 바인딩처리를 통해 성능이 좋아졌던 인터페이스도 보았습니다.바인드모드 사용방법
Data Type은 바인드 모드에 맞게 생성하고 JDBC Receiver 채널의 Advanced탭에 Additional Parameters에 Batch Mode를 체크하고 sqlBindMode를 추가 합니다. 개발이나 설정은 간단하지만 쿼리 디버깅할때 logSQLStatement를 추가하고 실행하면 AuditLog에 나오는 쿼리들은 확인이 가능하나 값들은 ?로 확인이 되는데 이런경우 바인드모드를 해제하고 실행주면 됩니다.제약사항
DB마다 다를것 같은데 변수는 대소문자를 구분한다고 하며 UPDATE,DELETE,SELECT를 사용해야하며 UPDATE문을 실행하는경우 성능을 향상시킬수 있다고 합니다. 하지만 UPDATE_INSERT에 사용에는 제약이 있는것 같습니다.이렇게 어댑터안에 batch mode설정하는것 외에 DataType의 alter session set cursor_sharing를 사용하여 바인딩 처리하는 방식도 있는데 이것에 관련된 내용은 아래 글을 참고하시면 좋을것 같습니다.
Why use Oracle cursor_sharing?
더 자세한 내용은
문제해결
1983983 - Using Date functions with SQL Bind Mode
2072891 - How-to use database standard funtions in query to database using Receiver Communication Channel
2189984 - SQLBindMode: A non-numeric character was found, while a numeric character was expected
댓글 없음:
댓글 쓰기