gpt4 book ai didi

java - 具有多个 Java 应用程序的 Hibernate 数据库完整性

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:27 26 4
gpt4 key购买 nike

我们有 2 个都是读/写的 java web 应用程序和 3 个独立的 java 读/写应用程序(一个通过电子邮件加载问题,一个处理 xml 提要,一个向订阅者发送电子邮件)都使用 hibernate 并共享一个公共(public)代码库.

我们最近遇到的问题是,通过电子邮件加载的问题有时会覆盖在其中一个网络应用程序中创建的问题。请注意,这些是单独的问题,应该有单独的 id。我们最初认为这是一个缓存问题。我们已经尝试关闭二级缓存,但这并没有什么不同。

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

问题:

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
@DocumentId
public Integer getId() {
return this.id;
}

顺便说一句,我们正在使用 MySQL。

CREATE TABLE  `question` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (`id`),
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我们没有明确地打开和关闭 session ,而是让 hibernate 通过 Util.getSessionFactory().getCurrentSession() 管理它们。

我们不希望在此阶段设置集群二级缓存,因为这会产生另一层复杂性,我们对从应用程序整体上获得的性能水平非常满意。

那么,在 Web 应用程序中实现“在 View 中打开 session ”模式并在独立应用程序中手动管理 session 听起来是否可以解决此问题?

或者还有其他建议/想法吗?

最佳答案

既然所有的问题都有id,那么我假设所有的问题都是从你的MySql数据库中获取的。

假设您不需要将问题作为透明对象存储在内存中,而是在每次呈现问题时选择所有问题,我有一个简单的建议。

用数据库中的序列替换 ID 生成器。 (最终 ID 作为 MySql 中的自动编号)。然后数据库而不是应用程序保证每个问题都有一个唯一的 ID。

这个解决方案非常简单,可以降低您的复杂性。只有当您将来自不同来源的所有传入问题保存到您的数据库中,然后从此处选择它们时,它才会起作用。

如果此解决方案给您带来性能问题,您应该进一步研究 Hibernate id 生成器的工作原理。 Hibernate 为不同的场景提供了几种不同的生成器。

希望对您有所帮助!

关于java - 具有多个 Java 应用程序的 Hibernate 数据库完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com