IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

insertion trop longues => transaction rollback !


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut insertion trop longues => transaction rollback !
    Bonjour,
    je travaille avec VS2005, et les Enterprise Library 3.1.
    Je cherche à effectuer une transaction qui comporte plusieurs insertions en base spatiale.
    Tout se passe généralement bien... sauf pour certaines insertions, qui se révèlent être plutôt longue.
    Les insertions sont du type Insert into table select ...

    Ces insertions mettent environs 15 minutes à s'effectuer avec Toad, mais mettent plus d'une heure à s'effectuer par code.

    Le problème du temps d'exécution n'en serait pas un si la transaction allait jusqu'au bout, mais malheureusement ce n'est pas le cas : au bout de 40 mn environ (c'est variable), la commande lève une exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    System.Data.OracleClient.OracleConnection.GetOpenInternalConnection()
       à System.Data.OracleClient.OracleConnection.get_ErrorHandle()
       à System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
       à System.Data.OracleClient.OracleCommand.ExecuteNonQuery()
       à Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteNonQuery(DbCommand command)
       à Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DbCommand command)
    C'est assez incompréhensible, mis à part le temps d'exécution :
    - ma transaction est réglée sur 2 h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                    Dim options As New Transactions.TransactionOptions()
     
                    options.Timeout = New TimeSpan(2, 0, 0)
                    Dim transaction As New Transactions.TransactionScope(Transactions.TransactionScopeOption.Required, options)
                    Using transaction
    - J'ai essayé de mettre un timeout sur l'exécution de la commande sans succès...
    - j'ai essayé de modifier les enterprise library en utilisant le provider ODP, mais sans résultat, je n'arrive pas à compiler la solution... (problème sur le OracleClientFactory)

    avez-vous déjà été confronté à ce genre de problème ?
    puis-je selon vous encore caresser l'espoir de trouver une solution ??

    Merci de votre aide !

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Par défaut
    Citation Envoyé par RealDarren Voir le message

    Ces insertions mettent environs 15 minutes à s'effectuer avec Toad, mais mettent plus d'une heure à s'effectuer par code.
    Déjà là, je trouve la différence suspecte...

    Est-ce que tu pourrais détailler un peu plus les requêtes que tu envois et montrer le code des méthodes que tu utilises pour lancer ta transaction ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut
    bon je peux pas tout détailler, mais grossomodo, le code se structure de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Try
      Dim options As New Transactions.TransactionOptions()
      options.Timeout = New TimeSpan(2, 0, 0)
      Dim transaction As New Transactions.TransactionScope(Transactions.TransactionScopeOption.Required, options)
      Using transaction
        'il y a différent appel de fonctions qui récupère des requêtes différentes à exéctuer, mais le code donne ça au final pour chaque requête :
        Dim db As Database = DatabaseFactory.CreateDatabase
        Dim strSQL As String
        strSQL = SqlQuery.GetInsertMasse()
        Using cmd As DbCommand = db.GetSqlStringCommand(strSQL)
          'cmd.CommandTimeout = 3600 => ne m'a rien donné comme résultat...
          nb = db.ExecuteNonQuery(cmd)
        End Using
     
      End Using
    Catch ex As Exception
      (...)
    End Try
    les requêtes envoyées vers Oracle sont du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    insert into TCOBJETZONEGEO ( IDOBJET, IDZONEGEO, PCENTAPPARTENANCE, DTTCOBJETZONEGEO, IDREFTYPEINTERSECTION) 
    select  IDOBJET, '710001', PCENTAPPARTENANCE, SYSDATE, '0' 
    From 
    ( 
      SELECT OBJ.IDOBJET, SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(OG.geometry, ZG.geometry, 0.0000001), 0.00001) /  OBJZG.SURFACE AS PCENTAPPARTENANCE 
      From GEOZG_LT ZG INNER JOIN OBJET OBJZG ON OBJZG.IDOBJET = ZG.IDSIG, 
      GEOOBJ_LT OG INNER JOIN OBJET OBJ ON OBJ.IDOBJET = OG.IDSIG INNER JOIN LOCAL LOC ON LOC.IDLOCAL = OBJ.IDOBJET INNER JOIN NIVEAU NIV ON NIV.IDNIVEAU = LOC.IDNIVEAU and (NIV.IXDEPARTEMENT LIKE '.%.710001.%.' OR NIV.IXDEPARTEMENT LIKE '.%.710001.' OR NIV.IXDEPARTEMENT LIKE '.710001.%.') 
      WHERE SDO_RELATE(OG.GEOMETRY, ZG.GEOMETRY, 'mask=anyinteract querytype=WINDOW') = 'TRUE' AND ZG.IDSIG = '710001'
    )
    WHERE PCENTAPPARTENANCE <> 0
    Les tables GEOZG_LT et GEOOBJ_LT sont des tables spatiales.
    Je sais que la requête n'est pas simple, mais c'est celle qui me donne le meilleur temps d'exécution dans TOAD.
    Peut-être qu'il faut changer la logique de la requête ? Mais pour suivre quelle logique ?? mystère !
    Je me demande s'il faut pas que je passe par une procédure stockée, mais avec les EntLib, est-ce que je vais pas avoir d'autres problèmes ??

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Par défaut
    A première vue je pense que pour des requêtes aussi longues il vaudrait mieux passer par une procédure stockées, mais attendons pour voir...

    Quel est l'environnement ? Winforms ou asp.net ?
    De plus, quelle est l'erreur exacte renvoyée ? Tu nous a mis le stacktrace mais pas le type d'erreur...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    A première vue je pense que pour des requêtes aussi longues il vaudrait mieux passer par une procédure stockées, mais attendons pour voir...
    j'ai un peu peur de m'y lancer justement, je sais pas trop faire pour l'instant, donc attendons un peu, je suis d'accord !

    Citation Envoyé par Keihilin Voir le message
    Quel est l'environnement ? Winforms ou asp.net ?
    J'utilise un framework utilisé par les 2
    En fait, à la base, il y a un site web, et là, c'est un petit utilitaire qui fait du calcul la nuit (et qui utilise le même framework)

    Citation Envoyé par Keihilin Voir le message
    De plus, quelle est l'erreur exacte renvoyée ? Tu nous a mis le stacktrace mais pas le type d'erreur...
    l'erreur que j'ai c'est : Opération non valide. La connexion est fermée.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Par défaut
    Bon, j'ai réussi à résoudre mon problème en enlevant le "EnList=True" dans ma chaine de connexion et en le passant à False.
    Je comprends pas très bien pourquoi ça pose problème...
    Si quelqu'un a une idée ??

Discussions similaires

  1. [VB.net]Requete Insert trop longue?
    Par Hakki dans le forum Accès aux données
    Réponses: 7
    Dernier message: 24/10/2006, 10h06
  2. Insertion trop longue
    Par annalady dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/09/2006, 11h03
  3. Erreur ORA-01704 : constante de chaine trop longue
    Par verrec_s dans le forum Oracle
    Réponses: 22
    Dernier message: 13/12/2004, 15h30
  4. [TP]Probleme de ligne trop longue
    Par poppels dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 24/09/2004, 06h36
  5. chaine trop longue pour envoyer en socket?
    Par jeje.r dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/06/2003, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo