2010-02-13 13 views
2

Nous construisons un site Web de vérification de statut de prêt extranet à l'aide d'ASP.NET MVC avec un backend WCF. C'est une conception assez standard avec le site MVC utilisant une référence de service WCF pour obtenir des objets clients. Le service utilise une liaison Oracle backend + http et ne sera pas hébergé sur le même serveur que le site MVC (nous ne pouvons donc pas utiliser la liaison TCP pour réduire la latence). Le problème que nous avons rencontré est que chaque appel au service entraîne un temps de réponse de 7-8, ce qui est inacceptable pour un site extranet et beaucoup plus élevé que la marque magique 2s. La ou les méthodes de service appellent 12 procédures stockées pour créer l'objet client. La base de données est malheureusement dénormalisée (nous ne pouvons pas la modifier car elle est également utilisée par d'autres systèmes de production internes). La plupart des appels sont donc des instructions de base qui peuplent l'objet client et ses objets associés. Le proxy de service est correctement ouvert et fermé/éliminé dans les actions MVC afin qu'il n'y ait aucune fuite de connexion de service. Un nouveau proxy client est créé pour chaque requête (c'est-à-dire que nous n'utilisons pas le modèle singleton pour le service).Problèmes de performances avec le site ASP.NET MVC/WCF et le backend Oracle

Des idées sur comment nous pouvons accélérer cela?

Merci

Répondre

0

Jusqu'à ce que vous ayez mesuré avec précision ce qui se passe réellement, ne prenez pas trop rapidement en compte le goulot d'étranglement.

Vous avez vraiment besoin de faire une trace SQL étendue Oracle pour voir d'où vient cette lenteur. Quelque chose d'autre que cela, c'est surtout des suppositions. Voici un document de Cary Millsap (de la méthode R et autrefois de HotSOS) que vous pouvez télécharger que les détails faire:

http://method-r.com/downloads/doc_details/10-for-developers-making-friends-with-the-oracle-database-cary-millsap

+1

Merci à tous pour les réponses. Nous avons trouvé la solution à ce problème de performance. Pour 10 de nos 12 procédures stockées, nous utilisions la fonction LOWER oracle sql sur le champ indexé. Une fois que nous avons enlevé cela, notre temps de réponse du service est passé de 8 à moins de 2 secondes. – fjxx

1

On dirait que vous savez déjà où le problème est - c'est la base de données.

Je n'ai jamais entendu parler d'une opération WCF qui prendrait plus d'une fraction de seconde à configurer et à démonter, excluant toute logique à l'intérieur. Donc, même si vous pouviez raser 1-2 secondes de latence (ce qui est probablement une estimation optimiste), cela n'aide pas vraiment si l'opération de base de données prend 5-6 secondes par elle-même.

Honnêtement? Exécution de 12 procédures stockées pour créer un client est complètement hors-mur. Le but d'une procédure stockée est d'encapsuler toute la logique nécessaire pour effectuer une opération de base de données complexe. La toute première chose que vous devez faire est de changer ceci pour être une procédure stockée - alors si elle est toujours lente, profilez la base de données pour voir ce qui prend si longtemps et corrigez-la en conséquence. Les performances de base de données généralement médiocres sont dues à un ou plusieurs index manquants.

+0

Merci pour la réponse. La raison pour laquelle nous avons 12 procédures stockées est parce que l'information de client réside dans différentes tables (adresse, taux de prêt, etc.) et chacun doit être interrogé - ainsi vous recommandez tirer toutes les informations de plusieurs tables dans un proc stocké? – fjxx

+0

@fjxx: Vous pouvez commencer par placer la logique dans un proc mémorisé. Mais il est plus probable que vous n'ayez pas à interroger individuellement 12 tables distinctes, vous pouvez le faire avec un seul ensemble de jointures. Et même dans ce cas, 8 secondes vous semblent trop longues - vous n'avez probablement pas indexé correctement certaines ou certaines tables. – Aaronaught