2017-09-05 11 views
-3

J'ai créé un programme en Java pour entrer 1000 nombres aléatoires dans deux bases de données différentes une pour les nombres impairs et une pour les nombres pairs. Le code s'exécute correctement mais il faut près d'une minute pour s'exécuter. Comment puis-je minimiser le temps d'exécution?comment minimiser le temps d'exécution d'un programme Java?

Voici le code:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.util.Random; 

public class Test1 extends Thread { 

public static void main(String[] args) throws ClassNotFoundException, SQLException { 
    long start = System.currentTimeMillis(); 

    int evencount = 0; 
    int oddcount = 0; 
    int breakcon = 0; 
    int breakcon1 = 0; 

    Class.forName("com.mysql.jdbc.Driver"); 
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1" + "?useSSL=false", "root", 
      "1234"); 
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2" + "?useSSL=false", "root", 
      "1234"); 

    try { 

     Class.forName("com.mysql.jdbc.Driver"); 

     for (int n = 1; n <= 1000; n++) { 
      Random r = new Random(); 
      int val = r.nextInt(100000); 

      if (val % 2 == 0) { 
       PreparedStatement ps = con.prepareStatement(" insert into try values (?)"); 
       ps.setInt(1, val); 
       ps.executeUpdate(); 
       ps.addBatch(); 
       breakcon = breakcon + 1; 
       if (breakcon % 500 == 0 || breakcon == val) 
        ps.executeBatch(); 
       evencount++; 

      } else { 
       try { 

        Class.forName("com.mysql.jdbc.Driver"); 
        PreparedStatement ps3 = conn.prepareStatement(" insert into try1 values (?)"); 
        ps3.setInt(1, val); 
        ps3.executeUpdate(); 
        ps3.addBatch(); 
        breakcon1 = breakcon1 + 1; 
        if (breakcon1 % 500 == 0 || breakcon1 == val) 
         ps3.executeBatch(); 

        oddcount++; 

       } 

       catch (Exception e2) { 
        System.out.println(e2); 
       } 
      } 
     } 

    } 

    catch (Exception e) { 
     System.out.println(e); 
    } 

    long end = System.currentTimeMillis(); 
    NumberFormat formatter = new DecimalFormat("#0.00000"); 
    System.out.println("Execution time is " + formatter.format((end - start)/1000d) + " seconds"); 
    System.out.println(oddcount + evencount); 

} 
} 
+0

Je voudrais regarder SQL batching. –

+0

@JoeC comment devrais-je faire cela? S'il vous plaît expliquer – sujitha

+1

Ces genre de questions est mieux demande à [codereview.SE]. Parce qu'il s'agit d'améliorer le code de fonctionnement – Jens

Répondre

2

Au lieu d'appeler ps.executeUpdate(); (et ps3.executeUpdate();) après chaque fois que vous setInt - le faire qu'une seule fois après la boucle for. C'est tout l'intérêt d'utiliser addBatch (agréger les insertions/mises à jour et les exécuter toutes en même temps).

Comme Boris mentionné dans le commentaire ci-dessous, il rendrait l'exécution beaucoup plus rapide si vous activez également rewriteBatchedStatements. Voir here comment cela peut être réalisé.

+2

Je suppose que l'activation de 'rewriteBatchedStatements' aiderait aussi? –

+0

@BoristheSpider bon point, merci! – alfasin