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?Connection
,?Statement
?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下