Hibernate e la connessione perduta…
Questo post è un po’ anomalo rispetto agli altri; invece di dare la risoluzione a dei problemi esprimerò un mio problema nella speranza di trovare qualcuno che magari riesca a darmi qualche dritta per risolverlo.
In sostanza in questo momento ho la necessita di fare il detach di un database SQL e ricollegarlo…e fin qui immagino le vostre espressioni facciali sornione…
Ho la necessità di farlo mentre il database è utilizzato da un’applicazione senza, ovviamente, dover riavviare la stessa…ed anche qui immagino ancora qualche espressione facciale sorridente…
La mia applicazione, ovviamente, usa NHibernate come ORM … io, in sostanza, riesco a scollegare la session al database in questione; scollegare il db; ricollegarlo; forzare una nuova connessione su una nuova session di Hibernate, la session va su senza errori ma alla prima operazione di lettura/scrittura dei dati mi viene risalita una ADO Exception con errore nel pooling della connessione (”Si è verificato un errore a livello di trasporto mentre si stava inviando la richiesta al server. (provider: Provider memoria condivisa, error: 0 - Nessun altro processo all’altra estremità della pipe.”)…e adesso…spero tanto ci siano ancora qualche espressione facciale divertita…
Postato in: Informatica | Contrassegnato da tag: NHibernate, Pooling, SQL
Stesso problema. Uguale uguale preciso identico. Ancora in cerca di soluzione …
Ciao Andrea, che versione di NHibernate stai utilizzando? Io sto convincendomi sempre più che il problema nasce dal fatto che nella versione 1.0.1 la gestione della session factory, unitamente a quella del lazy, non è proprio fatta come da documentazione. Attualmente sto migrando alla 1.2.1 e sto facendo un test con questa versione. Spero a breve di postare la risoluzione definitiva al problema
Ciao
Io sto usando la versione 1.2.1
Ho analizzato un po’ più a fondo il problema e sono giunto alla conclusione che NHibernate non c’entra nulla.
Il vero problema sta nella System.Data.SqlClient.SqlConnection di Microsoft utilizzata da NHibernate per accedere al database.
Dopo aver sbattuto la testa per un giorno e mezzo ho trovato riscontro alle mie supposizioni su questo post:
http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic54394.aspx
Che è stato decisivo per la risoluzione del problema.
Il ConnectionDriver di Microsoft fa il caching delle connessioni e naturalmente queste non sono più valide dopo che il DB è stato riavviato.
La soluzione consiste nel mettere un magico pooling=false nella connect string utilizzata per accedere al database.
Spero che tutto ciò possa essere utile.
Ciao
Confermo la tesi di Andrea sul fatto che la problematica, legata alla connessione al DB di ADO.NET, viene risolta esplicitando il pooling a “false” nella stringa di connessione di NHibernate.
Aggiungo, a maggior riprova del fatto, che il tutto funziona anche con la versione precedente 1.0.1
Thanks a lot!!!