2014-04-22 59 views
0

我使用Hibernate来管理数据库表,一切正常。是否可以在没有Hibernate的情况下访问Hibernate托管数据库?

现在,另一个系统应该访问相同的数据库表,我不能告诉它使用Hibernate(因为它是一个单片软件)。 我的疑问是关于从外部软件正确使用数据库以及这种方法给我的注意力带来的一致性问题。特别是,它能成为一个问题吗?也许Hibernate在RAM中工作(一个ORM可以实现缓存和延迟事务来加速写/读过程),所以一个可能的外部事务到数据库可能会导致Hibernate工作的不一致。这是Hibernate的情况吗?

谢谢

+3

首先搜索Google - 您会发现Hibernate不是** DB管理工具,而是ORM层。 也就是说它不会**阻止其他人访问数据库 –

回答

1

正如其他答案指出的那样,数据库并不重要。但是,您的申请完全是另一回事。
默认情况下,Hibernate不能很好地处理其控制之外的数据更改。更具体地说,它倾向于完全忽略这种变化。
因此,应用程序加载的数据很可能会与数据库本身知道的数据不同步,从而导致所有类型的问题。
这是因为Hibernate缓存数据和大量数据,并且倾向于在该缓存上运行而不是实际数据以提高性能,只有在事务提交时才与数据库同步。如果别的东西改变了数据,Hibernate会很乐意忽略这些改变并覆盖其他进程所做的任何事情,甚至不会给你一个警告。

+0

嗨jwenting,谢谢你的回应。 我使用Spring的JpaTransactionManager来管理事务。这可能是持久性问题吗? – gvdm

+0

@gvdm问题在于JPA(Hibernate实现)处理缓存的方式。一旦有什么东西在缓存中,它只是假定始终与数据库同步。只有解决这个问题的方法是配置JPA/Hibernate不使用缓存。这当然会影响性能,但是如果RDBMS有多种改变途径,这是唯一的方法。 – jwenting

+0

所以我应该寻找禁用Hibernate缓存的方法,对吧? – gvdm

0

它不应该。你最好做一些整合测试。

  1. 数据库有另一层一致性保证。
  2. Hibernate应该正确处理它的缓存。
1

你如何访问数据库(通过ORM,JDBC或其他连接器)绝对无关紧要,唯一重要的是你的数据库将如何处理不同系统的多个连接(所以你可能会想看看像Transaction isolation这样的东西)。

+1

是和否。许多ORM工具默认缓存大量数据以加快访问速度,导致冲突在应用程序级别被忽视,直到出现约束违规尝试写入内容时为止。 – jwenting

+0

是的,你是对的,你的答案肯定是更好:) –

相关问题