둘러보기 생략.
 

Hibernate 이용 Oracle 9i Clob 데이터 저장 방법 문의

운영서버
'Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production'
'PL/SQL Release 9.2.0.8.0 - Production'
'CORE 9.2.0.8.0 Production'
'TNS for HPUX: Version 9.2.0.8.0 - Production'
'NLSRTL Version 9.2.0.8.0 - Production'

개발서버
'Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product'
'PL/SQL Release 10.2.0.1.0 - Production'
'CORE 10.2.0.1.0 Production'
'TNS for 32-bit Windows: Version 10.2.0.1.0 - Production'
'NLSRTL Version 10.2.0.1.0 - Production'

개발서버에서 Clob 데이터 저장이 아무런 변환 과정 없이 잘됩니다. (Oracle 10g)
운영서버 Oracle9i에 Clob 데이터 저장시 2000자가 넘어가면 글자가 깨져서 일부만 저장이 됩니다.

매핑파일에서 DOCCONTENTS NCLOB 타입인데 string type으로 이용했습니다.(Oracle 10g에서 다 잘됨)

해결방법 및 원인이 무엇일까요?

3일째 자료 찾아보다 문의 드립니다.

Anyframe3.1.0을 사용하고 있습니다.

1. 우선 운영 서버의

1. 우선 운영 서버의 hibernate.propertis 설정을 확인하시기 바랍니다.

2. jdbc driver를 ojdbc14.jar(10g)를 사용하고 있는지 확인하시기 바랍니다.
ojdbc-14.jar(9i)파일은 버그가 있는 것으로 보입니다.
(9i와 10g의 jdbc driver는 좀 차이가 있는데 이걸 확인해보시면 도움이
될 것 같습니다.)

hibernate.propertis입니다.

bean id=sessionFactory
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean
lazy-init=true

property name=dataSource ref=dataSource
prop key="hibernate.dialect=org.hibernate.dialect.Oracle9iDialect
prop key="hibernate.format_sql=false
prop key="hibernate.show_sql=false
prop key="hibernate.use_sql_comments=false
prop key="hibernate.jdbc.batch_size=0
prop key="hibernate.jdbc.use_streams_for_binary=true
prop key="SetBigStringTryClob=true
prop key="hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
prop key="hibernate.cache.use_second_level_cache=false
props
property
property name=lobHandler ref=lobHandler
bean

jdbc driver 어느 위치에 있는 것을 확인해야 하나요?

WEB-INF/lib/ 폴더에 있는 파일을 수정하면 되는 건가요?

드라이버 변경하면서 테스트 해 보았습니다. (WEB-INF/Lib/ojdbc-14.jar)

org.springframework.dao.InvalidDataAccessApiUsageException: OracleLobCreator needs to work on [oracle.jdbc.OracleConnection], not on [org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper]: specify a corresponding NativeJdbcExtractor; nested exception is java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.createLob(OracleLobHandler.java:357)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.setClobAsString(OracleLobHandler.java:265)
at org.springframework.orm.hibernate3.support.ClobStringType.nullSafeSetInternal(ClobStringType.java:84)
at org.springframework.orm.hibernate3.support.AbstractLobType.nullSafeSet(AbstractLobType.java:180)
at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:146)
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2002)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2248)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2665)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:60)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:606)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:54)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
at com.damo.board.services.impl.BrdBoardServiceImpl$$EnhancerByCGLIB$$8595877d.addBrdBoard()
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at anyframe.common.aop.aspects.AbstractAspects.recordExecution(AbstractAspects.java:72)
at anyframe.common.aop.aspects.AbstractAspects.recordExecution(AbstractAspects.java:52)
at anyframe.common.aop.aspects.ApiAspect.invoke(ApiAspect.java:47)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy4.addBrdBoard(Unknown Source)
at com.damo.board.web.AddBrdBoardController.process(AddBrdBoardController.java:172)
at anyframe.web.springmvc.common.controller.AnyframeFormController.onSubmit(AnyframeFormController.java:207)
at org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:267)
at anyframe.web.springmvc.common.controller.AnyframeFormController.handleRequestInternal(AnyframeFormController.java:275)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:874)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:808)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:523)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:463)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at net.sf.infrared.aspects.servlet.InfraREDServletFilter.doFilter(InfraREDServletFilter.java:68)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
at oracle.jdbc.driver.OracleConnection.physicalConnectionWithin(OracleConnection.java:5198)
at oracle.sql.CLOB.createTemporary(CLOB.java:1009)
at oracle.sql.CLOB.createTemporary(CLOB.java:956)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.prepareLob(OracleLobHandler.java:393)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.createLob(OracleLobHandler.java:340)

JDBC Driver는 10g이상에서 제공하는

JDBC Driver는 10g이상에서 제공하는 ojdbc14.jar 파일을 사용하고, WEB-INF/lib에 존재해야 합니다.
물론, 상위 클래스 패스에 다른 jdbc driver는 없어야 하고요.

그리고 추가로 아래와 같이 lob hander에 대한 설정을 추가한 후 테스트 하여 보시기 바랍니다.
hbm 또한 spring에서 제공하는 타입으로 변경하여 주시기 바랍니다.

"context.xml"
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

  <property name="hibernateProperties">

   <props>

     <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>

   </props>

  </property>

  <property name="dataSource">

    <ref bean="dataSource" />

  </property>

  <property name="configLocation">

    <value>classpath:hibernate.cfg.xml</value>

  </property>

  <property name="lobHandler">

    <ref bean="oracleLobHandler" />

  </property>
 </bean>

 <!--spring+hibernate Oracle BLOB-->

 <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />

 <bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">

   <property name="nativeJdbcExtractor">

    <ref bean="nativeJdbcExtractor" />

   </property>

 </bean>

"hbm.xml"
<property name="context" column="context"
type="org.springframework.orm.hibernate.support.ClobStringType" length="1048576000"/>

안됩니다. 동일한 오류가 나오는데요.

템플릿 소스 파일을 좀 구할 수 있을까요?
정말 급합니다. 부탁드리겠습니다.

Datasource 와 Transaction 설정도 변경해 주어야 하는지요?

hibernate에서 Oracle9i에 clob insert/update/delete 처리되는 소스좀 구할 수 있을까요?