如何允许访问底层连接?

时间:2017-01-27 07:19:38

标签: java spring tomcat spring-batch

我在baseContext.xml中定义了一个数据源

<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource" lazy-init="default" autowire="default" autowire-candidate="default">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
    <property name="url" value=""></property>
    <property name="username" value=""></property>
    <property name="password" value=""></property>
    <property name="testWhileIdle" value=""></property>
    <property name="testOnBorrow" value="tue"></property>
    <property name="validationQuery" value=""></property>
</bean>

此数据源正在将clob值写入oracle db。虽然这样做会引发此错误

  

org.springframework.dao.InvalidDataAccessApiUsageException:   OracleLobCreator需要在[oracle.jdbc.OracleConnection]上工作,而不是   on [org.apache.commons.dbcp.PoolableConnection]:指定一个   对应的NativeJdbcExtractor;嵌套异常是   java.lang.ClassCastException:   org.apache.commons.dbcp.PoolableConnection无法转换为   oracle.jdbc.OracleConnection

我尝试将此属性&#34; accessToUnderlyingConnectionAllowed&#34; 设置为true,但它表示无法实例化bean,属性不存在。

其他解决方案like this要求使用本机jdbc提取器,但我不知道如何在此bean中指定

我在tomcat上运行Spring Batch,我在配置JobRepository时只指定了这个数据源

<batch:job-repository data-source="datasource" id="jobrepo" transaction-manager="transacMnager" table-prefix="" isolation-level-for-create="READ_COMMITTED"></batch:job-repository>

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以在jobRepository中设置lobHandler 例如:

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
   <property name="dataSource" ref="dataSource" />
   <property name="transactionManager" ref="transacMnager" />
   <property name="isolationLevelForCreate" value="READ_COMMITTED" />
   <property name="lobHandler">
      <bean class="org.springframework.jdbc.support.lob.OracleLobHandler">
         <property name="nativeJdbcExtractor">
            <bean class="yourCorrectJdbcExtractor" />
         </property>
      </bean>
   </property>
</bean>

我希望它有用

安吉洛