许多类引用数据库连接类的最佳方法

我很快将开始我的课程开发阶段,目前的设计是有一个处理数据库连接的类和许多调用它的类; 数据库类应该打开连接并盲目地传递查询,其他类负责这些查询的内容。

我想知道的是这些参考知道数据库类的最佳方法是什么? 我的直觉是使Database类中的方法静态并将它们称为Database.method()但是有更好的方法吗?

PS为此引用了正确的词? 如果不是什么是正确的词,那么下次我有类似的问题会有所帮助。

要小心。

单身人士将成为瓶颈。

java.sql.Connection不是线程安全的,所以你可能遇到问题。

我建议您将应用程序与服务和持久层完全分开。 两者都应该基于接口。 服务层是了解工作单元和事务单元的服务层,使用模型和持久性对象来实现它们。 该服务应负责获取Connection,使其可用于持久层,处理事务以及在创建它的同一方法范围内关闭Connection。

范围和清理是关键。 如果不这样做,您将耗尽数据库连接。

您没有提到连接池。 我推荐一个。

看看Spring吧。 它的JDBC模块可以很好地处理这一切。 如果你不能使用Spring作为你的任务,至少它将是如何设计你的实现的一个很好的模型。

传统方法是为每个数据类设置DAO(数据访问对象)。

即如果你有一个数据类“Person”,你也有一个类“PersonDAO”,它实现了像findById(),findAll(),save(Person)等方法。基本上DAO类处理所有数据库交互。

DAO类的构造函数可以简单地接受Connection对象,从而外化创建连接的问题,或者它可以调用一个发布Connection对象的工厂方法。

在任何一种情况下,您可能都希望拥有这样的工厂方法。

public class Database{ public static Connection getConnection(){ // Create a new connection or use some connection pooling library } } 

正如有人指出java.sql.Connection不是线程安全的,因此除非您确定多个线程不会访问该方法,否则每次都不应该分发相同的连接。

当然,如果您需要为每个调用创建一个新连接,您还需要在完成连接后关闭它们。 简单的方法是向DAO添加close()方法并让它们处理它。 这确实会对使用DAO的代码造成负担。

即使您使用连接池,仍然需要在完成连接后关闭连接(返回池)。

有人建议使用Thread local来建立每个线程的连接。 这在某些情况下有效,但对于每个请求都是新线程(永远不会重复使用,也可能不存储引用)的Web应用程序都没有用。

但是,如果您已经配置了它,那么您可以在webapp中利用它,以便在处理每个请求之后调用Database.closeConnection(),然后关闭Tread本地连接(如果存在)。

避免任何静电。 喜欢“从上面参数化” 。

所以你想要做的是在’main’附近创建你的数据库包装器对象。 然后将其作为构造函数参数传递给需要它的对象。

如果按照你的建议去,那么你将很难对你的课程进行unit testing。 一种方法可能是将数据库信息传递给进行查询的类,例如

 Query query = new GetPersonQuery(Database database); query.run(); // or whatever 

如果您使用DAO模式,这将特别有效,因此:

 PersonDao dao = new PersonDao(Database database); dao.findAll(); 

然后,数据库可以包装您需要的任何内容,例如连接池,缓存等。

如果要静态存储连接,至少使用线程本地。 但正如其他人在这里所说的那样 – 最好将连接或其包装器注入需要使用它的对象中。

Singleton模式将帮助您解决这个问题。 在这里查看更多关于它的信息。

这个模式(正确地)在这里很不受欢迎,因为它本质上是使一堆方法全局化,这在面向对象的世界中应该避免 – 但是对于课程作业和你想要实现的目标可能是最简单的。