2017-03-16 7 views
0

私はSpringBootアプリケーションで作業していますが、Springデータ、HikariCP、JDBCを使用していますが、問題があります。SpringのデータJPAとJDBCのテンプレート

私は1つの方法の中で、UserをSpring Dataリポジトリを使用してデータベースから取得します。私はUser上記のusernameとDBから他のいくつかの情報を取得するためにJdbcTemplate.queryを使用しますが、アプリケーションがフリーズし、私は私がjdbctemplateことを確認コードをデバッグする場合、いくつかの時間後に、それは

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

をスローDBからUserを取得した後、 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があなたのリポジトリとは異なる接続を使用しているようです。また、接続プールでは1つの接続のみが使用可能になり、リポジトリですでに使用されているため、タイムアウトが発生します。

接続プールの容量を増やすとすぐに問題は解決しますが、リポジトリとJdbcTemplateでは異なる接続とトランザクションが使用されるため、不要になる可能性があります。

JdbcTemplateの接続先は表示されませんが、問題が発生するのはおそらくそうです。それを修正するにはEntityManagerを注入してください。それからConnectionを入手してください。それを行う方法は、JPA実装に依存します。ここにはバージョンfor Eclipse Linkfor Hibernateがあります。次にConnectionを使用してJdbcTemplateを作成します。

関連する問題