准备好的语句对 java 中性能的影响
prepared statement effect on performance in 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);
}
}
首先,我尝试了这种方法来执行插入表达式,然后我了解到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 方法来减少执行时间。但它仍然是一样的,甚至比第一个更糟糕 one.Can 有人向我解释了吗?谢谢:)
所以使用准备好的语句的主要优势来自发生的预编译。如果语句被多次使用,这可以节省最多的执行时间。如果它只被使用一次,那么在代码执行期间不会节省太多时间。
使用准备语句的另一个优点是防止 sql 注入和易于添加 Objects
.
尝试切换到事务模式而不是自动提交模式,如下所示:
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
我知道,这个问题已经问过了。但是我仍然不明白为什么我的准备语句没有影响执行时间。
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);
}
}
首先,我尝试了这种方法来执行插入表达式,然后我了解到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 方法来减少执行时间。但它仍然是一样的,甚至比第一个更糟糕 one.Can 有人向我解释了吗?谢谢:)
所以使用准备好的语句的主要优势来自发生的预编译。如果语句被多次使用,这可以节省最多的执行时间。如果它只被使用一次,那么在代码执行期间不会节省太多时间。
使用准备语句的另一个优点是防止 sql 注入和易于添加 Objects
.
尝试切换到事务模式而不是自动提交模式,如下所示:
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