2016-12-07 10 views
4

をしない私はSpring dataリポジトリがあります。春リポジトリ方式が近いJDBC接続

@Repository 
interface SomeRepository extends CrudRepository<Entity, Long> { 
    Stream<Entity> streamBySmth(String userId); 
} 

を私はいくつかのSpring Beanにそのメソッドを呼び出しています:

@Scheduled(fixedRate = 10000) 
private void someMethod(){ 
    someRepository.streamBySmth("smth").forEach(this::callSomeMethod); 
} 

私はMySQLデータベースを使用します。

に思え
o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08001 
o.h.engine.jdbc.spi.SqlExceptionHelper : Could not create connection to database server. 
o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task. 

org.springframework.dao.DataAccessResourceFailureException: Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection 

、その接続は春で適切に閉じられていませんでした:私はいくつかの成功メソッド呼び出しの後にアプリケーションを実行していたときに、それが例外をスローします。メソッドの戻り値をListからStreamに変更した場合、正しく動作します。

UPDATE: 春ブートバージョンreference documentation clearly statesStream sが試し-と、リソースブロックと一緒に使用する必要があるとして1.4.1.RELEASE

+2

ストリームで 'close'を呼び出そうとしましたか? – marstran

+0

私は試しましたが、それは助けられませんでした。それにもかかわらず、 'Stream'を手動で閉じるのは正しい動作ではありません。 –

+0

私はリポジトリから 'Stream'を返すことに慣れていませんが、' Stream'は遅延しています。 'Stream'は' AutoClosable'でもあるので、try-with-resources節でそれを使うことができます。 – marstran

答えて

7

です。

また、周囲のメソッドに@Transactionalと注釈を付けることによって、ストリームの消費時間の間、(読み取り専用の)トランザクションを開いたままにしておきます。それ以外の場合は、デフォルト設定が適用され、リポジトリメソッドのリターン時にリソースが解放されようとします。

@Transactional 
public void someMethod() { 

    try (Stream<User> stream = repository.findAllByCustomQueryAndStream()) { 
    stream.forEach(…); 
    } 
} 
+0

私たちを助けません。私はいくつかの要求の後も同じエラーがあります。 –

+0

残念ながら、もう一度は役に立ちません。私は '@Transactional(readOnly = true)'を使用しようとしており、また '.close()'ストリームにしようとしました。今100回成功して失敗します。私が理解しているように、新しい接続はすべてのリクエストで開かれます。それは春のバグかもしれない? –

+0

問題を再現するサンプルを提供できますか?上記のチケットには、[ここ](https://jira.spring.io/browse/DATAJPA-917)に関連するものがありますが、上記の説明に従うことで解決することができます。 –