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

时间:2009-03-12 12:34:09

标签: java database oop

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

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

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

6 个答案:

答案 0 :(得分:7)

要小心。

Singleton将成为瓶颈。

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

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

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

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

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

答案 1 :(得分:4)

传统的方法是为每个数据类设置一个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本地连接(如果存在)。 / p>

答案 2 :(得分:1)

避免任何静电。首选"Parameterisation from Above"

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

答案 3 :(得分:0)

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

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

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

Singleton pattern会帮助你解决这个问题。请在此处查看more info

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

相关问题