Oracle Data Provider for .NET: demande de Connexion timed out

Nous avons un C# WCF service web hébergé sur Windows 2008 SP2/IIS 7 accès à une base de données Oracle. Généralement, l'accès aux données fonctionne bien, mais pendant les tests de charge, c'est souvent du temps et des journaux et d'exception en disant:

Error occurred when processing XXXXXXXX Web Service
Oracle.DataAccess.Client.OracleException Connection request timed out at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
   at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
   at Oracle.DataAccess.Client.OracleConnection.Open()
   at MyWorkspace.WorkForceDataAccess.CheckStaffIdInRSW()
   at MyWorkspace.MyClass.MyFunction(MyDataType MyData)

Pour interroger la base de données, nous utilisons quelque chose comme ceci:

OracleConnection orConn = new OracleConnection();
orConn.ConnectionString = "user id=xxx; password=xxx; Connection Timeout=600; Max Pool Size=150; data source= (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = MYHOST.MYDOMAIN.com)(PORT = 1771)) (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = MYSERVICE.MYDOMAIN.com)))";
orConn.Open();

using (var cmd = new OracleCommand("MY_UTIL.check_StaffIdInRSW", orConn) { CommandType = CommandType.StoredProcedure })
{
    cmd.Parameters.Add("P_Staff_Id", OracleDbType.Int32);
    cmd.Parameters["P_Staff_Id"].Direction = ParameterDirection.Input;
    cmd.Parameters["P_Staff_Id"].Value = Convert.ToInt32(MyDataObject.StaffId);

    cmd.Parameters.Add("P_retvalue", OracleDbType.Int32);
    cmd.Parameters["P_retvalue"].Direction = ParameterDirection.Output;

    cmd.ExecuteNonQuery(); //Execute the function

    //obtain result
    returnVal = int.Parse(cmd.Parameters["P_retvalue"].Value.ToString());
}

Je suis assez confiant sur le fait que la procédure stockée qui est invoquée, n'est pas en prenant tout le temps. Il est assez simple procédure qui vérifie si le P_Staff_Id existe dans la table et retourne le résultat.

En outre, cela se produit uniquement pendant les essais en charge. Au cours de l'exploitation normale, les choses sont bien, mais au cours de lourdes charges avec 1 message par seconde, cela se produit après l'exécution lisse pour un certain temps.

Comme une solution de contournement, j'ai ajouté "Délai d'attente de Connexion=600; Max Pool Size=150“ à la chaîne de connexion, mais cela ne corrige pas le problème.

Nous avons la même application s'exécutant sur un serveur de développement et il fonctionne très bien. Nous n'avons jamais rencontré ce problème là.

Des suggestions quant à ce qu'à essayer serait appréciée. Il semble que je suis à court d'options.

La stacktrace suggèrent que la procédure n'est pas la question. L'exception est soulevée avant son exécution au sein de la Connexion.Ouvert, donc il semble que la base de données de la machine est surchargé donc il ne peut pas répondre au client dans un délai de délai d'attente. Il ne devrait pas être liée à la taille du pool ou les processus de limitations dans Oracle, ces lancer de différentes exceptions. Aussi je serait suspect à ce sujet de la taille du pool, parce que ça n'aurait pas de sens d'avoir de la piscine nettement plus grand que le nombre de noyaux de la base de données peut utiliser. Ou vous avez une connexion fuite quelque part.
J'ai ajouté le Délai de Connexion et Max de la Taille du Pool pour la chaîne de connexion une fois ce problème est venu - mais il n'a pas aidé. Le service web a été fonctionne correctement dans l'environnement de DEV sans ces. Par la connexion de fuite, suggérez-vous de la fermeture et de l'élimination de la OracleConnection objet explicitement après est-il utilisé?
Annonce de fuite dans le joint - si l'objet de connexion a juste à court de vivre au sein d'une même fonction, puis en utilisant (var connexion = ...) {...} est certainement plus sûr. Mais je n'attends pas telle est la question. Vous obtiendrez différents exception lorsque la piscine est entièrement utilisé. Annonce de test de charge - j'espère que vous exécutez plusieurs instances de l'application ou de la fonction en parallèle. Également s'attendre à ce que vous utilisez des connexions dédiées, ne partage pas les serveurs d'Oracle configuration. Pouvez-vous vérifier comment les séances de regarder dans la base de données pendant le test pour voir combien de séances et combien de sessions actives en fait, il y sont.

OriginalL'auteur DjD | 2015-09-27