我将创建将在数据库上运行的类.该类将具有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();
}
}
Run Code Online (Sandbox Code Playgroud)
要么
2)最好将一个连接作为一个memeber变量
class MyClass{
private Connection con;
public MyClass(){
con = DriverManager.getConnection (connectionURL);
}
}
Run Code Online (Sandbox Code Playgroud)
并为每个函数创建语句.
3)或别的......
axt*_*avt 11
两种方法都很糟糕.第一个不允许您实现正确的事务管理,因为您无法在同一事务中调用多个方法.后者需要不必要地创建多个对象.
最好的方法是引入当前连接的概念,这可以从某种事务上下文中获得.基本上,它应该是这样的:
beginTransaction(...); // Opens connection and starts transaction
readRecords(...); // Uses the current connection
addRecord(...);
...
commitTransaction(...); // Commits transaction and closes connection
Run Code Online (Sandbox Code Playgroud)
最简单但不是很优雅的实现是Connection
在调用方法(定义事务的边界)内部打开一个内部并将其作为参数传递给您的方法.
更复杂的解决方案是static ThreadLocal
为当前创建存储,在Connection
启动事务时将其放在那里并从方法中的存储中获取.一些框架隐式实现了这种方法,例如Spring Framework.
请注意,连接池与这些问题完全正交.
归档时间: |
|
查看次数: |
4575 次 |
最近记录: |