gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:03:26 24 4
gpt4 key购买 nike

我有以下带有 2 个方法的查询类,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();
}
}

我将 Query1 类转换为下面的类,其中 insert() 方法使用的 PreparedStatement 在静态 block 中初始化,因为它经常被使用。

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

考虑到使用准备好的语句,这是否优化了代码,或者这不是一个好的做法?如果不是怎么办? (我是 JDBC 的初学者,还没有遇到过这样的代码示例。)

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

最佳答案

您的推理是正确的。频繁执行的查询可以从使用 PreparedStatement 中获益。确切的权衡在数据库之间会有所不同。您使用 javadb 标记,如果您使用它,则 PreparedStatements 永远不会变慢,因为常规语句会经历相同的编译过程。

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

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

关于java - 何时创建/初始化准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25532615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com