Question

Le code suivant exécute une commande d'insertion simple. Si elle est appelée 2 000 fois de suite (pour insérer 2 000 lignes), une exception OleDbException avec le message = "Ressources système dépassées" Est lancé. Y a-t-il autre chose que je devrais faire pour libérer des ressources?

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}
Était-ce utile?

La solution

L'erreur de dépassement des ressources système ne provient pas du code géré, mais de votre destruction de la base de données (JET?)

Vous ouvrez la voie à de nombreuses connexions, voie rapide ...

Quelques conseils:

  • Évitez les allers-retours en n'ouvrant pas une nouvelle connexion pour chaque commande et effectuez les insertions en utilisant une seule connexion.
  • Assurez-vous que le regroupement des connexions à la base de données fonctionne (vous ne savez pas si cela fonctionne avec les connexions OLEDB).
  • Envisagez d'utiliser un moyen plus optimisé pour insérer les données.

Avez-vous essayé cela?

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}

Autres conseils

J'ai testé ce code avec une base de données Access 2007 sans exception (j'ai atteint 13 000 insertions).

Cependant, ce que j’ai remarqué, c’est terriblement lent, car vous créez une connexion à chaque fois. Si vous mettez le mot-clé "using (connection)" en dehors de la boucle, ça va beaucoup plus vite.

En plus de ce qui précède (connexion à la base de données une seule fois), je souhaite également m'assurer que vous fermez et supprimez vos connexions. Comme la plupart des objets de c # sont gérés par la mémoire, les connexions et les flux n’ont pas toujours ce luxe. Par conséquent, si des objets comme celui-ci ne sont pas supprimés, leur nettoyage n’est pas garanti. Cela a pour effet supplémentaire de laisser cette connexion ouverte pendant toute la vie de votre programme.

De plus, si possible, je me pencherais sur l'utilisation de Transactions. Je ne peux pas dire pourquoi vous utilisez ce code, mais OleDbTransactions est utile lors de l'insertion et de la mise à jour de nombreuses lignes dans une base de données.

Je ne suis pas sûr des détails, mais j'ai rencontré un problème similaire. Nous utilisons une base de données Access avec IIS pour servir nos clients. Nous n’avons pas beaucoup de clients, mais beaucoup de connexions sont ouvertes et fermées au cours d’une même session. Après environ une semaine de travail, nous recevons la même erreur et toutes les tentatives de connexion échouent. Pour corriger le problème, tout ce que nous avions à faire était de redémarrer les processus de travail.

Après quelques recherches, j'ai constaté (bien sûr) qu'Access ne fonctionnait pas bien dans cet environnement. Les ressources ne sont pas libérées correctement et l'exécutable s'épuise avec le temps. Pour résoudre ce problème, nous allons passer à une base de données Oracle. Si cela ne résout pas le problème, je vous tiendrai au courant de mes conclusions.

Cela peut être dû au fait que vous ne supprimez pas les objets Connection et Command créés. Toujours disposer de l'objet à la fin.

OledbCommand.Dispose();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top