2017-03-16 151 views
0

我在Spring Boot Application上工作,我使用Spring Data,HikariCP和JDBC,但是我遇到了問題。Spring Data JPA和JDBC模板

在一種方法中,我使用Spring Data存儲庫從數據庫中獲取特定的User。我從我使用JdbcTemplate.query來從DB獲得的一些其他信息與上述User但應用程序凍結的username DB中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; 
} 

我做了一個研究如何結合使用這些並共享相同的交易或類似的東西,但可惜不能修復它。

回答

1

您的問題似乎是JdbcTemplate使用與您的存儲庫不同的連接。由於連接池只能創建一個可用的連接,並且該連接池已被存儲庫使用,所以您會遇到超時。

增加連接池的容量可以解決即時問題,但存儲庫和JdbcTemplate將使用不同的連接,因此可能會使用您不想要的事務。

你不顯示你的JdbcTemplate從哪裏得到它的連接,但這可能是事情出錯的地方。要修復它,注入EntityManager。然後從它得到Connection。如何做到這一點是依賴於JPA實現。這裏是版本for Eclipse Linkfor Hibernate。然後使用Connection創建您的JdbcTemplate