JDBC PreparedStatements vs Objects - 放置初始化的位置

时间:2011-09-23 12:37:05

标签: java jdbc

当我想将它用于给定类的所有实例时,放置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,还有其他方法吗?

2 个答案:

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

优点:

  • 多线程没有问题,因为线程之间不共享资源。
  • 所有数据库资源都捆绑在一个地方。这使得资源管理更容易,更一致。
  • 跟踪代码所涉及的资源的流程要容易得多,因为半全局变量不会产生任何副作用。