為什麼使用NativeJdbcExtractor

鬆門一枝花發表於2016-06-30
原文:http://blog.csdn.net/hehexiaoyou/article/details/21019171
---------------------------------------------------------------------------

有時候必要會對資料庫clob、 blob資料型進行操作,再加上spring 環境不得不要啟用NativeJdbcExtractor 來幫助完成相關工作。

spring 官方文件中註明:

Sometimes you need to access vendor specific JDBC methods that differ from the standard JDBC API. This can be problematic if you are running in an application server or with a DataSource that wraps the ConnectionStatement and ResultSet objects with its own wrapper objects. To gain access to the native objects you can configure yourJdbcTemplate or OracleLobHandler with a NativeJdbcExtractor.

翻譯:

有時候,你需要訪問特定於供應商的JDBC方法不同於標準JDBC API。這可能會出現問題,如果你正在執行一個應用程式伺服器或一個DataSource包裝的連線,Statement和ResultSet物件與自己的包裝物件。要獲得本地物件,你可以配置你JdbcTemplate或OracleLobHandler的一個NativeJdbcExtractor。

The NativeJdbcExtractor comes in a variety of flavors to match your execution environment:

  • SimpleNativeJdbcExtractor

  • C3P0NativeJdbcExtractor

  • CommonsDbcpNativeJdbcExtractor

  • JBossNativeJdbcExtractor

  • WebLogicNativeJdbcExtractor

  • WebSphereNativeJdbcExtractor

  • XAPoolNativeJdbcExtractor

Usually the SimpleNativeJdbcExtractor is sufficient for unwrapping a Connection object in most environments. See the Javadocs for more details.


spring 配置檔案如下:

<!-- nativeJdbcExtractor 和 oracleLobHandler Bean 都設定為 lazy-init="true",這是因為 -->

<!-- nativeJdbcExtractor 需要通過執行期的反射機制獲取底層的 JDBC 物件, -->

<!-- 所以需要避免在 Spring 容器啟動時就例項化這兩個Bean。 -->

<bean id="nativeJdbcExtractor"class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor"  lazy-init="true" />

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

<property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"></property>

</bean>

<!-- 我的實現類,因為我用的是C3P0 連線池方式,配置的nativejdbcextractor是C3P0 。 -->

<bean id="simpleWriterBlob" class="com.ww.jdbc.writer.blob.SimpleWriterBlob">

<property name="dataSource" ref="dataSource"></property>

<property name="lobHandler" ref="oracleLobHandler"></property>

</bean>


------------另一篇轉載----------------------------------

近來對一個專案進行維護

發現其之前用的是WebSphere,我準備將其更改到Tomcat上

於是悲劇開始上演。各種配置,各種報錯。


createBeanException

原來是使用的WebSphereNativeJdbcExtractor現改為其它連線方式,則需要更改。

詳細參考:

在spring裡 插入 BLOB欄位
kp.setContent(content.getBytes()); 
方法 :hibernate saveOrUpdate


Caused by: java.lang.ClassNotFoundException: oracle.sql.BLOB。
       使用tomcat 沒問題。
       可伺服器改為 WebSphere .就報錯。

把Spring內建提供的NativeJdbcExtractor轉換器 改了一下,結果:問題解決。
———————————————————————————————————————————————————————
總結如下:
      1、對於我們的工程:
           在釋出環境中,要將nativeJdbcExtractor  換成             org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor
留意log4j日誌,此時的blob欄位的java型別為oracle.sql.Blob
      2、Spring內建提供的NativeJdbcExtractor轉換器有:
          C3P0NativeJdbcExtractor
          CommonsDbcpNativeJdbcExtractor
          JBossNativeJdbcExtractor
          NativeJdbcExtractor
          NativeJdbcExtractorAdapter
          SimpleNativeJdbcExtractor
          WebLogicNativeJdbcExtractor
          WebSphereNativeJdbcExtractor
          XAPoolNativeJdbcExtractor
          要根據不同伺服器及時修改,以免浪費大量時間。
          位於org\springframework\jdbc\support\nativejdbc下



相關文章