我正在将应用程序从桌面迁移到Web。在桌面应用程序中,用户使用不同的数据库用户连接到Oracle数据库,即用户由Oracle管理,而不是在数据库表中。所有都使用相同的方案来存储和管理数据,PLMU_PROD。
我必须为Web应用程序实现身份验证(JPA),并且正如我所读,我必须为每个数据库用户创建一个EntityManagerFactory。
我想的另一个选项是创建一个用户/密码表,并使用相同的EntityManagerFactory为所有EntityManager提供服务,因为所有用户都将访问方案PLMU_PROD中的相同数据。
我想知道PersistenceContext是否在不同的EntityManagerFactories之间共享,因为我的Web服务器具有很少的RAM并且不想浪费它具有重复的实体。
谢谢你的时间!
答案 0 :(得分:0)
你似乎指的是缓存。 JPA要求EntityManagers保持实体缓存,以便它们可以跟踪更改。因此,每个EntityManager都需要拥有自己的缓存,将更改与其他更改分开,这些更改可能在其他实例中同时进行 - 事务隔离。在EclipseLink中,有一个在EMFactory级别共享的二级缓存的概念。 http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching是关于EclipseLink中缓存的好文档。此二级缓存有助于避免数据库访问,可以根据需要禁用。如果您的EntityManagers不需要跟踪更改,例如,如果应用程序是只读的并且实体未被修改,您可以设置查询以从共享缓存中返回实体,以便使用读取仅存在单个数据实例-only查询提示:http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/q_read_only.htm#readonly
只读实例可以避免重复和不必要地使用资源,但是您需要适当地管理它们并在进行更改之前从EntityManager获取托管副本。