繁体   English   中英

JDBC 最佳实践

[英]JDBC Best practice

我将创建将在数据库上运行的 class。 class 将具有 addRecord()、getAllRecords() 等函数。 我正在寻找一种设计 class 的好方法。 我是否必须:1)为每个 function 创建新的连接。 像这样:

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

并为每个 function 创建语句。

3) 或者别的什么...

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

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

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

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

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

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

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

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

如果有频繁的常规 jdbc 调用,则使用数据库连接池

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

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

org.apache.commons.dbcp.*;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM