Java 每次请求时刷新会话中存储的用户帐户对象的最佳方法
我有一个简单的关系数据库,只有3个表(一对一和一对多关系),我需要从这3个表中提取数据,并将int存储在POJO对象中,该对象将存储在用户会话中。但是,这些表中的数据经常从与webapp分离的另一个应用程序中更新,因此当存储在用户会话中的POJO必须在每次请求时使用新数据更新时。查询数据库中的所有数据并在每次请求时构造新的用户对象(即使使用优化的存储过程)效率太低。 所以我的问题是: 用数据库中更新的数据刷新用户对象的最佳方法是什么? 我已经研究过使用ORM框架(特别是hibernate)在用户对象和数据库之间实现持久性,但我关心的是:Java 每次请求时刷新会话中存储的用户帐户对象的最佳方法,java,mysql,sql,hibernate,jpa,Java,Mysql,Sql,Hibernate,Jpa,我有一个简单的关系数据库,只有3个表(一对一和一对多关系),我需要从这3个表中提取数据,并将int存储在POJO对象中,该对象将存储在用户会话中。但是,这些表中的数据经常从与webapp分离的另一个应用程序中更新,因此当存储在用户会话中的POJO必须在每次请求时使用新数据更新时。查询数据库中的所有数据并在每次请求时构造新的用户对象(即使使用优化的存储过程)效率太低。 所以我的问题是: 用数据库中更新的数据刷新用户对象的最佳方法是什么? 我已经研究过使用ORM框架(特别是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非常灵活,几乎可以适应任何现有模式。但是,如果一切都已经发展和工作,也许这是不值得的。正如一些人所说,如果它没有坏,就不要修理它。不过,作为一种学习经验,这可能会很有趣。