以编程方式指定JPA(特别是hibernate)的数据源名称,以用于Wildfly中的每个请求的数据库连接
我有一个运行在JBoss5中的多终端应用程序。目前,这并没有利用hibernate,但我正试图升级它来实现这一点。除了应用程序根据请求的URL中的子域确定要使用的数据源之外,一切正常。e、 g.对以编程方式指定JPA(特别是hibernate)的数据源名称,以用于Wildfly中的每个请求的数据库连接,hibernate,datasource,wildfly,multi-tenant,Hibernate,Datasource,Wildfly,Multi Tenant,我有一个运行在JBoss5中的多终端应用程序。目前,这并没有利用hibernate,但我正试图升级它来实现这一点。除了应用程序根据请求的URL中的子域确定要使用的数据源之外,一切正常。e、 g.对company1.myapp.com/resource/id/1的请求将从JNDI请求DSNjava:/datasources/company1的连接,而对company2.myapp.com/resource/id/1的请求将从JNDI请求DSNjava:/datasources/company2的连
company1.myapp.com/resource/id/1
的请求将从JNDI请求DSNjava:/datasources/company1
的连接,而对company2.myapp.com/resource/id/1
的请求将从JNDI请求DSNjava:/datasources/company2
的连接,每个连接到自己的数据库以防止任何错误可能的数据泄漏
我想对JBoss8(Wildfly)下的hibernate做类似的事情。不幸的是,因为Wildfly正在管理我的HibernatePersistenceProvider
(我只是注入我的EntityManager,让Wildfly完成所有工作),所以我无法通过编程告诉它使用哪个DSN进行连接
有没有一个我错过的明智的方法?我尝试将提供程序更改为扩展HibernatePersistenceProvider
的自定义类,但最后出现了一个错误,它找不到我的类。我甚至不相信这会起作用,因为我不能很容易地在这门课上得到请求
基本上,我需要从URL确定DSN,并使用它告诉Hibernate每个请求使用哪个数据源
有什么想法吗?您可以在persistence.xml中指定不同的持久性单元,每个子域一个。然后,您可以使用cdi提供程序方法根据已查询的域注入适当的EntityManager。
但是,如果设置中的子域数量不固定,此解决方案将不起作用。是的,我的想法是要实现这一点,您需要根据您的子域维护hibernate配置文件。像 对于
company1.myapp.com
假设我们有如下hibernate配置文件
company1\u Hibenate.cfg.xml
及
对于company2.myapp.com
假设我们有如下hibernate配置文件
company2\u Hibenate.cfg.xml
在加载上下文之后,您将构建SessionFactorys
例如:
SessionFactory sessionFactory1 = new Configuration().configure("company1_Hibenate.cfg.xml").buildSessionFactory();
SessionFactory sessionFactory2 = new Configuration().configure("company2_Hibenate.cfg.xml").buildSessionFactory();
现在在interceptor中,您将检查域并相应地使用sessionFactory。关于保留多个数据源配置文件和那么多sessionFactory对象,您怎么说?我不确定我是否理解您的问题。我使用的不是SessionFactory,而是EntityManager。。。您是否有使用SessionFactorys的建议?非常抱歉-但您的解决方案不会有帮助,因为代码使用JBoss注入的EntityManager,所以我无法使用SessionFactorys…不幸的是-系统具有动态注册,所以我需要动态地部署数据源,然后让Hibernate/JPA动态地使用它们。。。