【发布时间】:2019-08-28 11:29:07
【问题描述】:
我有一个多线程 Spring Boot 应用程序,它将大量数据插入 MySQL。 当应用程序启动时,一个线程正在运行以持久化“主”数据。这很好用。 主数据持久化后,启动多个线程将数据插入到各个子模式(也包括MySQL)中,调用主数据(一种复杂规则的复制过程)持久化的数据。
我观察到的是奇怪的 SQL 错误,当我单线程运行应用程序时不会发生这种错误,所以我怀疑是多线程导致了这个问题。
这些似乎都没有帮助。我收到如下错误: - 糟糕的 SQL 语法(正如我所说,单线程工作并非如此) - 空 SQL 语句(这是不可能的)
我希望这个论坛上的任何人都可以对此发表一些看法
我尝试过的事情: - 使我用来将数据插入子模式的 DAO 成为原型 bean,因此每个线程有一个不同的 DAO - 使 NamedParameterJDBCTemplate(在 DAO 中使用)成为原型 bean - 使 NamedParameterJdbcTemplate 使用的 DataSource 成为原型 bean
===>>> 配置
// Target data source
@Bean(name = "targerDSProps")
@ConfigurationProperties(prefix = "target.server")
public DataSourceProperties targetDSProps(){
return new DataSourceProperties();
}
@Bean(name = "targetDS")
@ConfigurationProperties(prefix = "target.server.configuration")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public DataSource targetDS(){
return targetDSProps().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
@Bean(name = "targetNamedParameterJdbcTemplate")
public NamedParameterJdbcTemplate targetJdbcTemplate(@Qualifier("targetDS") DataSource targetDS) {
return new NamedParameterJdbcTemplate(targetDS);
}
===>>> DAO
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Slf4j
public class TargetDAO {
@Autowired
@Qualifier(value = "targetNamedParameterJdbcTemplate")
private NamedParameterJdbcTemplate namedTargetJdbcTemplate;
这些似乎都没有帮助。我收到如下错误: - 糟糕的 SQL 语法(正如我所说,单线程工作并非如此) - 空 SQL 语句(这是不可能的)
【问题讨论】:
-
数据真的是持久化的,还是作为主要数据正在进行的事务的一部分启动的线程。这意味着在数据提交之前您可能会遇到问题。使事物原型作用域并没有真正的帮助。基本上没有看到你正在运行的代码(事物是如何存储和线程化的)是不可能给出答案的。
标签: multithreading spring-boot spring-jdbc hikaricp