4

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

我们最近遇到的问题是,通过电子邮件加载的问题有时会覆盖在其中一个 Web 应用程序中创建的问题。请注意,这些是单独的问题,应该有单独的 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

我们没有明确地打开和关闭会话,而是让 hibernate 通过Util.getSessionFactory().getCurrentSession().

在这个阶段,我们宁愿不设置集群的二级缓存,因为这会造成另一层复杂性,而且我们对从应用程序整体获得的性能水平非常满意。

那么在 Web 应用程序中实现开放会话模式并在独立应用程序中手动管理会话听起来会解决这个问题吗?

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

4

2 回答 2

3

由于所有问题都有 id,所以我假设所有问题都是从您的 MySql 数据库中获取的。

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

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

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

如果这个解决方案给你带来性能问题,你应该更多地研究你的 Hibernate id 生成器是如何工作的。Hibernate 为不同的场景提供了几种不同的生成器。

希望这有帮助!

于 2010-05-12T09:21:47.740 回答
0

原来这个问题根本与 Hibernate 无关。

登台服务器上的其中一个数据库表充满了应该清理的旧数据。这最初给出了 id 被覆盖的外观,但进一步调查证明并非如此!

一旦我们删除了不可靠的数据,一切都很好。

于 2010-05-21T10:52:34.757 回答