JDBC最佳实践

时间:2011-05-29 17:39:09

标签: java oop jdbc

我要创建将在数据库上运行的类。该类将具有addRecord(),getAllRecords()等函数。我正在寻找一种设计课程的好方法。我应该: 1)为每个功能创建新的连接。像这样:

void readRecords(){
    try {
        Connection con = DriverManager.getConnection (connectionURL);

        Statement stmt = con.createStatement();

        ResultSet rs = stmd.executeQuery("select moviename, releasedate from movies");

        while (rs.next())
            System.out.println("Name= " + rs.getString("moviename") + " Date= " + rs.getString("releasedate");
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        con.close();
    }
}

2)最好将一个连接作为一个memeber变量

class MyClass{
     private  Connection con;

     public MyClass(){
          con = DriverManager.getConnection (connectionURL);
     }
}

并为每个函数创建语句。

3)或其他什么......

3 个答案:

答案 0 :(得分:11)

这两种方法都很糟糕。第一个不允许您实现正确的事务管理,因为您无法在同一事务中调用多个方法。后者需要不必要地创建多个对象。

最好的方法是引入当前连接的概念,可以从某种事务上下文中获得。基本上,它应该是这样的:

beginTransaction(...); // Opens connection and starts transaction

readRecords(...); // Uses the current connection
addRecord(...);
...

commitTransaction(...); // Commits transaction and closes connection

最简单但不是很优雅的实现是在调用方法(定义事务的边界)中打开Connection并将其作为参数传递给方法。

更复杂的解决方案是为当前static ThreadLocal创建Connection存储,在启动事务时将其放在那里并从方法中的存储中获取。有些框架隐式实现了这种方法,例如Spring Framework

请注意,连接池与这些问题完全正交。

答案 1 :(得分:6)

如果经常进行常规jdbc调用,请使用数据库connection pool

答案 2 :(得分:3)

连接池是要走的路。最大的原因是,平均而言,数据库访问(DML等)所需的时间远远小于创建连接然后关闭连接所需的时间。此外,请不要忘记在事务完成后关闭ResultSet,PreparedStatement和Connection变量。

您可以使用tomcat或apache连接池类。 例如,在包

中定义了这些类

org.apache.commons.dbcp *;

org.apache.tomcat.dbcp.dbcp *;

其中dbcp代表数据库连接池。