【问题标题】:Problem with database access using multithreading JDBC create/update/insert queries使用多线程 JDBC 创建/更新/插入查询的数据库访问问题
【发布时间】: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


【解决方案1】:

我发现了问题。我使用枚举来动态构建查询,忘记了枚举本质上是静态的。我用地图替换了它,它现在可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多