2010-06-30 3 views
4

Contexte WCF Stack, accès aux données Mis en œuvre en Entity Framework, Fin simple ASP.NET avantAsync = true et Entity Framework

C'est une question en deux parties.

Récemment, nous avons couru dans un problème avec des accidents périodiques avec une exception qui a lu:

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available

Nous avions exploitons notre application sans problème depuis plus d'une semaine, puis tout à coup, nous avons été frappés par ce hasard crash/Si je devais deviner je dirais que c'était lié au réseau, mais nous n'avons pas pu déterminer la source exacte. Quelqu'un a-t-il reçu périodiquement ce message? Si oui, quelle était la cause première?

Deuxième question est quelqu'un suggéré de définir "async = true" dans notre chaîne de connexion Entity Framework. J'étais sous l'impression que cela permet juste l'api asynchrone. Cela fait-il quelque chose lorsque vous utilisez EF? La commutation de ce drapeau fait-elle quoi que ce soit avec les requêtes générées par EF?

Répondre

6

Pour être ce gars, je vais répondre à celui-ci par moi-même.

J'ai d'abord posté la question à propos de l'effet "async = true" s sur l'entité framrwork à MS et personne n'a répondu ... comme d'habitude (si ils répondent, je mettrai à jour cet article).

Notre question:

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available

était lié environnement. Quelque chose entraînait un ralentissement de la DB, mais cela laissait présager un problème plus important. Apparemment EF a des problèmes horribles quand vous partagez le contexte entre les threads (pas un problème facile à résoudre), donc nous avons vu une condition de concurrence avec des connexions d'ouverture.

Nous avions fondamentalement un "contexte de lecture seule" qui a seulement obtenu. Notre question était deux threads tentent d'ouvrir la connexion en même temps, on gagne, l'autre perd ce qui fait varier de l'exception ci-dessous:

The connection was not closed. The connection's current state is connecting.

Notre solution était de convertir notre singleton à fil spécifique. Pas exactement ce que nous voulions, mais cela a fonctionné, et quand nous avons poussé cette solution, notre autre problème est parti par magie.

La seconde moitié de cette question était ce que fait async = true. Quand il s'agit de EF, il a fait planter notre système. Nous avions un bloc de code qui ne une jointure, et si async = true et MARS = false nous avons eu:

There is already an open DataReader associated with this Command which must be closed first

Une fois que nous réduisons les MARS, et les choses étaient bien à nouveau async handicapés.