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

标签 java hibernate caching second-level-cache

我们有 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/

相关文章:

java - 为什么 intellij 代码自动完成不起作用?

java - Hibernate:使用条件按列表过滤

java - hibernate 映射: creating FK relation in existing db for join operations

java - 要映射的实体<字符串,对象>

ajax - Prestashop 无尽旋转产品保存按钮

java - 如何使监听器在 CellColumn getValue gwt 中工作?

java - 如何使用JRI绘制SVM模型?

java - hibernate 错误 : There is no primary key for referenced table

.net - 从字符串构造 C# Type 以进行序列化/反序列化的最佳方法

caching - 在运行时向 Flutter 应用添加动态资源