Salut,
Je travaille actuellement sur un client java utilisant jdbc pour insérer un volume important de données dans une table Mysql.
Mon choix est d'insérer plusieurs lignes en meme temps en utilisant cette syntaxe : "INSERT INTO table (a,b) VALUES (1,2),(3,4),(5,6)..."
J'envoie donc à mysql des requetes insert volumineuses dont la taille dépasse parfois la limite par défaut de mysql nommée max_allowed_packet (= 1M).
J'ai donc tenté de modifier cette valeur uniquement pour la session en cours, juste avant d'envoyer ma grosse requete, mais il semble que cela n'a pas d'effet et que j'obtiens toujours le message d'erreur de mysql.
Voila mon code java :
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // increase max_allowed_packet to 8M Statement stmtSet = connection.createStatement(); stmtSet.execute("SET SESSION max_allowed_packet = 8 * 1024 * 1024;"); // check if value was changed Statement stmtShow = connection.createStatement(); ResultSet rs = stmtShow.executeQuery("SHOW SESSION VARIABLES like 'max_allowed_packet'"); rs.next(); System.out.println(rs.getString(1)+"="+rs.getString(2)); // try to execute the big insert Statement stmtInsert = connection.createStatement(); stmtInsert.executeUpdate(bigInsert));
Et ce qu'il affiche :
max_allowed_packet=8388608
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4796533 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2655)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1604)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3243)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1343)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1260)
Comme vous pouvez voir max_allowed_packet a bien été changé en 8M mais j'ai toujours l'erreur PacketTooBigException, bien que mon INSERT ne fasse que 4M.
Et pourtant tous les Statement ci-dessus sont bien exécutés dans la meme session mysql (ou plutot la meme java.sql.Connection).
Si quelqu'un a une idée de ce qui cloche, ce serait grandement apprécié !
Merci bcp !
Partager