小编Kiv*_*anc的帖子

如何从close文件方法抛出IOException时管理事务(包括文件IO)

我最近开始使用Spring的数据源事务管理器.我现在有问题.我的事务包括对DB表的更新和对文件的写入操作.

它工作正常,但我对文件I/O有一些疑问.如下所示,我已经将bean的openFile和closeFile方法分别配置为init-method和destroy-method,这反过来又提供了这些方法,就像一个constuructor和一个析构函数一样.如果文件没有正确关闭,某些记录可能没有成功写入output.txt文件,这意味着我也无法正确处理事务管理.

但是,我想回滚那些尚未附加到平面文件的数据库更新.使用我的解决方案,看起来无法将fileClose方法添加到事务中.有谁知道如何正确实施这个所需的行动?

任何建议将不胜感激

<!--XML CONFIGURATION -->
<bean id="myFileWriter" class="com.job.step.ItemFileWriter"  init-method="openFile" destroy-method="closeFile">
    <property name="jdbcTemplate" ref="jdbcTemplateProduct"/>   
</bean> 

public class ItemFileWriter implements ItemWriter<Item> {
private static final Logger log = Logger.getLogger(ItemFileWriter.class);   
private BufferedWriter bw = null;
public void openFile() throws IOException {
    try {
        bw = new BufferedWriter(new FileWriter("C:\\output.txt"));
    } catch (IOException e) {           
        //log.error(e);
        throw e;
    }       
}
public void closeFile() throws IOException {
    if (bw != null) {
        try {
            bw.close();
        } catch (IOException e) {
            log.error(e);
            throw e;
        } …
Run Code Online (Sandbox Code Playgroud)

java file-io transactions spring-transactions

7
推荐指数
1
解决办法
6813
查看次数

如何在多线程环境中使用JdbcTemplate?

我正在尝试将Spring JdbcTemplate与Spring的SimpleAsyncTaskExecutor一起使用,以便与单线程环境相比,可以在较短的时间内与DB进行并发连接并将整个数据插入到相关表中.

我正在使用以下代码,但它不会加快我的应用程序.

我能找到的唯一线索就是bean"campaignProductDBWriter"只构造了一次,而我希望创建10个单独的实例,因为我在tasklet中将"throttle-limit"设置为10.

我究竟做错了什么?任何帮助或建议将不胜感激.

问候,

<bean id="dataSourceProduct"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url.product}"
  p:username="${jdbc.username.product}" p:password="${jdbc.password.product}" 
/>

<bean id="jdbcTemplateProduct" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSourceProduct" />
</bean>

<bean id="simpleTaskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" >
  <property name="concurrencyLimit" value="-1" />
</bean>

<batch:job id="sampleJob" restartable="true"  incrementer="dynamicJobParameters">             
  <batch:step id="mapMZList">
    <batch:tasklet allow-start-if-complete="true" task-executor="simpleTaskExecutor" throttle-limit="10">                     
      <batch:chunk reader="campaignProductItemReader" processor="campaignProductProcessor" writer="campaignProductDBWriter" commit-interval="5000"/>        
    </batch:tasklet>
  </batch:step>                 
</batch:job>

<bean id="campaignProductDBWriter" class="com.falcon.cc.job.step.CampaignProductWriter">
  <property name="jdbcTemplate" ref="jdbcTemplateProduct" />
</bean>


<bean id="campaignProductItemReader" class="com.falcon.cc.job.step.FlatFileSynchronizedItemReader" scope="step">    
  <property name="resource" value="file:#{jobParameters['input.TEST_FILE.path']}"/>

  <property name="lineMapper">
    <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">        
      <property name="lineTokenizer">       
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
          <property name="delimiter" value=";"/>            
          <property name="names" value="approvalStatus,validFrom,validTo"/>
        </bean>
      </property> …
Run Code Online (Sandbox Code Playgroud)

java multithreading jdbc jdbctemplate spring-batch

2
推荐指数
1
解决办法
5825
查看次数

Spring Batch - 当 ItemReader 不返回数据时如何使作业失败

我有一个 spring 批处理应用程序,它使用 JdbcCursorItemReader 从数据库表读取数据,并使用 FlatFileItemWriter 将其写入平面文件。

当我测试我的应用程序时,我看到即使没有通过 JdbcCursorItemReader 从数据库返回数据,FlatFileItemWriter 也会创建一个文件。但是,当数据库中没有合适的数据时,我打算让我的工作失败。是否可以这样做或至少防止 FlatFileItemWriter 创建文件?

问候

spring spring-batch

2
推荐指数
1
解决办法
1万
查看次数