Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Comment peut on expliquer que PB plante lamentablement (en version 8.03)sur le Destroy d'une datastore, alors que celle ci est bien Valid.
A noter que cela se produit dans un "batch" qui tourne tous les jours, mais le problème ne se produit pas heureusement pas tous les jours.
Hors ligne
c'est une variable d'instance ou locale ?
si variable d'instance, tu la detruis à l'évenement close de ta fenetre ?
bref...tout cela est lié avec la gestion de buffer memoire...
Hors ligne
c'est une variable locale, et le pire c'est que si on supprime le destroy, pb détruit l'objet à la fermeture de l'appli en "automatique", mais dans ce cas le batch plante également...effectivement ça ressemble plus à de la gestion mémoire du pc et pourtant, on a rajouté de la mémoire....
Hors ligne
mets la en variable d'instance
tu la crées à l'open de la fenetre
et tu la detruis à l'évenement Close de la fenetre...
tu nous diras s'il y a un changement...
Hors ligne
est-ce que ton datastore est basé sur une datawindow avec l'option rowasneeded ?
hypothèse : tu fais le destroy mais il n'a pas fini de récupérer les résultats, ou encore sur destroy il finit
de récupérer les résultats, s'il y en a trop, out of memory ...
Hors ligne
non la datawindow n'a pas l'option row as needed, et le retrieve est terminé depuis un certain temps lorsque le destroy est executé, et plusieurs traitements ont été fait à partir de la datastore après le retrieve, et puisque le batch s'execute tous les jours, ce n'est pas forcément les jours ou la datastore contient le plus d'enregistrement que cela plante, mais cela ressemble effectivement à un out of memory.
Je vais essayer la méthode de notre ami Pick Ouic en mettant la datastore en variable d'instance, je vous tiendrais au courant.
Hors ligne
bon, mauvaise nouvelle, j'ai mis la datastore en instance , le premier jour pas de problème et cette nuit, même symptome, le destroy n'a pu se faire. Cela n'est pas forcément un problème de volume de données dans la datastore, puisqu'il y a des jour ou ça ne plante pas et il y a plus d'enregistrements. Mystère Mystère.....
Hors ligne
il y a quoi d'autres comme objets ? en dehors de la datastore ?
il y a peut etre une succession d'objets et cie qui declenchent tout ca...
il y a moyen de voir les scripts de ton batch pb ?
Hors ligne
Le batch est une petite appli qui lance une fenetre, et tout le script est fait dans la fenetre. sur le principe c'est historique pour cette appli.
La datastore est mise en variable d'instance dans la fenetre et le destroy est fait dans le close de la fenetre. avec le code suivant :
Le code suivant se trouve dans l'évènement Open de la fenetre
Une petite idée ??
Hors ligne
datastore lds_controle_client , lds_controle_agence
ces deux datastores sont encore locales... peut-être que :
pick ouic a écrit:
mets la en variable d'instance
tu la crées à l'open de la fenetre
et tu la detruis à l'évenement Close de la fenetre...
cela dit j'utilise généralement les datastores en local et ça ne pose pas de problème... à voir
Hors ligne
mais le destroy sur ces 2 datastores ne pose pas de problème. et l'autre datastore était en local avant.
Mais effectivement, nous avons de nombreuses datastore en local qui ne posent aucun problème.
Mystère, mystère.
Hors ligne
passes les tous en variables d'instances...
et tu fais la meme chose que pour l'autre datastore...
je me demande s'il y a pas un lien aussi avec le timing... le fait que ca aille trop vite peut etre ?
Hors ligne
c'est quoi qui va trop vite, le destroy ?? , je peux mettre une pause juste avant sinon....
Hors ligne
essayes de mettre un timer entre chaque requete... et avant le destroy...si tu laisses tout ca en locale...
Hors ligne
Tu parles de la fonction timer ??? ou sleep ????
Sleep je sais bien ce que ça fait , timer j'ai jamais utilisé....
Hors ligne
moi, un truc m'étonnes,
tu fais dans le script un close, sans faire de return ...
est-ce qu'il ne faudrait pas rajouter un return par hasard ???
Hors ligne
et sinon c'est vraiment absolument necessaire de faire un destroy ?
Y a un garbage collector dans PB qui devrait s'en charger tout seul à terme et qui le fera peut etre sans problemes.
Hors ligne
il me semble qu'il y a des soucis avec le garbage collector et les datastore, je crois qu'il gère mal et les laisse en mémoire :x
Hors ligne
Bonjour,
Voici les infos du jour après une nouvelle execution du batch cette nuit.
J'ai laissé la datastore en instance et j'ai ajouté la commande sleep avant le destroy.
Mauvaise nouvelle, le Sleep n'arrange pas mes problèmes. J'ai mis un Sleep(120), pour faire une pause de 2 minutes, mais le résultat est identique, le destroy plante lamentablement.
Quand au close, il est présent dans la fenêtre afin de fermer la fenetre si le retrieve ne se passe pas correctement, l'execution du batch ne passe donc que très rarement par là.
Et si on ne fait pas le destoy manuellement, lorsque le batch se termine, il fait également Docteur Watson donc la même erreur que lors du destroy en manuel.
Hors ligne
oui, mais apres un close, il faut toujours mettre un Return...surtout quand il y a des scripts apres...
tu l'as placé ou les Sleep ?
Hors ligne
ha désolée pour le close, je vais ajouté le return.
voici ou j'ai mis le sleep
If IsValid(Ids_factures) then
Sleep (120)
DESTROY Ids_factures
invo_batchs.nvuf_ecriture_batchlog("Destroy de lds_facture effectué.")
end if
Hors ligne
t'as mis des sleeps sur les autres destroy ?
Hors ligne
ben non, j'en ai ajouté uniquement un a cet endroit.
Hors ligne
avant de faire le destroy, essaie de faire un dw.reset()
Hors ligne