`
hsrong
  • 浏览: 35780 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

EJB 3 动态数据源的解决方案

    博客分类:
  • java
 
阅读更多
    项目碰到一个这样的需求:数据库划分为公共库、历史库、会员库和运行库。运行库可能有多个,但它们的表及表结构完全一致。一个运行库里存放着一个或多个分公司的数据。系统根据用户所属的分公司操作对应的运行库。(应用服务器是jboss 7)
    方案如下:
    首先,persistence.xml先配置一个模板运行库的部署单元, 这个部署单元对应的数据库必须存在。如
    <persistence-unit name="XXX_RUNTIME_DS" transaction-type="JTA">
        <jta-data-source>java:/XXX_RUNTIME_DS_001</jta-data-source>
        ...
    </persistence-unit>

接下来,我们注入默认的EntityManager,我们的目标是获取默认的EntityManagerFactory,以它为模板,最终构造出我们需要的EntityManagerFactory。
    @PersistenceContext(unitName = "XXX_RUNTIME_DS")
    private EntityManager em;

接下来,开始构造
protected EntityManager getEntityManager() {
    String db = ...;//用于判断运行库
    if(db.equal(...)){//返回默认的运行库
        return em;
    }
    //构造EntityManagerFactory
String dbStuffix = db.substring(db.indexOf(DBConstants.DB_RUNTIME_PREV) + DBConstants.DB_RUNTIME_PREV.length());//这里的值是部署单元中JNDI的_001,我们把JNDI构造成类似于java:/XXX_RUNTIME_DS_002/java:/XXX_RUNTIME_DS__003,其他类似
    //覆盖某些属性
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.infinispan.JndiInfinispanRegionFactory");
    properties.put("hibernate.cache.infinispan.cachemanager", "java:jboss/infinispan/hibernate");
    properties.put("javax.persistence.jtaDataSource", DBConstants.DS_JNDI_PREV + dbStuffix);
    properties.put("hibernate.session_factory_name", em.getEntityManagerFactory().getProperties().get("hibernate.session_factory_name") + dbStuffix);
    properties.put("hibernate.cache.region_prefix", em.getEntityManagerFactory().getProperties().get("hibernate.cache.region_prefix") + dbStuffix);
    properties.put("hibernate.ejb.entitymanager_factory_name", em.getEntityManagerFactory().getProperties().get("hibernate.ejb.entitymanager_factory_name") + dbStuffix);
    //创建EntityManagerFactory 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("XXX_RUNTIME_DS", properties);
    String  puScopedName = emf.getProperties().get("hibernate.ejb.entitymanager_factory_name").toString();
    //创建EntityManager 
    EntityManager entityManager;
    boolean isInTx;
    isInTx = TransactionUtil.isInTx();
    if (isInTx) {
        entityManager = TransactionUtil.getOrCreateTransactionScopedEntityManager(emf, puScopedName, emf.getProperties());
    } else {
        entityManager = NonTxEmCloser.get(puScopedName);
        if (entityManager == null) {
            entityManager = EntityManagerUtil.createEntityManager(emf, null);
            NonTxEmCloser.add(puScopedName, entityManager);
	}
    }
    return entityManager;
}

注:EntityManagerFactory是重量级对象,示例代码没有考虑重用,实际应该重用
分享到:
评论

相关推荐

    基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务.zip

    Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...

    Spring攻略(第二版 中文高清版).part2

    1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...

    Spring攻略(第二版 中文高清版).part1

    1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...

    EJB葵花宝典(题集)

    目录 1技术总述 7 2开发环境介绍 7 2.1搭建开发环境 7 2.2MyEclipse 10 3SessionBean(会话Bean) 18 3.1会话Bean调用架构 18 ...5.12.1Persistence翻页解决方案 76 6EJB事务 76 7定时器 77 8拦截器 77

    论文研究-基于XML与J2EE技术的数据交换中心的设计与实现.pdf

    为实现在异质异源数据库间的数据交换,使用户可以透明地访问数据,提出一种建立数据交换中心的解决方案。在该数据交换中心的构建中,综合采用了XML,J2EE,XSLT等技术。通过使用XML作为数据的载体,运用XSLT样式表对...

    JAVA上百实例源码以及开源项目源代码

    Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...

    解析J2EE型式的应用(下)

    这样也就减少了解决方案的灵活性,因为每当该数据源发生变化时,这些代码都需要改变。基层数据源的改变可能包括数据库的变化(例如从SQLServer转移到Oracle)或者整体模型的改变,如从基于JDBC的数据访问变化为通过...

    Java数据编程指南

    Java数据对象(JDO) 概述 JDO对象模型 JDO API JDO实例的生命周期 JDO和EJB 开发可持久类 范例应用程序 配置FFJ 配置数据源 捕获数据库模式 把类映射到数据库对象 编译类 ...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA核心技术

    特点是可以与多种数据源交互,包括文件系统,数据库,LDAP,XML资源库,网络数据源等。??免费。??ECHO:??主要应用方面:WEB层。??主要应用技术:servlet等??出处:http://www.nextapp.com/products/echo/??简述:...

    Spring中文帮助文档

    2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. ...

    Spring API

    2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. ...

    Spring 2.0 开发参考手册

    9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1....

    FormHammer-Database GUI Builder-开源

    一个开放的解决方案,可以有效地创建基于Java / Swing的客户端GUI,并将其与后端数据源和业务逻辑容器(JDBC / SQL,EJB,Hibernate ...等)紧密集成。 该库提供与Java中的Oracle Forms类似的功能。

    spring chm文档

    9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1....

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 ...

    java三大框架

    Spring也许称得上是个一站式解决方案,提供了一个典型应用所需要的大部分基础架构。它还涉及到了其他framework没有考虑到的内容。 尽管它仅仅是一个从2003年2月才开始的开源项目,但Spring有深厚的历史根基。 ...

Global site tag (gtag.js) - Google Analytics