Spring Data JPA和JDBC模板

时间:2017-03-16 19:42:14

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

我正在使用Spring Boot Application,我使用Spring Data,HikariCP和JDBC,但我遇到了问题。

在一个方法中,我使用Spring Data存储库从数据库中获取特定的User。从数据库中获取User后,我使用JdbcTemplate.queryusername以上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;
 }

我做了一个研究如何一起使用它们并分享相同的交易或类似的东西,但遗憾的是无法修复它。

2 个答案:

答案 0 :(得分:1)

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

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

您无法显示JdbcTemplate与其建立联系的位置,但这可能是出错的地方。要修复它,请注入EntityManager。然后从中获取Connection。如何做到这一点取决于JPA实现。以下是版本for Eclipse Linkfor Hibernate。然后使用Connection创建JdbcTemplate

答案 1 :(得分:0)

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

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