`
hsrong
  • 浏览: 36499 次
  • 性别: 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是重量级对象,示例代码没有考虑重用,实际应该重用
分享到:
评论

相关推荐

    weblogic9.1下配置JNDI数据源

    本文将详细介绍在WebLogic 9.1环境下配置JNDI数据源的步骤,并结合实际操作中的常见问题提供解决方案。 #### 二、准备工作 在开始配置之前,需要准备以下几项: 1. **环境搭建**:确保WebLogic 9.1服务器已安装并...

    ejb3-persistence.jar hibernate-annotations.jar

    通过配置部署描述符(如`persistence.xml`),可以指定数据源、实体类、持久化单元等信息,进一步定制持久化行为。 总结来说,`ejb3-persistence.jar`和`hibernate-annotations.jar`是Java企业级开发中的重要组件,...

    ejb3.x 简单小 demo

    虽然具体的博客内容没有提供,但通常这样的文章会包含如何创建、配置和运行EJB组件的步骤,以及可能遇到的问题和解决方案。在实际的博客中,作者可能会讲解如何利用EJB 3.x的核心概念,如实体Bean(Entity Bean)、...

    websphere数据源间接映射手册

    在IT行业中,WebSphere是一个广泛使用的IBM应用服务器平台,它提供了丰富的功能来支持企业级的Java应用程序部署。...如果在实践中遇到任何问题,可以通过邮件等方式寻求帮助,以获得更具体的解决方案。

    EJB 持久层设计

    通过上述组件和策略,EJB的持久层设计能够满足复杂企业应用的需求,提供健壮、可扩展的解决方案。在JBuilder 2005和JDK 1.4.2环境下,开发者可以创建并测试EJB组件,包括持久层的设计,以实现高效的数据管理。

    EJB Design Patterns 源代码

    EJB设计模式是开发人员在处理EJB时遵循的最佳实践和常见解决方案,它们有助于解决常见的设计挑战,提高代码的可维护性和可扩展性。本文将围绕提供的EJB设计模式源代码进行深入解析。 1. **读我文件(readme.txt)**...

    axis2+EJB整合开发 源代码

    总之,这个压缩包提供了一个宝贵的实践平台,让我们能亲手操作并理解如何在Axis2上整合EJB,实现企业级的Web服务解决方案。通过这个实例,开发者可以更好地掌握Java EE中的分布式计算和Web服务技术。

    GWT EJB3 Entity

    3. **配置JPA**:在服务器的部署描述符中配置JPA提供者,如Hibernate或OpenJPA,并定义数据源。 4. **暴露服务**:使用`@WebService`或`@Remote`注解暴露EJB服务,以便GWT客户端可以调用。 5. **GWT客户端调用**:在...

    websphere,ejb教程

    在教程中,你会了解如何配置Spring和Mybatis,创建数据源,定义Mapper接口,以及如何在Spring的Service层中使用Mybatis进行数据库操作。 **学习路径** 学习这些技术通常涉及以下几个步骤: 1. **基础理论**:理解...

    东北大学EJB实验

    3. **容器管理的依赖注入**:通过注解(@EJB)实现依赖注入,如引入其他Bean或JDBC数据源。 4. **测试和调用EJB**:使用JNDI查找机制找到Bean实例,并进行远程或本地调用。 5. **实验报告撰写**:记录实验过程,...

    精通EJB3.0源码,EJB3实例

    5. **EJB 3.0的挑战与解决方案**: - **性能优化**:虽然EJB简化了开发,但可能带来额外的性能开销,需要合理设计bean的粒度和缓存策略。 - **测试**:由于EJB的容器依赖,单元测试需要借助工具如Arquillian进行...

    ejb3·0入门经典教程

    探讨实体Bean之间的各种关系映射,包括一对多、多对一、一对一和多对多关系,以及在映射表名或列名与数据库保留字冲突时的解决方案。 以上知识点概览覆盖了《ejb3·0入门经典教程》的主要内容,旨在为初学者提供...

    EJB课堂演示.rar

    同时,EJB也可以与JPA(Java Persistence API)、JMS、JTA(Java Transaction API)等Java EE组件无缝协作,构建复杂的企业级解决方案。 在实际开发中,EJB课堂演示可能包含了讲解EJB基本概念、组件类型、部署过程...

    东北大学EJB实验报告

    4. **测试与调试**:展示如何进行单元测试和集成测试,以及遇到的问题和解决方案。 5. **性能分析**:如果可能,可以进行简单的性能测试,比较不同EJB配置下的运行效率。 6. **结论与反思**:总结实验成果,提出...

    ejb的一些配置步骤

    综上所述,EJB为企业级应用提供了一整套完整的解决方案,包括但不限于事务管理、安全性、负载均衡等方面的支持。通过遵循EJB标准和技术规范,开发者能够构建出高性能、可扩展性强的企业级应用。

    使用Eclipse+Jboss+MySql开发EJB

    在IT行业中,开发企业级应用程序通常涉及到多个技术的集成,如Eclipse作为IDE,Jboss作为应用...掌握这一流程对于Java EE开发者来说是至关重要的,因为它展示了如何在实际项目中构建可伸缩、健壮的企业级解决方案。

    EJB3+spring2.5+struts2和ejb3+servlet增,删,改,查实现!

    - Spring是一个轻量级的Java框架,提供了一种模块化的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的解决方案。 - Spring 2.5引入了更强大的注解支持,如`@Autowired...

    ejb_银行系统

    在银行系统这样的业务场景中,EJB能够提供稳定、安全和可扩展的解决方案,处理诸如账户管理、交易处理、客户信息存储等关键任务。 银行系统通常由多个模块组成,包括用户界面、业务逻辑层、数据访问层等。EJB在其中...

Global site tag (gtag.js) - Google Analytics