Java 何时创建/初始化准备好的语句

Java 何时创建/初始化准备好的语句,java,jdbc,javadb,Java,Jdbc,Javadb,我有两个方法的查询类,insert()方法经常使用,而deleteRecord()不经常使用 public class Query1 { private final static String INSERT = "insert into info values (?, current_timestamp)"; private final static String DELETE_RECORD = "delete from info where stamp = ?"; private stat

我有两个方法的查询类,
insert()
方法经常使用,而
deleteRecord()
不经常使用

public class Query1 {

private final static String INSERT = "insert into info values (?, current_timestamp)";
private final static String DELETE_RECORD = "delete from info where stamp = ?";

private static final Connection con = DatabaseConnection.getInstance();

//This method is used frequently
public static void insert(List<String> numList) throws SQLException {
    try (PreparedStatement st_insert = con.prepareStatement(INSERT)) {
        for (int i = 0; i < numList.size(); i++) {
            st_insert.setString(1, numList.get(i));
            st_insert.addBatch();
        }
        st_insert.executeBatch();
    }
}

// This method is NOT used frequently
public static void deleteRecord(Timestamp stamp) throws SQLException {
    try (PreparedStatement st = con.prepareStatement(DELETE_RECORD)) {
        st.setTimestamp(1, stamp);
        st.execute();
    }
}
考虑到使用准备好的语句,这会优化代码吗?还是这不是一个好的做法?如果没有,怎么做?(我是JDBC的初学者,没有遇到过这样的代码示例。)


如果您有任何建议,我们将不胜感激。

您的推理是正确的。频繁执行的查询可以从使用PreparedStatement中获益。DBs之间的具体权衡将有所不同。您使用javadb进行了标记,如果这就是您使用的PreparedStatements,那么它将永远不会变慢,因为常规语句将经历相同的编译过程

也就是说,我同意那些建议不要在静态块中准备声明的人。 我通常尝试在构造函数或init方法中准备语句,以便在频繁调用的方法中重用ps


还要注意的是,即使是ps也可以“在背后”重新编译,因为更改可能会影响查询必须/应该如何执行(添加索引、更改统计信息、更改权限等)

可能取决于调用方法的频率,但我建议坚持使用前者,以便定期保证资源得到清理。在后一种(静态)方法中,您无法清理资源。这两种情况都不能处理连接更新,但这将是使用前者的另一个原因,因此您可以更好地处理其他数据库问题。从本书中,我认为PreparedStatement(如果您不在许多语句中重用它)实际上比常规语句慢一点。当然,PreparedStatement是避免SQL注入的好方法。
public class Query2 {
private final static String INSERT = "insert into info values (?, current_timestamp)";
private final static String DELETE_RECORD = "delete from info where stamp = ?";

private static final Connection con = DatabaseConnection.getInstance();

// Frequently used statements
private static PreparedStatement st_insert;
static {
    try {
        st_insert = con.prepareStatement(INSERT);
    } catch (SQLException ex) {            
    }
}

//This method is used frequently
public static void insert(List<String> numList) throws SQLException {        
    for (int i = 0; i < numList.size(); i++) {
        st_insert.setString(1, numList.get(i));            
        st_insert.addBatch();
    }
    st_insert.executeBatch();
}

// This method is NOT used frequently
public static void deleteRecord(Timestamp stamp) throws SQLException {
    try (PreparedStatement st = con.prepareStatement(DELETE_RECORD)) {
        st.setTimestamp(1, stamp);
        st.execute();
    }
}