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下