2016-06-06 14 views
5

nella documentazione primavera dati JPA si dice per quanto riguarda i flussi:Devo chiudere i risultati delle query terminate e trasmesse in streaming in un blocco try-with-resources?

Un Flusso avvolge potenzialmente sottostante memorizzare i dati risorse specifiche e deve quindi essere chiuso dopo l'uso. È possibile chiudere manualmente il flusso utilizzando il metodo close() o utilizzando un blocco try-with-resources di Java 7.

Vedi: http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-streaming

Se Elaboro un ruscello con forEach, un conteggio o un'altra operazione terminale, dovrebbe essere già chiusa (e non può essere riutilizzato) e non avrebbe dovuto avvolgere il flusso in ulteriori try-resources-block (dato che i miei blocchi non lanciano alcuna eccezione), o sbaglio qui?

risposta

10

Il Java APIs descrivono questo tema come segue:

Streams hanno un metodo BaseStream.close() e attuare AutoCloseable, ma quasi tutte le istanze del flusso in realtà non hanno bisogno di essere chiuso dopo l'uso. Generalmente, solo gli stream la cui origine è un canale IO (come quelli restituiti da Files.lines(Path, Charset)) richiederanno la chiusura.) La maggior parte dei flussi è supportata da raccolte, matrici o funzioni di generazione, che non richiedono una gestione delle risorse speciale. (Se uno streaming richiede la chiusura, può essere dichiarato come una risorsa in un'istruzione try-with-risorse)

si noti inoltre le API per Files.lines(Path, Charset)):.

il flusso restituito incapsula un Reader. Se è necessaria una tempestiva disposizione delle risorse di sistema di file , il costrutto try-with-resources dovrebbe essere usato per assicurare che lo stream siaIl metodo 0 viene richiamato dopo il completamento delle operazioni del flusso.

La linea di fondo è: se il flusso corrisponde a una risorsa che, in scenari normali, deve essere chiusa dopo l'uso (come IO), utilizzarla in un'istruzione try-with-resources.

+0

Grazie per il suggerimento al punto ovvio. Questo ha aiutato. Inoltre, come ho visto fino a tardi, c'è questa risposta qui: http://stackoverflow.com/questions/27381329/do-terminal-operations-on-streams-close-the-source –

+1

Per chiarire: * Qualsiasi * volta a " risorsa ", è necessario utilizzare try-with-resources (o equivalente) per rilasciarlo quando viene eseguito, anche quando si utilizzano gli stream. Anche se il flusso 'forEach' viene chiuso alla fine, devi farlo, altrimenti otterrai una perdita di risorse se si verifica un'eccezione. Dato che 'forEach' non chiama' close() ', devi assolutamente farlo. – Andreas

Problemi correlati