我们有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()管理它们。

我们宁愿不安装在这个阶段,因为这群集二级缓存创建了另一层复杂性,我们很乐意与业绩水平,我们从应用程序作为一个整体得到。

因此,没有在网络应用程序实现开放会话在视野图案和手动管理在独立的会话应用程式声音像它会解决这个问题?

或其他任何建议/想法,请?

有帮助吗?

解决方案 2

原来这个问题完全没有涉及到休眠。

一个临时服务器上的数据库表中弥漫着应该已被清理旧数据。这最初给的ID不被覆盖的外观,但进一步的调查证明事实并非如此!

在我们除去狡猾数据,一切都很好。

其他提示

由于所有的问题有ID,那么我认为所有的问题都从你的MySQL数据库中获取。

假设你并不需要存储的问题,如内存透明物体,而是你选择每次呈现出来的时间对于所有的问题,我有一个简单的建议。

与数据库中的序列替换ID发生器。 (最终的ID作为在MySQL自动编号)。那么数据库,而不是应用保证了每一个问题得到一个唯一的ID。

此解决方案很简单,降低了您的复杂性。它只有当你坚持从不同来源的所有传入的问题到你的数据库,然后从这里选择他们的作品。

如果这个解决方案为您提供了性能问题,您应该调查更了解您的Hibernate的id生成器的工作。 Hibernate提供几种不同的发电机不同的方案。

希望这有助于!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top