java - Multipile mise à jour des déclarations dans MySql
donc, j'ai un logiciel qui, en gros, les téléchargements de 1,5 K jeu d'adresse de serveur à partir de ma base MySQL. Il connecte ensuite à chacun d'eux et ensuite télécharger de l'information, telle que les joueurs en ligne à la base de données. Le processus ressemble à ceci:
- Serveur de téléchargement à l'adresse
- Ping sur les serveurs et d'obtenir des informations
- Télécharger des informations à la base de données
Jusqu'à présent j'ai été en mesure de résoudre la partie où il téléchargez le nom d'hôte du serveur et les pings, mais le problème se pose lors de la mise à jour des serveurs.
À la mise à jour j'ai pensé à utiliser une boucle for pour construire une GRANDE chaîne de mise à jour de nombreux états et de l'exécuter à la fois, mais c'est sujette à des injections sql. Donc, idéalement, on pourrait utiliser les requêtes préparées.
L'instruction SQL update que j'utilise est:
UPDATE serverlist SET `onlineplayers` = '3', maxplayers = '10',
name = 'A game server' WHERE `ip` = 'xxx.xxx.xxx.xxx' AND `port` = 1234;
Donc ma question est:
Comment puis-je exécuter tous les 1.5 K les mises à jour des déclarations utilisation de requêtes paramétrées?
Vous devez vous connecter pour publier un commentaire.
Si vous faites une recherche google pour "jdbc mise à jour en bloc", vous obtiendrez beaucoup de résultats comme celui-ci ou cette une.
Ce dernier a un exemple comme ceci:
Dirait que vous voulez faire un batch de mise à jour SQL. Les requêtes préparées sont à votre ami. Voici un exemple d'utilisation de déclarations préparées à l'avance dans le lot:
http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/
À l'aide de déclarations préparées à l'avance, le réglage des paramètres plus facile et permet à la DB pour acquitter efficacement de multiples mises à jour. L'exécution de plusieurs chaînes SQL pourrait fonctionner, mais serait inefficace puisque chaque chaîne SQL serait envoyé au SGBD, analysé, compilé puis exécuté. Préparées avec les instructions SQL est analysé et compilé une seule fois, puis réutilisés pour de futures mises à jour avec des paramètres différents.
Une autre étape importante que vous devez savoir à propos de cours de MySQL mise à jour par lot /insert de Connexion JDBC biens rewriteBatchedStatements=true ( false par défaut ). Sans elle, le mode batch est inutile.
Il m'a coûté 1 jour à "correction d'un bug" jusqu'à ce que j'ai découvert cette.
Lorsque vous avez un petit nombre de lignes et de proximité client-à-DB emplacement ( 1 ms de ping ) , vous pouvez même pas réaliser que vous dans les "faux mode batch" , mais lorsque je change l'environnement de client à distance ( ping=100ms ) et 100k lignes de mise à jour , il faudra 4 heures de "mode batch de mise à jour" par défaut rewriteBatchedStatements=false et seulement 2minutes avec rewriteBatchedStatements=true
Création d'une requête préparée:
Ensuite en boucle par le biais de votre liste, et à chaque itération, ne
Pour de meilleures performances, vous pouvez aussi utiliser des mises à jour par lot.
Lire la JDBC tutoriel.