Java 奇怪的休眠缓存问题

Java 奇怪的休眠缓存问题,java,hibernate,spring,Java,Hibernate,Spring,我们在SpringMVC2.0中使用Hibernate3.1。当数据直接更新到数据库而不是应用程序中时,就会出现问题。我们使用过滤器根据订单是打开还是关闭来过滤结果集合。如果我们在DB上更改要关闭的顺序,过滤器将返回正确的列表,但是,对象的状态不会更改 我们没有启用二级缓存或查询缓存。 通过Hibernate的Session.createQuery从数据库检索集合。 此外,我们有一个SessionFactory连接,并在整个应用程序中使用一个会话。 对象显示正确状态结果的唯一时间是服务器重新启动

我们在SpringMVC2.0中使用Hibernate3.1。当数据直接更新到数据库而不是应用程序中时,就会出现问题。我们使用过滤器根据订单是打开还是关闭来过滤结果集合。如果我们在DB上更改要关闭的顺序,过滤器将返回正确的列表,但是,对象的状态不会更改

我们没有启用二级缓存或查询缓存。 通过Hibernate的Session.createQuery从数据库检索集合。 此外,我们有一个SessionFactory连接,并在整个应用程序中使用一个会话。
对象显示正确状态结果的唯一时间是服务器重新启动时,我们不希望经常这样做

当进程在背后运行时,不能指望Hibernate正确管理其缓存对象的脏状态。如果您使用的是注释,我建议将字段名称的状态标记为@Transient,以便Hibernate知道每次都必须从数据库中获取此值。

当您有进程在背后运行时,您不能指望Hibernate正确管理其缓存对象的脏状态。如果您使用的是注释,我建议将字段名称的状态标记为@Transient,以便Hibernate知道每次都必须从数据库中获取该值。

您可能希望启用缓存并设置到期时间。 然后,当缓存过期并且有人请求时,Hibernate将刷新数据库中的数据

我在一个家庭项目中使用它,因为我偶尔会调整数据库。然后我等待片刻,刷新页面并查看调整后的数据


查看Hibernate中的ehcache。

您可能希望启用缓存并设置过期时间。 然后,当缓存过期并且有人请求时,Hibernate将刷新数据库中的数据

我在一个家庭项目中使用它,因为我偶尔会调整数据库。然后我等待片刻,刷新页面并查看调整后的数据

看看Hibernate中的ehcache。

您可以使用版本控制。您的外部进程必须增加版本号或时间戳,以便让Hibernate知道新版本可用

这不一定是立即的更改,但在我们的例子中,这比每隔几分钟重新启动一次容器要频繁得多

它有几个缺点:

您的应用程序可能会使用旧数据工作一段时间 如果版本因批处理作业而增加,并且hibernate尝试保存更新的旧版本记录,则会生成异常 共享数据库的可扩展性较差;频繁检查会影响性能。 我决不是冬眠专家,但这是可能的

您可以使用版本控制。您的外部进程必须增加版本号或时间戳,以便让Hibernate知道新版本可用

这不一定是立即的更改,但在我们的例子中,这比每隔几分钟重新启动一次容器要频繁得多

它有几个缺点:

您的应用程序可能会使用旧数据工作一段时间 如果版本因批处理作业而增加,并且hibernate尝试保存更新的旧版本记录,则会生成异常 共享数据库的可扩展性较差;频繁检查会影响性能。
我决不是冬眠专家,但这是可能的

会话始终具有一级缓存,因此,如果使用一个会话,则通过它读取的所有内容都将被缓存。Hibernate将对数据库执行查询,但在构建对象时,它会检查会话缓存以避免构建新对象,因此不会刷新数据库中更改的任何列。如果您关闭它并获得一个新会话,它将在下一次查询时从数据库中读取完整对象。

会话始终具有一级缓存,因此如果您使用一个会话,则通过它读取的所有内容都将被缓存。Hibernate将对数据库执行查询,但在构建对象时,它会检查会话缓存以避免构建新对象,因此不会刷新数据库中更改的任何列。如果您关闭它并获得一个新会话,它将在下一次查询时从数据库中读取完整对象。

谢谢您的回复。我们目前不使用注释,但将来会使用注释,所以我会记住这一点:您可以在hbm文件中将字段标记为transient或JavaDoc注释,但我不记得如何再这样做了,现在只记得使用注释。谢谢您的回复。我们目前不使用注释,但将来会使用注释,所以我会记住这一点:您可以在hbm文件中将字段标记为transient或JavaDoc注释,但我不记得如何再这样做了,只记得现在使用注释。好的,我会尝试一下,让您知道它是如何进行的。谢谢你的回复。好的
,我会尝试一下,让你知道它的进展。谢谢你的回复。是的,这就是我想要的,一个简单的方法。谢谢。是的,这就是我想要的,一个简单的方法。非常感谢。