如何使用数据访问对象进行序列化和关系数据库数据访问

问题描述:

我正在开发一个C++域模型类库,它应该提供一些工具或框架(即接口类等),用于将类实例数据写入/读取一个二进制文件和一个RDBMS。该库的基础是一个使用RDBMS的应用程序,并且有几种方法通过执行一系列数据库检索和更新调用以获取成员数据集合来实例化类。序列化数据访问具有不同的数据组织方式,所以我希望域模型完全不知道主键/外键,ID等。如何使用数据访问对象进行序列化和关系数据库数据访问

要解决此问题,我考虑使用Data Access Object(DAO)模式,并希望对DAO对象的“粒度”,生命周期和使用有一些建议(在您的回复中,请注意,我将使用C++而不是Java,并且域类不能包含任何ID /密钥信息从RDBMS或二进制文件存储):

  1. 是否域对象的每个实例美孚拥有自己的FooDAO实例,或者是有Foo类的所有实例的单个实例FooDAO?
  2. FooDAO是否为每个Foo实例创建一次,还是仅在需要访问数据时创建FooDAO实例,并在之后立即销毁?
  3. DAO上的J2EE页面除DAO外还引入了DTO。为什么DAO不能传输数据?
  4. 对于具有其他域类Bar实例的复杂域类Foo,FooDAO类使用BarDAO类检索数据似乎是不可避免的。这将导致域类结构和DAO类结构中的并行层次结构/依赖关系。这怎么能最好地管理?

感谢您的帮助!

我没有一个很好的解决方案,但我可以告诉你我有什么,以及一些想法和经验。基于我之前看到过的模型,我构建了一个非常相似的东西,就像一个C++库。

一些想法,没有特定的顺序:

  • 有在DB每个实例DAO对象的一个​​单独的实例。如果你有一个共享实例,线程同步可能是一个问题,你将*做很多副本。
  • 由于几个原因,我的库DAO类使用与RDBMS类型紧密关联的类型。首先,库支持在底层数据存储中自动创建和更新存储,所以这些类需要有足够的信息来创建表。其次,它使数据转换变得更容易,并且可以优化(例如,可以使用本机接口直接执行ODBC/OLEDB数据副本)。缺点是你不能在DAO对象中有很好的类类型(例如:比实际字符串缓冲区更多数据的字符串抽象)。
  • 我按需创建,当然,因为商店中的潜在数据可能比存储在内存中的实际数据多得多。
  • 我尝试保持DAO类简单,具有最少的访问器功能,并“关闭”底层数据结构。这意味着没有其他的DAO类继承,实例具有关键变量成员等

在DAO类我建立更方便类代表我的应用程序中的数据的顶部,可能会或可能不会映射1 1到DAO类。这些被允许具有任何类型的成员和结构,应该是应用程序使用的,并且具有将数据复制到DAO类中或从DAO类复制数据的方法。

希望有所帮助。

我不知道什么是最好的实现,但这里是我见过的做:

  1. 单独为每个实例。
  2. 在需要之前创建并在之后立即销毁。
  3. 不知道。
  4. 将数据合并到DAO实例之外,从而避免耦合。

声明:这正是我见过的。