【问题标题】:Spring Batch & Azure SQL Server : SQL Server did not return a response. The connection has been closedSpring Batch 和 Azure SQL Server:SQL Server 没有返回响应。连接已关闭
【发布时间】:2021-11-16 03:18:08
【问题描述】:

我有一个使用 Azure SQL 服务器的 Spring Batch 应用程序,它运行时没有任何问题,并且大部分时间都在更新数据库,但是我偶尔会收到以下错误

这是什么意思?如何处理?

注意:这是一个长时间运行的作业,执行时间超过 2 小时。约 1.45 小时后报告上述错误。

我正在使用 FlatfileReader 从 CSV 文件中读取数据并使用 ItemWriter 写入 Azure SQL Server,如下所述

public class StoreWriter implements ItemWriter<List<Store>> {

   Logger logger = Logger.getLogger(StoreWriter.class);

   private HibernateItemWriter<Store> hibernateItemWriter;

   public StoreWriter(HibernateItemWriter<Store> hibernateItemWriter) {
      this.hibernateItemWriter = hibernateItemWriter;
   }

   @Override
   public void write(List<? extends List<Store>> items) throws Exception {
      for (List<Store> Store : items) {
        hibernateItemWriter.write(Store);
      }
      logger.info(String.format("Store Processing Completed %s", new LocalDateTime()));
   }
}

下面是我的休眠配置

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" lazy-init="true">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- HikariCP Database bean -->
<bean id="demoDataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="hikariConfig" />
</bean>

<!-- HikariConfig config that is fed to above dataSource -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="maximumPoolSize" value="50" />
    <property name="idleTimeout" value="30000" />
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
    <property name="url" value="jdbc:sqlserver://demo.database.windows.net:1433;database=sqldb;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" />
    <property name="username" value="user1" />
    <property name="password" value="p@ssword1" /
</bean>
<bean class="org.springframework.batch.core.scope.StepScope" />

【问题讨论】:

  • 与服务器的连接似乎在一段时间后关闭。您可能需要在服务器配置中增加 idleTimeout 参数。
  • 有没有办法在Itemwriter类中引入重试逻辑?
  • 让我们尝试将连接超时时间增加到 60000,空闲超时时间增加到 600000,最大寿命增加到 1800000,然后重试...这将使您的连接时间更长...

标签: spring hibernate azure-sql-database spring-batch azure-sql-server


【解决方案1】:

请尝试在提交记录的方法上使用注释“@Transactional (propagation = Propagation.REQUIRES_NEW)”。

【讨论】:

  • 谢谢@borchvm,它会做什么?这将如何解决问题?
  • 你好,我看到晚了,我告诉你检查是不是因为一些交易没有关闭。即使存在,这也会创建一个新事务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 2012-06-12
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多