2012-07-14 77 views
2

有没有一种方法可以让JPA(Eclipselink专门)动态选择一个连接池,具体取决于绑定到当前线程的某些属性?JPA/Eclipselink - 动态选择DataSource/JDBC URL

我试图解决的问题是缩放多租户系统,其中租户可能会分成多个数据库实例。每个数据库实例都是多租户的,但为了扩展,我可能无法舒适地将所有租户安装在一个数据库实例中。

我熟悉@Multitenant以支持单表多租户,并已成功使用Eclipselink会话事件回调来动态地设置Eclipselink Session中的值。我正在尝试更改EntityManager将要使用的DataSource的下一步,因此我不必一定要使用群集数据库。

谢谢!

+0

有多少数据源?它们可以在启动时初始化,还是太多? – sinuhepop 2012-07-20 08:23:40

回答

0

看看这个

http://code.google.com/p/jdbc-helper/wiki/LoadBalancingDataSource

它创建loadbalances到后端数据源的数据源。

+2

不幸的是,我不只是试图加载平衡,我试图根据当前请求/线程的某些属性显式指定目标数据源。 – wrschneider 2012-07-15 01:56:55

+0

扩展LoadBalancingDataSource并重写getConnection以根据threadlocal变量从connectionPools中选择特定的connectionPool。我没有使用LoadBalancingDataSource,所以我不能保证它的质量。 – 2012-08-07 06:14:39

+1

请注意Eclipselink共享的二级缓存,它可能因不一致的数据库而中毒 – 2012-08-07 06:16:09

0

您可以使用EntitiyManagerFactory它允许EntitiyManager创建特定datsasource(通过String属性)

http://foobar.lu/wp/2010/12/30/change-jpa-entitymanager-connection-properties-at-runtime/

+1

我正在为'EntityManager'使用'@ PersistenceContext'注入并希望保留它。我不想在我的应用程序代码中管理创建和关闭EntityManagers。如果您知道如何通过EclipseLink会话回调完成同样的事情,那将是理想的。 – wrschneider 2012-07-20 14:21:05

0

下,作为解释你可能要检查this post。这可能会有所帮助,或者让您了解如何实现解决方案。

+1

可以在单个安装/实例中切换模式/数据库,但它不允许我动态选择主机。 – wrschneider 2012-07-23 19:55:14