2011-04-02 2 views
0

Je viens de migrer mon application NHibernate de SQL Server vers MySQL. Tout semble bien sauf que je reçois des exceptions Timeout intermittentes. Je peux trouver beaucoup d'informations sur ces délais avec MySql et même one blog post sur les délais d'attente avec Hibernate + MySql + C3PO (quel qu'il soit). Mais rien sur la façon de modifier NHib pour arrêter ce problème. Savez-vous?NHibernate + MySql Intermittent TimeoutException

Voici la trace de la pile:

NHibernate.TransactionException: Begin failed with SQL exception ---> System.TimeoutException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond ---> System.IO.IOException: Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 
    at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 
    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    --- End of inner exception stack trace --- 
    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    at MyNetworkStream.Read(Byte[] buffer, Int32 offset, Int32 count) 
    --- End of inner exception stack trace --- 
    at MyNetworkStream.HandleOrRethrowException(Exception e) 
    at MyNetworkStream.Read(Byte[] buffer, Int32 offset, Int32 count) 
    at MySql.Data.MySqlClient.TimedStream.Read(Byte[] buffer, Int32 offset, Int32 count) 
    at System.IO.BufferedStream.Read(Byte[] array, Int32 offset, Int32 count) 
    at MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count) 
    at MySql.Data.MySqlClient.MySqlStream.LoadPacket() 
    at MySql.Data.MySqlClient.MySqlStream.ReadPacket() 
    at MySql.Data.MySqlClient.NativeDriver.ReadOk(Boolean read) 
    at MySql.Data.MySqlClient.NativeDriver.SetDatabase(String dbName) 
    at MySql.Data.MySqlClient.Driver.SetDatabase(String dbName) 
    at MySql.Data.MySqlClient.MySqlConnection.ChangeDatabase(String databaseName) 
    at MySql.Data.MySqlClient.MySqlConnection.Open() 
    at NHibernate.Connection.DriverConnectionProvider.GetConnection() 
    at NHibernate.AdoNet.ConnectionManager.GetConnection() 
    at NHibernate.Impl.SessionImpl.get_Connection() 
    at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel) 
    --- End of inner exception stack trace --- 
    at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel) 
    at NHibernate.Transaction.AdoTransaction.Begin() 
    at NHibernate.AdoNet.ConnectionManager.BeginTransaction() 
    at NHibernate.Impl.SessionImpl.BeginTransaction() 
+0

pour l'instant vous pouvez mettre une minuterie pour faire un peu factice SELECT, pour éviter le délai d'attente? – Tony

+0

Tim avez-vous résolu cela comme je m'interroge à ce sujet de plus en plus ... – Rippo

Répondre

0

Je lance NHibernate sur un nuage Rackspace avec une base de données MYSQL. J'ai trouvé que je recevais des délais d'attente en raison du fait que les connexions étaient laissées à moitié ouvertes en raison du sommeil. Finalement, je manquais de connexions et mon site Web a expiré.

À la fin, j'ai ajouté Pooling=false; dans ma chaîne de connexion. Je ne suis pas sûr si c'est le correctif final mais il a arrêté mon problème.

Vous pouvez vérifier les connexions à dormir en utilisant show processlist dans un éditeur MySQL ...

+0

Merci. Yikes! Pooling = faux? Êtes-vous inquiet de l'impact sur les performances de cela? –

+0

Très probablement oui, cela dépend du cas d'utilisation; Cependant, je pense qu'il y a un bug dans le code de mise en commun qui marque les connexions comme «sleeping» MAIS ne leur permet pas d'être réveillé, par conséquent vous finissez par manquer de connexions. Comme je l'ai dit ce n'est pas la solution ultime, mais c'est une solution de contournement pour moi au moins pour l'instant. – Rippo

+0

Tim jeter un oeil à ce http://stackoverflow.com/questions/5567097/using-mysqlconnection-in-c-does-not-close-properly – Rippo