2011-05-29 60 views
6

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

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)最好是有一个连接可变

class MyClass{ 
    private Connection con; 

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

一个memeber并为每个函数创建只是声明。

3)或别的东西......

回答

6

如果经常定期JDBC调用,然后使用一个数据库connection pool

3

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

您可以使用tomcat或apache连接池类。 这些类是在包中定义的,例如

org.apache.commons.dbcp。*;

org.apache.tomcat.dbcp.dbcp。*;

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

11

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

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

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

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

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

的simpliest但不是很优雅的实现是打开Connection调用方法中(其中定义事务的边界),并把它传递给你的方法作为参数。

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

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

+0

+1我真的很好soln ...事实上,我们在很多地方使用它......但可能和OP的矫枉过正...但仍然可行 – 2011-05-30 03:50:52