2016-08-04 1 views
0

私は知っています、この質問は既に尋ねられています。しかし、私はまだ準備の声明が実行時間に影響を与えなかった理由を知りませんでした。は、Javaのパフォーマンスに関する文の効果を準備しました

Connection conn=null; 
Statement stmt=null; 

public Database(){ 
    try { 
     Class.forName("org.sqlite.JDBC"); 
     conn = DriverManager 
       .getConnection("jdbc:sqlite:***"); 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

public void insert(String [] data){ 
    try { 
     String query = "INSERT INTO tableName " 
       + "VALUES ('"+data[0]+"',"+"'"+data[1]+"',"+Double.parseDouble(data[2])+","+ 
       Double.parseDouble(data[3])+","+Double.parseDouble(data[4])+","+ 
       Double.parseDouble(data[5])+")"; 

     stmt =conn.createStatement(); 
     stmt.executeUpdate(query); 

    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

まず、このメソッドを挿入式を実行しようとしました。次に、準備文が実行時間に良い影響を与えることを学びました。それから私は、法の下に使用してプログラムを試してみました:

Connection conn=null; 
PreparedStatement preStmt=null; 
private String queryTemplate = "insert into tableName values(?,?,?,?,?,?)"; 

public Database(){ 
    try { 
     Class.forName("org.sqlite.JDBC"); 
     conn = DriverManager 
       .getConnection("jdbc:sqlite:***"); 
     preStmt = conn.prepareStatement(queryTemplate); 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

public void insert(String [] data){ 
    try { 
     preStmt.setString(1,data[0]); 
     preStmt.setString(2,data[1]); 
     preStmt.setDouble(3,Double.parseDouble(data[2])); 
     preStmt.setDouble(4,Double.parseDouble(data[3])); 
     preStmt.setDouble(5,Double.parseDouble(data[4])); 
     preStmt.setDouble(6,Double.parseDouble(data[5])); 

     preStmt.addBatch(); 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
} 

public void ExecuteBatch() 
{ 
    try { 
     preStmt.executeBatch(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

私はbtw.Iは、実行時間を短縮することがexecuteBatchとaddBatchメソッドを使用したSQLiteデータベースを使用しています。しかし、それはまだ、最初のものより悪いです。誰かが私にそれを説明することができますか?ありがとう:)

+1

[あなたがStatementオブジェクトを実行したい場合は**何度**、それは通常の代わりにPreparedStatementオブジェクトを使用するために実行時間を短縮](http://docs.oracle.com/javase /tutorial/jdbc/basics/prepared.html)。 –

答えて

1

次のようモードをコミットする代わりに、自動でトランザクション・モードで切り替えるようにしてください:

conn = DriverManager.getConnection("jdbc:sqlite:***"); 
// Set auto-commit to false which enable the transactional mode 
conn.setAutoCommit(false); 
... 
// Explicitly commit statements to apply changes 
conn.commit(); 

実際に自動コミットモード専用のトランザクションであなたの挿入要求のそれぞれを実行すると、大きなコストを有し、それを自動的にコミットしますデータベースのトランザクションログをいっぱいにするので、実行するリクエストが多い場合はI/Oとパフォーマンスの面で問題があります。

詳細here

+0

それは完全に動作します、私はデータベースボタンを押した瞬間、プログラムはあなたのファイルがロードされていると言いました。どうもありがとうございます :) –

0

したがって、プリコンパイルされたステートメントを使用する主な利点は、発生するプリコンパイルから来ています。ステートメントが複数回使用されている場合は、実行時に最も多くの時間を節約できます。それが一度だけ使用されていると、コード実行中に時間を節約できません。
準備された文を使用することの他の利点は、SQLインジェクションの防止とObjectsの追加の容易さです。

関連する問題