Spring批量连接到Oracle DataBase

时间:2016-04-12 16:09:38

标签: spring

我正在使用Spring Batch将数据从平面文件写入Oracle DB。但是我收到自动表创建错误。可以任何人请帮忙。

org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback;错误的SQL语法[SELECT JOB_INSTANCE_ID,来自BATCH_JOB_INSTANCE的JOB_NAME = JOB_NAME =?和JOB_KEY =?];嵌套异常是java.sql.SQLException:ORA-00942:表或视图不存在

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch" 
xmlns:task="http://www.springframework.org/schema/task"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/batch
    http://www.springframework.org/schema/batch/spring-batch-2.2.xsd
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

<bean id="report" class="com.mkyong.model.Report" scope="prototype" />

<batch:job id="reportJob">
    <batch:step id="step1">
        <batch:tasklet>
            <batch:chunk reader="cvsFileItemReader" writer="oracleItemWriter"
                commit-interval="2">
            </batch:chunk>
        </batch:tasklet>
    </batch:step>
</batch:job>

<bean id="cvsFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">

    <!-- Read a csv file -->
    <property name="resource" value="classpath:cvs/report.csv" />

    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">

            <!-- split it -->
            <property name="lineTokenizer">
                <bean
                    class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="names" value="date,impressions,clicks,earning" />
                </bean>
            </property>

            <property name="fieldSetMapper">

                <!-- return back to reader, rather than a mapped object. -->
                <!--
                    <bean class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" />
                -->

                <!-- map to an object -->
                <bean
                    class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                    <property name="prototypeBeanName" value="report" />
                </bean>

            </property>

        </bean>
    </property>

</bean>

<bean id="oracleItemWriter"
    class="org.springframework.batch.item.database.JdbcBatchItemWriter">
    <property name="dataSource" ref="dataSource" />
    <property name="sql">
        <value>
        <![CDATA[        
            insert into RAW_REPORT(DATE1,IMPRESSIONS,CLICKS,EARNING) values (:date, :impressions, :clicks, :earning)
        ]]>
        </value>
    </property>
    <!-- It will take care matching between object property and sql name parameter -->
    <property name="itemSqlParameterSourceProvider">
        <bean
            class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />
    </property>
</bean>

DataBase.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/jdbc 
    http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd">

<!-- connect to database -->
<!-- <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/Sakila" />
    <property name="username" value="root" />
    <property name="password" value="" />
</bean> -->

<!-- <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository"/>
</bean>

- &GT;             
    &LT; /豆腐&GT; - &GT;

<!-- <bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
     <property name="dataSource" ref="dataSource" />
     <property name="transactionManager" ref="transactionManager"/>
     <property name="databaseType" value="oracle" />
     <property name="tablePrefix" value="BATCH_"/>
     <property name="isolationLevelForCreate" value="ISOLATION_DEFAULT"/>
</bean>   -->

<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="transactionManager" />
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <property name="username" value="system"/>
    <property name="password" value=""/>
</bean>

 <bean id="transactionManager"
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />  

<!-- create job-meta tables automatically -->
<!-- <jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="org/springframework/batch/core/schema-drop-mysql.sql" />
    <jdbc:script location="org/springframework/batch/core/schema-mysql.sql" />
</jdbc:initialize-database> -->


<jdbc:initialize-database data-source="dataSource"  >
    <jdbc:script location="classpath:/org/springframework/batch/core/schema-oracle10g.sql" />
    <jdbc:script location="classpath:/org/springframework/batch/core/schema-drop-oracle10g.sql" />
     <!-- <jdbc:script location="classpath:oracle10g/initial-query.sql" /> -->

</jdbc:initialize-database>

context.xml中

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

<!-- stored job-meta in database -->
<bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="databaseType" value="oracle" />
</bean>

<!-- stored job-meta in memory -->
<!-- 
<bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
</bean>
-->

<bean id="jobLauncher"
    class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
</bean>

由于 Sh anti Bhushan

1 个答案:

答案 0 :(得分:0)

应该运行脚本的顺序是,首先删除模式/表,然后创建模式/表。

<jdbc:script location="classpath:/org/springframework/batch/core/schema-drop-oracle10g.sql" />

<jdbc:script location="classpath:/org/springframework/batch/core/schema-oracle10g.sql" />

你正在使用相反的序列,这意味着删除表 - 因此,你得到的表或视图不存在。(因为表/模式被删除)