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下