[Résolu][Base] erreur nullpointerexception sur INSERT INTO

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
partitionflorent
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 27 mars 2016 13:02

[Résolu][Base] erreur nullpointerexception sur INSERT INTO

Message par partitionflorent »

Bonjour,
J'ai une macro qui créé une base de données, et insère des milliers de données dans la base, en utilisant le code disponible dans les "suprêmes de codes". (statement.executeUpdate())
Les insertions se déroulent très bien, jusqu'à un certain moment où le programme plante avec un "com.sun.star.sdbc.SQLException
Message: java.io.IOException: java.lang.NullPointerException in statement [INSERT INTO ". Le plantage n'apparaît pas systématiquement sur la même ligne à insérer, ce n'est donc pas lié au contenu des données à insérer.
Le programme plante vers le 10 000 ème enregistrement, parfois il atteint le 12 000 ème.

J'ai l'impression que c'est un soucis de mémoire (plantage aléatoire au bout d'un certain temps d'éxecution), j'ai tenté d'augmenter la mémoire de la JRE, sans succès.
Afin de débogger je n'ai que le message "java.null.pointerException", il y a t'il une astuce pour obtenir d'avantage d'information sur l'origine de l'erreur ?
J'ai déjà essayé :
-d'utiliser des "preparedstatement" au lieu des "statements" pour améliorer les performances : sans effet
- de fermer la connection à la base au bout de 10 000 insert et de la rouvrir avant d'insérer les lignes suivantes : sans effet
Merci d'avance pour votre aide.
Libre office Version 4.3.7.2 (obligation de version) + windows 7 SP1
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Calc][Base] erreur nullpointerexception sur INSERT INTO

Message par Jurassic Pork »

hello,
quels types de données cherches-tu à importer ? y-a-t-il des données binaires du genre images , photos , sons , vidéos ? cela représente un volume d'environ combien de Mégaoctets ?

Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
partitionflorent
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 27 mars 2016 13:02

Re: [Calc][Base] erreur nullpointerexception sur INSERT INTO

Message par partitionflorent »

Bonjour,
Ce sont de simples varchar, j'ai même simplifié le code au point de créer une base avec 4 champs : un integer et 3 varchar(100).
Libre office Version 4.3.7.2 (obligation de version) + windows 7 SP1
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Calc][Base] erreur nullpointerexception sur INSERT INTO

Message par Jurassic Pork »

si ta base et tes données ne sont pas confidentielles pourraient - tu mettre en pièce jointe une petite partie de ton fichier calc et la base qui doit accueillir les données ?
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
partitionflorent
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 27 mars 2016 13:02

Re: [Calc][Base] erreur nullpointerexception sur INSERT INTO

Message par partitionflorent »

Je viens de créer une fonction spécifique pour recréer facilement le problème :
requete= "CREATE TABLE ""test"" ( ""ID"" INTEGER PRIMARY KEY,""test1"" VARCHAR(100),""test2"" VARCHAR(100),""test3"" VARCHAR(100))"
oRequete = oStatement.executeQuery( requete )
statement= oBase.PrepareStatement("INSERT INTO ""test"" (""ID"",""test1"",""test2"",""test3"") VALUES (?,?,?,?)")
i=1
Do

statement.setInt(1,i)
statement.setString(2,"test1")
statement.setString(3,"test2")
statement.setString(4,"test3")
statement.executeUpdate()
if i mod 100 = 0 Then
feuilleAccueil.getCellRangeByName("A2").setString(i)
End if
i=i+1

Loop until i>50000
Au bout de 10 000 enregistrements j'ai un plantage. Je ne comprends vraiment pas....
Libre office Version 4.3.7.2 (obligation de version) + windows 7 SP1
partitionflorent
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 27 mars 2016 13:02

Re: [Calc][Base] erreur nullpointerexception sur INSERT INTO

Message par partitionflorent »

Ci-joint un exemple plus précis :
Sub bug
On Error Goto erreurInsertion
feuilleAccueil = thisComponent.sheets().getByName("ACCUEIL")
Dim oDBContext As Object , oDB As Object , oBase As Object
Dim oStatement As Object , oRequete As Object
Fichier = ConvertToURL("C:\test.odb")
oDBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDB = oDBContext.getbyName(Fichier)
oBase = oDB.getConnection("","")
oStatement = oBase.createStatement()
oBase = oDB.getConnection("","")
strSQL= "DROP TABLE IF EXISTS ""test"" "
oRequete = oStatement.executeQuery( strSQL )
requete= "CREATE TABLE ""test"" ( ""ID"" INTEGER PRIMARY KEY,""test1"" VARCHAR(100),""test2"" VARCHAR(100),""test3"" VARCHAR(100))"
oRequete = oStatement.executeQuery( requete )
statement= oBase.PrepareStatement("INSERT INTO ""test"" (""ID"",""test1"",""test2"",""test3"") VALUES (?,?,?,?)")
i=1

Do

statement.setInt(1,i)
statement.setString(2,"test1")
statement.setString(3,"test2")
statement.setString(4,"test3")
statement.executeUpdate()
if i mod 100 = 0 Then
feuilleAccueil.getCellRangeByName("A2").setString(i)
End if
i=i+1

Loop until i>500000
oStatement.Close
oBase.Close
oBase.Dispose
erreurInsertion:
Msgbox "erreur :" & error
End sub
Ici, de nombreuses lignes sont créés avant un plantage (180 000 lignes environ), ce qui me laisse penser à un pb de mémoire, car sur ma base principale (qui contient bien plus de colonnes), le plantage a lieu au environ du 10 000 ème enregistrement.
Libre office Version 4.3.7.2 (obligation de version) + windows 7 SP1
partitionflorent
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 27 mars 2016 13:02

