Domanda

Ho appena iniziato a migrare il mio framework di persistenza nostrano verso l'APP.

Dato che i framework di persistenza nascondono molto dell'impianto idraulico, sono interessato a sapere se NON chiudere EntityManager creerà una perdita di risorse o se i framework li raccoglieranno e li chiuderanno per me.

Ho intenzione di chiuderli in tutti i posti, ma DEVO?

Al momento utilizzando TopLink, solo perché funziona facilmente con NetBeans, ma sono felice di indagare su altri provider JPA.

È stato utile?

Soluzione

Dipende da come l'hai ottenuto.

Se l'hai creato usando EntityManagerFactory dovrai chiuderlo indipendentemente dal framework che usi.

Se l'hai ottenuto usando l'iniezione delle dipendenze (ad es. usando l'annotazione EJB e @PersistenceContext) non dovresti chiuderlo a mano (AFAIK causerà RuntimeException).

Altri suggerimenti

Dovresti.

I frame non hanno idea di come si intende utilizzare l'EM, quindi non possono chiuderlo (tranne, potrebbe essere, al momento della finalizzazione, che non è garantito). Sì, non chiuderli creerebbe una perdita di risorse.

L'idea è la stessa di " chiudi sempre java.sql.Connection " (nonostante alcune origini dati abbiano le impostazioni per chiuderle automaticamente per inattività) o "Chiudi sempre la sessione di ibernazione".

Inoltre, se prevedi di scrivere un codice portatile, non dovresti fare affidamento sul fatto che il provider JPA specifico "sia intelligente". - altri potrebbero non riuscire a chiudere l'EM in tempo.

Ho ottenuto EntityManager usando l'annotazione @PersistenceContext nel mio repository. Vedo che dopo che i punti di connessione raggiungono il maxPoolSize non vengono ripuliti.

Tuttavia, se creo EntityManager utilizzando EntityManagerFactory e chiamo entitymanager.close () , le connessioni vengono ripulite. Sto usando c3p0 come libreria di pool di connessioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top