Spring数据JPA和JDBC模板

Spring数据JPA和JDBC模板,spring,hibernate,jdbc,spring-data,spring-jdbc,Spring,Hibernate,Jdbc,Spring Data,Spring Jdbc,我正在开发Spring引导应用程序,我使用Spring数据、HikariCP和JDBC,但我有一个问题 在一个方法中,我使用Spring数据存储库从数据库中获取一个特定的用户。在我从数据库中获取用户后,我使用JdbcTemplate.query从数据库中获取一些其他信息,使用上述用户的用户名,但应用程序冻结,并在一段时间后抛出 java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available,

我正在开发Spring引导应用程序,我使用Spring数据、HikariCP和JDBC,但我有一个问题

在一个方法中,我使用Spring数据存储库从数据库中获取一个特定的
用户。在我从数据库中获取
用户
后,我使用
JdbcTemplate.query
从数据库中获取一些其他信息,使用上述
用户
用户名
,但应用程序冻结,并在一段时间后抛出

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;
 }
public用户getUser(){
User User=userRepository.findbyusernameandebledTrue(“用户名”);
列表角色=getUserRoles(user.getUsername())
返回用户;
}
私有列表getUserRoles(字符串用户名){
List roles=this.jdbcTemplate.query(“从组中选择ga.authority\u authorities ga internal JOIN group\u members gm ON gm.group\u id=ga.group\u id internal JOIN users u ON gm.username=u.username,其中u.username=?;”,
新对象[]{username},新结果文本描述符(){
@凌驾
公共列表提取数据(ResultSet ResultSet)抛出SQLException、DataAccessException{
列表角色=新的ArrayList();
while(resultSet.next()){
添加(resultSet.getString(“authority”);
}
返回角色;
}
});
返回角色;
}

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

您的问题似乎是
jdbc模板使用的连接与您的存储库不同。由于连接池只提供一个可用的连接,并且存储库已经使用了该连接,因此会出现超时

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


您不会显示您的
JdbcTemplate
从何处获取连接,但这可能就是问题所在。要修复它,请注入
EntityManager
。然后从中获取
连接。如何做到这一点取决于JPA实现。以下是版本和版本。然后使用该
连接
创建您的
JdbcTemplate

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