在每个请求上刷新会话中存储的用户帐户对象的最佳方法

时间:2013-11-23 20:42:37

标签: java mysql sql hibernate jpa

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

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

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

  • Hibernate似乎更适合新创建的应用程序,因为hibernate根据映射的实体对象处理数据库模式的创建方式
  • 可能很难配置我的持久对象以符合我当前的数据库架构
  • 使用hibernate甚至可以在刷新用户帐户对象时提高性能吗?
  • 我花了很多时间来创建和优化我的存储过程。我还能用它们吗?

我在想我可以按照我想要的方式创建我的实体对象,让hibernate做它的事情并创建新表。然后我会将当前数据传输到新表并继续使用hibernate。

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

先谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

使用Hibernate / JPA时,您可以使用@Version注释让Hibernate自动管理版本字段。但它也可以在没有Hibernate的情况下手动完成。

答案 1 :(得分:0)

我建议:

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

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