2010-06-08 6 views
4

Nous utilisons ADO pour accéder à Oracle 10g version 2, fournisseur Oledb pour Oracle 10g. Nous sommes confrontés à un problème avec la mise en commun des connexions. La base de données réside sur la machine distante et le regroupement de connexions se produit comme il se doit. Mais si la machine distante tombe en panne pour une raison quelconque, la connexion est renvoyée à partir du pool et la requête sur cette connexion échoue. Lorsque cette connexion est fermée, elle est renvoyée au pool au lieu d'être invalide. Les demandes d'ouverture de connexion suivantes sont réussies mais la requête échoue. C'est un comportement étrange, selon les spécifications OLEDB, le fournisseur doit prendre en charge la propriété DBPROP_CONNECTIONSTATUS, donc en cas de connexion invalide, il ne serait pas retourné au pool.Oracle OLEDB Connexion Pooling et connexions non valides

Les choses se gâchent quand la machine distante arrive. Les connexions dans le pool sont toujours non valides et bien que l'ouverture de connexion réussisse, la requête sur la connexion échoue. Oracle OLEDB ne peut plus se connecter au serveur et nous devons redémarrer notre application. Eh bien, ce n'est pas souhaitable car notre application est une application critique.

Des idées sur la façon de surmonter ce problème.

Merci Mubashir

+0

Je ne suppose pas que ce soit un projet .NET? Je demande parce que nous n'avons eu aucun problème avec le pilote ODP. NET sur 10g, a bien fonctionné. –

+0

non ce n'est pas .NET. nous utilisons le fournisseur OLEDB pour Oracle avec ADO dans VC++ projet –

+0

Utilisez-vous des méthodes statiques pour ouvrir les connexions à la base de données? Il s'agit d'une approche longue car il s'agit d'OLEDB/Oracle/VC++, mais il existe un comportement documenté dans la corruption du pool de bases de données .NET/SQL Server lorsqu'une connexion à une base de données est ouverte dans une méthode statique. –

Répondre

0

Les connexions sont récupérées après 10 minutes par défaut. L'heure peut être définie par la clé de registre SPTimeout sous la clé racine du fournisseur oledb.

1

Si vous faites cela par programme, utilisez un bloc d'essai, de sorte que si quelque chose arrive, il ne manquera pas. Avec un bloc try, vous pouvez attraper une exception et l'ignorer, afin que les erreurs soient éliminées.

Vous pouvez indiquer au pool de ne pas accepter les connexions non valides en indiquant que la connexion est invalide avant de la renvoyer au pool.

+0

Comment cette fonction «marquer la connexion invalide» est-elle disponible avec l'ado classique? toute cette chose est censée être faite par le conducteur lui-même. Le fournisseur SQL fonctionne correctement, mais le fournisseur Oracle ne le fait pas. –

+0

L'OP a dit "il est retourné à la piscine au lieu d'être invalide." et ma réponse était probablement trop simpliste. – alexy13

-1

Dans la plupart des implémentations de pools de connexions, il est possible de vérifier la connexion avant de l'utiliser. Par exemple: vous définissez une requête de vérification comme select * à partir de dual et si vous récupérez une connexion à partir du pool, cette requête sera exécutée. En cas d'échec, la connexion sera exclue du pool et une nouvelle connexion sera ouverte.

+1

DBPROP_CONNECTIONSTATUS est censé faire cela au niveau du pilote, mais le fournisseur Oracle ne le supporte pas correctement. –

+0

Pouvez-vous penser à la dégradation des performances de cette approche? La mise en commun des connexions ne signifie-t-elle pas «améliorer les performances du système»? – Jaywalker

+0

Cela dépend de l'affaire. Dans la plupart des cas, il a juste un effet légèrement négatif. Que faire si vous ne pouvez pas vous permettre d'avoir des connexions invalides dans votre piscine? Dans la plupart des systèmes de production, ce n'est pas une option. Imaginons qu'il y ait un court problème de networrk et que vous perdiez votre db. Alors toutes les conections seront invalides ... – HamoriZ

Questions connexes