Java 每次请求时刷新会话中存储的用户帐户对象的最佳方法

Java 每次请求时刷新会话中存储的用户帐户对象的最佳方法,java,mysql,sql,hibernate,jpa,Java,Mysql,Sql,Hibernate,Jpa,我有一个简单的关系数据库,只有3个表(一对一和一对多关系),我需要从这3个表中提取数据,并将int存储在POJO对象中,该对象将存储在用户会话中。但是,这些表中的数据经常从与webapp分离的另一个应用程序中更新,因此当存储在用户会话中的POJO必须在每次请求时使用新数据更新时。查询数据库中的所有数据并在每次请求时构造新的用户对象(即使使用优化的存储过程)效率太低。 所以我的问题是: 用数据库中更新的数据刷新用户对象的最佳方法是什么? 我已经研究过使用ORM框架(特别是hibernate)在用户

我有一个简单的关系数据库,只有3个表(一对一和一对多关系),我需要从这3个表中提取数据,并将int存储在POJO对象中,该对象将存储在用户会话中。但是,这些表中的数据经常从与webapp分离的另一个应用程序中更新,因此当存储在用户会话中的POJO必须在每次请求时使用新数据更新时。查询数据库中的所有数据并在每次请求时构造新的用户对象(即使使用优化的存储过程)效率太低。 所以我的问题是:

用数据库中更新的数据刷新用户对象的最佳方法是什么?

我已经研究过使用ORM框架(特别是hibernate)在用户对象和数据库之间实现持久性,但我关心的是:

  • Hibernate似乎更适合新创建的应用程序,因为Hibernate根据映射的实体对象处理数据库模式创建的方式
  • 可能很难将持久对象配置为符合当前数据库模式
  • 在刷新用户帐户对象时,使用hibernate会提高性能吗
  • 我花了大量时间创建和优化存储过程。我还能利用它们吗
我在想,我可以按照我想要的方式创建我的实体对象,让hibernate完成它的工作并创建新的表。然后,我会将当前数据传输到新表,并继续使用hibernate

我知道我真的没有任何具体的问题,这是因为我找不到解决我的问题的最佳解决方案,我不想深入使用hibernate,然后发现它不适合我的应用程序


提前感谢。

我认为Hibernate不会使从数据库刷新用户对象更有效。但是,它可以使您更高效地编写DB Persience代码

要回到原始问题,您可以使用
version
字段,而不是在每个请求上重新加载整个用户对象。这可以通过使用或不使用Hibernate来完成

首先,将
version
列添加到主用户表中。每次您的Web应用程序或外部应用程序更新用户时,它还必须将
版本
增加1。然后在每个请求上,调用一个小查询(或sp),该查询只返回用户的
版本。如果版本与会话中存储的版本不同,则重新加载用户对象,否则不重新加载

如果用户数据不经常更改,这将大大提高性能,因为用于检索版本的查询应该非常快。或者,您可以使用
last\u modified
(时间戳)列,而不是
version

使用Hibernate/JPA时,您可以使用
@Version
注释让Hibernate为您自动管理版本字段。但也可以在不使用Hibernate的情况下手动执行。

我建议:

  • 使用EJB实体存储用户信息
  • 确保所有更改/加载用户信息的应用程序都是通过EJB会话bean进行更改/加载的
  • 不要在HTTP会话中“缓存”用户信息:在每个请求中加载它
  • 将EJB二级缓存应用于用户信息实体

使用这种方法,除非刷新缓存或重新部署应用程序,否则永远不会读取数据库

哇!好主意!这肯定会有帮助,因为只有用户也登录到单独的应用程序时,数据才会更新(我想我也可以检查一下,看看他们是否登录到该应用程序)。现在我想问题是是否使用hibernate。你认为这对我的案子有利吗?让hibernate从对象创建表会更好吗?或者我应该尝试让它使用我当前的模式吗?如果你计划在将来扩展你的应用程序并添加更多的表,这可能是值得的。Hibernate和JPA非常灵活,几乎可以适应任何现有模式。但是,如果一切都已经发展和工作,也许这是不值得的。正如一些人所说,如果它没有坏,就不要修理它。不过,作为一种学习经验,这可能会很有趣。