這只是簡記~ 之後有空再更新當我們需要使用 CLOB 或 BLOB 的操作時 (Oralce 資料庫),在 9i 的 jdbc driver 下,我們需要使用 Spring 的 LobHandler 與 NativeJdbcExtractor 這兩種介面互相搭配。因此在 Spring 的配置檔中,我們會寫上 
 
<bean class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true" id="nativeJdbcExtractor" />

<bean class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true" id="oracleLobHandler">
   <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor" />
 </bean>

然後再將 LobHandler 丟入 DAO 中。

<bean id="testLobDAO" class="test.e104.paoservice.testing.data.dao.TestLobDAO" lazy-init="true">
  <property name="queryDataSource" ref="dataSource_s"/>
  <property name="audDataSource" ref="dataSource_i"/>
  <property name="lobHandler" ref="oracleLobHandler"/>
 </bean>

但在執行時,雖然我們明明看起來有引用 JDBC Driver,但仍是發生以下的 exception
 
org.springframework.dao.DataAccessResourceFailureException: Could not create Oracle LOB; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Couldn't initialize OracleLobHandler because Oracle driver classes are not available. Note that OracleLobHandler requires Oracle JDBC driver 9i or higher!; nested exception is java.lang.NullPointerException
 
追查問題是發生在取得 Oracle Connection 類別後,依此類別取出的 ClassLoader 是 null 的情形,論壇上這篇文章的最後一個發表文 http://forum.springsource.org/showthread.php?p=170300 指出要將 JDBC Driver 移到 context/WEB-INF/lib 下即可正常,但小弟尚未試過。
 
不過若是使用 eclipse 來 run application 時,jdbc driver 放置的地方就真的有差。
若是將 jdbc driver 放置在 Run Configurations... -> Classpath -> Bootstrap Entries 中時,在 run 的時候就會發生上述的 exception,但是若是將 jdbc driver 放置在
Run Configurations... -> Classpath -> User Entries 中時,就能正常執行。


另外,如果使用 10g 的 jdbc driver (資料庫是 9i 無妨),則如這篇文章所述  http://jdev.tw/blog/573/oracle-10g-clob,在字串長度未超過 32765 Bytes 的情況下,可以直接使用 getString 與 setString 來存取 CLOB 欄位,這個小弟測試的結果是 ok 的。另外,如果使用 10g 的 jdbc driver,就算使用 spring 的 LobHandler,也可以使用 DefaultLobHandler,而不需要再引用 NativeJdbcExtractor 介面了。

<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" /> 


 
arrow
arrow
    全站熱搜

    大笨鳥 發表在 痞客邦 留言(0) 人氣()