Re: [Calc][Base] erreur nullpointerexception sur INSERT INTO

Message par partitionflorent »

Je viens de tester une nouvelle version du code :
sql="INSERT INTO ""test"" (""ID"",""test1"",""test2"",""test3"") VALUES ('" & i & "','testt1','testtt2','testtt3')"
oStatement2.executeUpdate( sql )

Le problème est identique: plantage au bout de plusiers milliers d'enregistrements...
Libre office Version 4.3.7.2 (obligation de version) + windows 7 SP1
partitionflorent
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 27 mars 2016 13:02

Re: [Calc][Base] erreur nullpointerexception sur INSERT INTO

Message par partitionflorent »

Je viens de tester à nouveau, cette fois ci en recréant le statement à chaque insert :
oStatement2 = oBase.createStatement()
sql="INSERT INTO ""test"" (""ID"",""test1"",""test2"",""test3"") VALUES ('" & i & "','testt1','testtt2','testtt3')"
' msgbox sql
oStatement2.executeUpdate( sql )
oStatement2.Close
Type: com.sun.star.sdbc.SQLException
Le message d'erreur est plus clair :
Message: S1000 General error java.lang.NullPointerException.

Visiblement l'erreur S1000 correspond à :S1000 Data file size limit error
Libre office Version 4.3.7.2 (obligation de version) + windows 7 SP1
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc][Base] erreur nullpointerexception sur INSERT INTO

Message par Hubert Lambert »

Bonjour,

Peut-être cette section du guide de l'utilisateur HSQL pourra-t-elle t'éclairer : Utilisation de la mémoire et du disque
Cordialement.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12226
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: [Calc][Base] erreur nullpointerexception sur INSERT INTO

Message par Bidouille »

Merci de ne pas poster plusieurs messages à la suite !
Si vous devez ajouter un complément d'information, le bouton "Editer" à la droite du message permet d'y remédier.

Je ne comprends pas le double balisage.
Pour moi, le problème relève de Base uniquement.

Pour être aidé efficacement par les bénévoles et surtout leur faire gagner du temps, veuillez fournir un document explicatif intégrant cette macro.
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Base] erreur nullpointerexception sur INSERT INTO

Message par Jurassic Pork »

hello,
je ne pense pas que Base soit l'idéal pour traiter un gros volume de données. Le fait que la base de données soit intégrée à l'intérieur du fichier odb va un peu "plomber" le fichier qui va mettre du temps à s'ouvrir, à s'enregistrer et comme tu as pu le constater il semble y avoir des problèmes de mémoire. Il faudrait peut-être mieux se tourner vers une base de données externe (avec serveur) plus adaptée à un gros volume de données. Sinon il y a moyen de "brancher " un fichier csv dans base en passant par une table texte (voir ici)
Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25172
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] erreur nullpointerexception sur INSERT INTO

Message par Dude »

Jurassic Pork a écrit :je ne pense pas que Base soit l'idéal pour traiter un gros volume de données. [...] Il faudrait peut-être mieux se tourner vers une base de données externe (avec serveur) plus adaptée
Base peut tout à fait se connecter à une source externe avec par exemple, une connexion native à MySQL.
partitionflorent
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 27 mars 2016 13:02

Re: [Base] erreur nullpointerexception sur INSERT INTO

Message par partitionflorent »

Bonjour,
Il s'agissait effectivement d'une erreur de saturation mémoire, il est nécessaire de réaliser régulièrement des "shutdown compact" pour compacter la base de données.
Dorénavant j'ai donc intégré les lignes de code suivantes toutes les 100 insertions :
statement = oBase.createStatement()
sql="SHUTDOWN COMPACT"
'réduction de la base de données
statement.execute( sql )
statement.Close
oBase.Close
oBase.Dispose
'sauvegarde de la base de données
oDataSource.DatabaseDocument.store()
'réouverture de la bdd
oDBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource = oDBContext.getbyName("test")
oBase = oDataSource.getConnection("","")
Je n'ai plus de message d'erreur NullPointerException.
Par contre de temps en temps j'ai un message "Access Denied: session is closed", dans ce cas il est nécessaire de killer openoffice, puis de relancer le programme.
J'ai visiblement un problème avec les Close ou Dispose, je ne suis pas certain d'avoir tout compris... En tout cas mon principal problème est résolu, j'arrive dorénavant à créer mon fichier sans problème.
Libre office Version 4.3.7.2 (obligation de version) + windows 7 SP1
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Base] erreur nullpointerexception sur INSERT INTO

Message par Jurassic Pork »

hello,
Dude a écrit :
Jurassic Pork a écrit :je ne pense pas que Base soit l'idéal pour traiter un gros volume de données. [...] Il faudrait peut-être mieux se tourner vers une base de données externe (avec serveur) plus adaptée
Base peut tout à fait se connecter à une source externe avec par exemple, une connexion native à MySQL.
En fait je ne suis mal exprimé :oops: , je voulais dire par là que pour des gros volumes de données il est préférable de se connecter à un système de base de données plus adéquate (genre mysql, postgresql, sql server) plutôt qu'avec le système de base de données natif de 0.0 Base (hsqldb). Il est bien entendu que l'on peut faire cette connexion dans Base avec JDBC ou SDBC.
Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04