两个应用程序(A和B)使用hibernate从数据库中检索相同的实体。是应该在每个应用程序中实例化DAO还是应该有一个单独的应用程序(C)包含唯一的DAO实例并公开服务(例如RMI)以供A和B使用?
如果后一种情况属实,那么防止加载异常的常见做法是什么?我认为我的计划目前是使用RMI并为每个域对象创建一个DTO。我唯一的保留是A和B中的实体将无法引用C中的实体。这是一种常见的策略吗?
可能值得一提的是有4个不同的服务器,每个服务器运行A和B.目前每个服务器上都有数据库 - 这个问题是因为我试图集中某些东西 - 要么所有项目都有DAO指向单个数据库服务器或所有应用程序指向由C托管的服务,该服务具有到单个数据库的DAO。
答案 0 :(得分:1)
DAO通常是一个无状态单例,用于从数据库加载,搜索,修改和删除实体。为什么要使用RMI与另一个JVM进行通信呢?您将严重降低性能,实体永远不会附加到会话,并且您无法在单个实体上使用跨越多个操作(加载,存储)的事务。它没有意义。
在每个应用程序中都有一个DAO实例。
答案 1 :(得分:0)
您可以使用spring并将此DAO实例bean添加到两个项目的父应用程序上下文中。
答案 2 :(得分:0)
这取决于你的架构。这两种方法都是可能的,并且有其优点和缺点 如果你有一个DAO并通过RMI / REST连接到它,你就可以使用来自hibernate的项目进行解耦,但是引入了一些延迟,强加了实体的可序列化并获得单点故障(可以通过集群解决)
如果您的每个项目都拥有自己的DAO,那么您就会从hibernate配置中获得复杂性,但避免了延迟和失败。
在这两种情况下,您都应采取预防措施,以防止修改数据并保持一致性(如乐观锁定等)