首页 > 解决方案 > JDBC 模板表锁定问题

问题描述

我正在使用 JDBC 模板插入/更新数据库表。我有以下来自数据源的配置:

@Bean
  public DataSource dataSource() {
    HikariDataSource dataSource = new HikariDataSource();
    SQLServerDataSource ds = new SQLServerDataSource();
    ds.setUser("user name");
    ds.setPassword("Password");
    ds.setPortNumber(123);
    ds.setDatabaseName("DB name");
    ds.setServerName("Server");
    ds.setEncrypt(true);
    ds.setTrustServerCertificate(true);
    dataSource.setAutoCommit(true);
    dataSource.setMaximumPoolSize(size);
    dataSource.setMinimumIdle(idle);
    dataSource.setDataSource(ds);

    return dataSource;
  }

我的问题是表锁。我my_table通过公开 API 端点来访问、插入和更新表。因此,当我第一次点击端点时,端点会在预期的表中插入三行。在第一次命中后,对 Endpoint 的另一次命中需要 2/3 分钟才能插入数据。在此期间,我什至无法访问我my_table使用的 MS SQL 客户端应用程序。

我认为这可能是因为公开提交,这就是我做出的原因:

dataSource.setAutoCommit(true);

但不是运气。在第一个命中表被锁定一段时间后,所有其他后续命中或直接访问该数据库表的时间太长。

Java 应用程序在 localhost 上运行良好,但在部署到 Azure(应用程序服务)后,我遇到了表锁定问题。我不确定它的表锁定问题或导致该表繁忙的原因。我正在使用也在云上的 MS SQL Server。

注意:在我的 DAO 级别,我只是jdbcTemplate.update()用来添加或编辑数据,在我的服务级别方法上我正在使用@Transactional.

标签: javasql-serverspringazurejdbctemplate

解决方案


我创建了一个新项目并对其进行了测试,它运行良好。你可能会得到它:数据源

用户表:

在此处输入图像描述

我曾经jdbcTemplate.update()添加和更新用户,并且还启用@TransactionalJdbcUserRepository. 但是,当我尝试添加用户时,表没有被阻止:

在此处输入图像描述

从截图中可以看到,我发出了很多 POST 请求来添加用户,每个请求都立即得到响应。

所以,我认为问题的根本原因可能仍然在于代码的逻辑部分。您能否分享更多代码以进行进一步调查。


推荐阅读