准备好的语句对 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