簡體   English   中英

准備好的語句對Java性能的影響

[英]prepared statement effect on performance in java

我知道,這個問題已經問過了。 但是我仍然不明白為什么我的prepare語句不影響執行時間。

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);
    }
}

首先,我嘗試使用此方法執行insert表達式,然后了解到prepare語句對執行時間有很好的影響。 然后我使用以下方法嘗試了該程序:

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();
    }
}

我正在使用sqlite數據庫btw.I使用executeBatch和addBatch方法來減少執行時間。 但這還是一樣,甚至比第一個還差。有人可以向我解釋嗎? 謝謝:)

嘗試如下切換到事務模式而不是自動提交模式:

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和開銷方面會帶來很大的成本,因此當您執行許多請求時,性能會很高,因為它將填充事務的日志。您的數據庫。

在這里更多細節

因此,使用預准備語句的主要優勢來自發生的預編譯。 如果該語句被多次使用,則可以節省執行時間。 如果只使用一次,則不會在代碼執行過程中節省大量時間。
使用Prepared語句的另一個優點是可以防止sql注入並且易於添加Objects

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM