본문 바로가기

WAS/WebLogic

[WebLogic] CLOB 타입 데이터 처리 관련 WebLogic 데이터소스 옵션 조치사항

#. WebLogic 운영 환경

RHEL8

JDK1.8_202

WebLogic12.2.1.4

 


 

#. 에러 상황

WebLogic 데이터소스를 통해 DB서버 리소스에 접근하여 CLOB 타입의 데이터 처리 시

아래와 같은 에러가 발생하였다.

java.sql.SQLException: Connection has already been closed.
  at weblogic.jdbc.wrapper.PoolConnection.checkConnection(PoolConnection.java:99)
  at weblogic.jdbc.wrapper.DataType.preInvocationHandler(DataType.java:25)
  at weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB.length(Unknown Source)
  at org.hibernate.lob.SerializableClob.length(SerializableClob.java:33)

 


 

#. 조치 사항

Connection has already been closed 에러는

코드 수정을 통한 조치가 가능한 듯 하지만, WebLogic 옵션 설정 변경으로도 조치 가능하다.

 

WebLogic 데이터소스 옵션 중

Wrap Data Types / 래핑 데이터 유형 

해당 옵션을 비활성화 시킨다.

(데이터소스 상세 메뉴 -> Configuration 탭 하위의 Connection Pool 탭으로 이동 -> 하단의 Advanced/고급 메뉴 클릭)

 


 

#. 에러 발생 원인

CLOB 타입의 데이터 처리 시에는

WebLogic의 JDBC wrapper 클래스가 CLOB 데이터를 객체로 포장한다.

(oracle.sql.CLOB -> weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB)

 

일반적으로 하나의 데이터 처리 트랜잭션이 완료되면

weblogic에서 connection pool을 회수하게 되는데,

 

CLOB 데이터 처리 시

데이터 포장 절차와 그 후의 데이터 처리 과정이

하나의 일관된 트랜잭션이 아닌, 별개의 트랜잭션으로 weblogic이 처리하여 문제가 발생한다.

 

CLOB 데이터가 마저 처리되기 전에

weblogic이 connection pool을 회수해버려서

나머지 작업을 수행하려 할 시 이미 connection pool이 사라졌다는 에러가 발생하는 것.

(Connection has already been closed)

 

Wrap Data Types 옵션을 비활성화 하면

CLOB 타입을 weblogic wrapper 클래스가 포장하지 않도록 한다.

결과적으로 하나의 트랜잭션으로 CLOB 데이터가 처리되어 문제가 해결된다.

 


 

#. ETC

Connection has already been closed 에러 외에 다른 유형의 에러도 있었다.

java.lang.ClassCastException : java.lang.String cannot be cast to java.sql.clob

 

해당 에러는 java.lang.String 타입이 java.sql.clob 타입으로 변환되지 못하는 상황이다.

해당 에러는 코드 수정으로 해결이 필요한 경우이다.