2012-03-13 21 views
1

ファイルからデータを読み込んでデータベースに書き込むためにスプリングバッチを使用しています。 正常に動作しますが、ジョブの情報(パラメータ、ステータス...)を "dataSourceBatch"データベースに保存します。ジョブの情報(パラメータ、ステータス...)をデータベースに保存する方法は?

私のバッチファイル:私の検索で

<?xml version="1.0" encoding="UTF-8"?> 
<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:p="http://www.springframework.org/schema/p" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 

xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/batch 
    http://www.springframework.org/schema/batch/spring-batch-2.0.xsd 
    http://www.springframework.org/schema/task 
    http://www.springframework.org/schema/task/spring-task-3.0.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/batch 
    http://www.springframework.org/schema/batch/spring-batch-2.0.xsd 
    "> 

<bean id="dataSourceBatch" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" 
     value="jdbc:mysql://localhost:3306/batchdb?characterEncoding=UTF-8" /> 
    <property name="username" value="user" /> 
    <property name="password" value="pass" /> 
</bean> 


<bean id="myWriter" class="org.jobs.MyWriter" /> 
<bean id="myReader" class="org.jobs.myReader" /> 

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
    p:ignoreUnresolvablePlaceholders="true" /> 

<bean 
    id="transactionManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
    p:dataSource-ref="dataSourceBatch" /> 
<!-- 
<bean id="transactionManager" 
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/> 
--> 

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

<bean 
    class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor" 
    p:jobRegistry-ref="jobRegistry" /> 

<!-- 
<batch:job-repository id="jobRepository" data-source="dataSourceBatch" 
    transaction-manager="transactionManager" isolation-level-for-create="SERIALIZABLE" 
    table-prefix="BATCH_" /> 
--> 
<bean 
    id="jobRepository" 
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" 
    p:transactionManager-ref="transactionManager" /> 

<bean 
    id="jobRegistry" 
    class="org.springframework.batch.core.configuration.support.MapJobRegistry" /> 



<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
    p:ignoreUnresolvablePlaceholders="true" /> 


<batch:job id="insertToDBJob" job-repository="jobRepository"> 
    <batch:step id="insertToDBStep"> 
     <batch:tasklet 
     transaction-manager="transactionManager"> 
      <batch:chunk 
      reader="myReader" 
      writer="myWriter" 
      commit-interval="2" /> 
     </batch:tasklet> 
     <batch:end on="COMPLETED" /> 
    </batch:step> 
</batch:job> 

私が見つかりました:

<batch:job-repository id="jobRepository" data-source="dataSourceBatch" 
    transaction-manager="transactionManager" isolation-level-for-create="SERIALIZABLE" 
    table-prefix="BATCH_" /> 

しかし、この "jobRepository" 私はこの例外を取得する使用して:

org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT into BATCH_JOB_INSTANCE(JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) values (?, ?, ?, ?)]; Duplicate entry '0' for key 'PRIMARY'; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY' 
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:241) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:602) 
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:811) 
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:867) 
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:871) 
at org.springframework.batch.core.repository.dao.JdbcJobInstanceDao.createJobInstance(JdbcJobInstanceDao.java:117) 
at org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:127) 

私はジョーを演出していますこのコードでB:事前に

ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("batch.xml"); 
classPathXmlApplicationContext.start(); 
// launch the job 
JobLauncher jobLauncher = (JobLauncher)classPathXmlApplicationContext.getBean("jobLauncher"); 
Job job = (Job)classPathXmlApplicationContext.getBean(jobName); 
JobParametersBuilder jobParametersBuilder = new JobParametersBuilder().addDate("date", new Date()); 
id++; 
jobParametersBuilder.addLong("id", id); 
jobLauncher.run(job, jobParametersBuilder.toJobParameters()); 

感謝:)

+0

あなたのIDの有効範囲は? JOB_INSTANCE_IDが主キーであると仮定すると、それは0回のように見えますが、あなたはdupeキーを取得しています。代わりにID列を使用できますか? –

+0

試してみましたが、別の例外があります –

+0

"batch_job_instance"テーブルの "JOB_INSTANCE_ID"カラムをIDカラムに変更しようとしましたが、今はこの例外が発生します:org.springframework.dao.DataIntegrityViolationException:PreparedStatementCallback; SQL [INSERT into BATCH_JOB_PARAMS(JOB_INSTANCE_ID、KEY_NAME、TYPE_CD、STRING_VAL、DATE_VAL、LONG_VAL、DOUBLE_VAL)の値(?、?、?、?、?、?、?)];子行を追加または更新できません:外部キー制約が失敗しました( 'batchdb'.batch_job_params'、CONSTRAINT'JOB_INSTANCE_PARAMS_FK')外部キー(' JOB_INSTANCE_ID')参照 'batch_job_instance'(' JOB_INSTANCE_ID'));ネストされた例外はco –

答えて

関連する問題