[英]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.