当我想将它用于给定类的所有实例时,放置PreparedStatement初始化的最佳位置是什么?
到目前为止,我的解决方案是创建打开和关闭的静态方法,但我觉得这不是一个正确的选择:
class Person {
protected static PreparedStatement stmt1;
protected static PreparedStatement stmt2;
protected static void initStatements(Connection conn) {
stmt1 = conn.PrepareStatement("select job_id from persons where person_id=:person_id");
stmt2 = conn.PrepareStatement("update persons set job_id=:job_id where person_id=:person_id");
}
protected static void closeStatements() {
stmt1.close();
stmt2.close();
}
public void increaseSalary() {
stmt1.execute(); // just a example
stmt2.execute();
}
}
void main {
// create prepared statements
Person.initStatements(conn);
// for each person, increase do some action which require sql connection
for (Person p : getAllPersons()) {
p.increaseSalary();
}
// close statements
Person.closeStatements();
}
如果在多个类实例中使用PreparedStatements,还有其他方法吗?
答案 0 :(得分:2)
人是你的域逻辑类吗?然后我建议不要将数据访问方法和PreparedStatements放在那里,而是放在一个单独的数据访问对象中。
是否可以异步调用DAO方法,例如在Web应用程序中?然后我建议不要在这些调用之间重复使用PreparedStatements或Connections。对于Connections,我使用连接池。 有关重用PreparedStatements的更多信息: Reusing a PreparedStatement multiple times
答案 1 :(得分:0)
通常最好使用 ConnectionSurvivalPack 并将其提供给所有相关人员:
Class SurvivalPack {
private Connection connection;
private PreparedStatement st1;
// add constructor and appropriate getter/setter
// getter for PreparedStatements could create statements on demand
void close(){
st1.close();
con.close();
}
}
void main(...){
SurvivalPack survivalPack = new SurvivalPack(conn);
for(Person p: getAllPersons()){
p.increaseSalary(survivalPack);
}
survivalPack.close();
}
优点: