Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 软删除时休眠二级缓存_Java_Hibernate_Oracle11g - Fatal编程技术网

Java 软删除时休眠二级缓存

Java 软删除时休眠二级缓存,java,hibernate,oracle11g,Java,Hibernate,Oracle11g,与主数据模块的插入/更新/删除操作相比,读取操作非常高。到目前为止,我们使用JDBC进行读、写和更新操作。我们正在对删除操作执行软删除(将“已删除”列标记为“Y”)。所有写入/更新方法都是同步的,以处理concurreny。我们正在使用oracle,并且没有支持多个数据库的计划 现在,我们计划缓存数据,我们还计划进行集群 我们拥有的最简单的选择是更改insert/update/delete方法,并根据我们的要求使用类似ehcache的东西来管理缓存,并通过使用表中的version列和删除sync

与主数据模块的插入/更新/删除操作相比,读取操作非常高。到目前为止,我们使用JDBC进行读、写和更新操作。我们正在对删除操作执行软删除(将“已删除”列标记为“Y”)。所有写入/更新方法都是同步的,以处理concurreny。我们正在使用oracle,并且没有支持多个数据库的计划

现在,我们计划缓存数据,我们还计划进行集群

我们拥有的最简单的选择是更改insert/update/delete方法,并根据我们的要求使用类似ehcache的东西来管理缓存,并通过使用表中的version列和删除synchronized关键字来处理集群环境中的并发性

我周围的人建议的另一个选择(实际上是让我做的)是转到hibernate(我对hibernate不太了解),它将自动处理缓存和并发

以下是我的疑问:

1) 如果我们有大约200个表来管理主数据,那么更改完整的DAO代码是否值得

2) 在这种情况下,如果我们需要再次过滤缓存数据以丢弃删除的行,hibernate二级缓存会有帮助吗?或者hibernate中有一种机制(或任何其他方式),我们可以在数据库中执行更新操作,但在缓存数据中执行删除操作

3) 我们已将数据传输对象公开给其他模块,这些模块具有表中所有字段,主键存储在单独的PK对象中(主键字段存储在单独的对象中),并且其中没有引用DO(复合DO不存在)。鉴于此,我们无法更改公开的方法和DO结构,所以我们必须再次将hibernate缓存的实体数据打包到DO中吗?或者我们可以将旧的DO结构重用为hibernate实体(根据我的理解,PK列应该直接在hibernate实体中,而不是在某个复合对象中)。我提到复合DO是因为我们也有依赖的下拉要求,如果我们一开始就有复合DO的话,它可以用于子对象的hibernate延迟加载。反对的理由是提供使用缓存数据的新方法,并对旧方法进行去擦洗。其他模块会根据缓存的需要缓慢迁移,但我们会遇到维护问题,因为在数据库发生变化时,我们必须维护这两种方法。此外,还有1和2个疑问


我确信在现阶段hibernate不是我们要走的路,我必须说服周围的人,但我想知道您对迁移到hibernate的长期优势的看法,而不是二级缓存的自动管理、并发处理(我们可以通过在公共场所进行小的代码更改)和db独立性(我们对)更改完整代码的成本不感兴趣。

如果您计划迁移到hibernate,您应该考虑 1) 您需要将所有结构映射到POJO(如果尚未映射) 2) 重写所有DAO以使用hibernate(请记住,HibernateQL/CriteriaAPI有一定的局限性 3) 准备好应对惰性初始化问题等等。。。 就个人而言,我认为迁移到hibernate工作模型是不值得的,除非维护当前模型非常痛苦

关于你的2和3个问题 2) 二级缓存只保存加载的实例,由主键访问。i、 如果你说hibernateSession.load(User,10),它将使用id=10在二级缓存中查找用户对象。如果我明白的话,情况并非如此。大多数情况下,您希望使用更复杂的查询加载数据—在这种情况下,您需要StandarQueryCache,它将您的查询字符串映射到加载的ID列表,这些ID将从二级缓存中检索。但是如果你有很多相似性很低的查询,那么StandartQueryCache和二级缓存都将毫无用处(看一看) 3) 您可以使用组件等,但我不确定您的DTO结构


希望这对您有所帮助

如果您计划迁移到hibernate,您应该考虑 1) 您需要将所有结构映射到POJO(如果尚未映射) 2) 重写所有DAO以使用hibernate(请记住,HibernateQL/CriteriaAPI有一定的局限性 3) 准备好应对惰性初始化问题等等。。。 就个人而言,我认为迁移到hibernate工作模型是不值得的,除非维护当前模型非常痛苦

关于你的2和3个问题 2) 二级缓存只保存加载的实例,由主键访问。i、 如果你说hibernateSession.load(User,10),它将使用id=10在二级缓存中查找用户对象。如果我明白的话,情况并非如此。大多数情况下,您希望使用更复杂的查询加载数据—在这种情况下,您需要StandarQueryCache,它将您的查询字符串映射到加载的ID列表,这些ID将从二级缓存中检索。但是如果你有很多相似性很低的查询,那么StandartQueryCache和二级缓存都将毫无用处(看一看) 3) 您可以使用组件等,但我不确定您的DTO结构


希望这有助于

二级缓存不保存加载的实例。它就像一个散列映射,其中键是pk,条目是缓存数据集的值数组。这意味着更改实例不会更改缓存。如果您使用hibernate从2level cache中选择数据并更改数据,则问题2)需要添加一件事。缓存的数据不会被更改。因此,如果其他会话读取相同的数据,它将无法获取数据的最新状态。要解决此问题,您可以自行退出缓存,也可以等待缓存超时。因此,Hibernate不能帮助您保持缓存的最新状态。二级缓存不能保存加载的插件