我正在使用WildFly
,Hibernate
(JPA
),C3P0
和MS SQL Server
数据库开展JavaEE项目。
数据库是一个遗留数据库,拥有超过一千个数据库对象,如Stored Procedures
,Functions
,Views
,Triggers
等等。所有这些数据库对象都在User Role
级别设置了细粒度的权限。
现在我需要使用JavaEE Web应用程序访问此数据库。我的问题是,通常的JPA配置让我在配置文件中只为数据库设置一个用户名/密码。我找不到任何方法来配置JPA层,以便使用Enduser的Login访问数据库。
我最终通过调用
为每个用户创建一个EntityManagerFactoryEntityManagerFactory entityManagerFactory =
Persistence.createEntityManagerFactory(properties_with_credentials_here)
每位用户一次。
这种方法的问题在于,这将基本上实例化每个用户的整个JPA层并消耗太多内存。当然,我没有使用任何类型的缓存层。内存仅用于实体元信息(很多)。
现在我的原始问题:JavaEE(JPA)中是否有任何“标准”方式使用Enduser的登录名和密码访问数据库层?
我无法相信我是第一个遇到这种情况的人。在我看来,“模拟”在.net
Web应用程序中非常正常。所以我必须有可能在Java中这样做。
非常欢迎任何评论或提示或新方法。
答案 0 :(得分:0)
JavaEE中的“标准”方式是让应用程序用户访问数据库并通过应用程序中的角色实现基于用户的访问权限。
如果您需要依赖现有的数据库用户,您唯一的机会是为每个用户或每个请求建立连接。然后,实体管理器确实会消耗一些内存,因为它被设计为应用程序的持久化上下文(因此也就是某种缓存)。
也许你可以通过访问那些真正必须基于用户的部分进行权衡,这些部分必须由普通的JDBC和潜在的数据库程序执行,而某些具有扩展权限的应用程序用户可能会以编程方式确保必要的用户限制。