【问题标题】:Spring Data JPA and JDBC templateSpring Data JPA 和 JDBC 模板
【发布时间】:2017-08-08 04:18:57
【问题描述】:

我正在开发 Spring Boot 应用程序,我使用 Spring Data、HikariCP 和 JDBC,但我遇到了问题。

在一种方法中,我使用 Spring Data 存储库从数据库中获取特定的 User。在我从数据库中获取User 之后,我使用JdbcTemplate.query 从数据库中获取一些其他信息,其中username 高于User,但应用程序冻结并在一段时间后抛出

java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30006ms.

当我调试代码时,我看到jdbctemplate 正在使用 hikariCP 作为datasource

这是我正在使用的代码:

 public User getUser() {

     User user = userRepository.findByUsernameAndEnabledTrue("username");

     List<String> roles=  getUserRoles(user.getUsername())

     return user;

 }

 private List<String> getUserRoles(String username) {

     List<String> roles = this.jdbcTemplate.query("SELECT ga.authority FROM group_authorities ga INNER JOIN group_members gm ON gm.group_id = ga.group_id INNER JOIN users u ON gm.username=u.username WHERE u.username=?;",
         new Object[]{username},new ResultSetExtractor<List<String>>() {
             @Override
             public List<String> extractData(ResultSet resultSet) throws SQLException, DataAccessException {
                 List<String> roles = new ArrayList<>();
                 while (resultSet.next()) {
                     roles.add(resultSet.getString("authority"));
                 }
                 return roles;
             }
         });
     return roles;
 }

我研究了如何将它们一起使用并共享相同的事务或类似的东西,但不幸的是无法修复它。

【问题讨论】:

    标签: spring hibernate jdbc spring-data spring-jdbc


    【解决方案1】:

    您的问题似乎是JdbcTemplate 使用的连接与您的存储库不同。而且由于连接池只提供一个可用的连接并且已被存储库使用,因此您会遇到超时。

    增加连接池的容量可以解决这个直接的问题,但是存储库和JdbcTemplate 会使用不同的连接和事务,这可能是您不想要的。

    您没有显示您的 JdbcTemplate 的连接来源,但这可能是问题所在。要修复它,请注入 EntityManager。然后从中获取Connection。如何做到这一点取决于 JPA 实现。这是for Eclipse Linkfor Hibernate 的版本。然后使用 Connection 创建您的 JdbcTemplate

    【讨论】:

      【解决方案2】:

      例如,可以在自定义存储库中注入 DataSourceJdbcTemplate。如果 JPA 和 JDBC 调用在一个事务中(例如,由 @Transactional 生成),Spring 足够聪明,可以在具有相同事务和连接的两种情况下使用 JPATransactionManager

      https://billykorando.com/2019/05/06/jpa-or-sql-in-a-spring-boot-application-why-not-both/

      【讨论】:

        猜你喜欢
        • 2017-07-17
        • 2020-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-27
        • 1970-01-01
        • 2022-06-21
        • 1970-01-01
        相关资源
        最近更新 更多