`
vtrtbb
  • 浏览: 360052 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jpa多数据源处理

    博客分类:
  • java
阅读更多
项目中需要多个数据库,而且每个数据库的基本信息都是保存在一个公共库(public)的sysarea表中的:表格式如下


     

AREA_ID
AREA_NAMEEN
AREA_DATABASE
AREA_DBNAME
AREA_DBPWD
AREA_DBSERVE
1
数据库1
infodb1
root
111111
192.168.1.1
2
数据库1
infodb2
root
111111
192.168.1.2


persistence.xml 文件如下:

[code="xml"]org.hibernate.ejb.HibernatePersistencejava:comp/env/jdbc/PUBLICDBorg.hibernate.ejb.HibernatePersistence


根据数据库名称取链接属性类:

[code="java"]public class AreaFactory {

private static final Map> map = new HashMap>();

private static final String SHOWSQL = HttpContext.getConfig().getString(AppConfig.SHOWSQL);

private static AreaFactory areaFactory = new AreaFactory();

public static  AreaFactory getInstance (){
return areaFactory;
}

public  Map getAreaMap(String unitName) {
Map mp = map.get(unitName);
if (mp == null) {
mp = new HashMap();
UnitDAO unitDAO = DAOFactory.getInstance().getUnitDAO();
SysArea sysArea = unitDAO.findArea(unitName);
if (sysArea != null) {
mp.put("hibernate.connection.url", "jdbc:mysql://"+sysArea.getAreaDbserve()+":"+sysArea.getAreaPort()+"/"+sysArea.getAreaDatabase());
mp.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
mp.put("hibernate.connection.username", ""+ sysArea.getAreaDbname()+"");
mp.put("hibernate.connection.password", ""+ sysArea.getAreaDbpwd() +"");
mp.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
mp.put("hibernate.show_sql", SHOWSQL);
mp.put("hibernate.transaction.factory_class", "org.hibernate.transaction.JDBCTransactionFactory");
mp.put("hibernate.query.substitutions", "true=1, false=0");
map.put(unitName, mp);
}
}
return mp;
}

}

DAOFactory.java 类

[code="java"]public class DAOFactory {

private final Map factory = new HashMap();
private static DAOFactory instance;

public static DAOFactory getInstance(){
if(instance == null){
instance = new DAOFactory();
}
return instance;
}


public UnitDAO getUnitDAO() {
final String key = UnitDAO.class.getSimpleName();
UnitDAO dao = (UnitDAO)factory.get(key);
if (dao == null) {
dao = new UnitDAOImpl();
factory.put(key, dao);
}
return dao;
}
}

sysArea类

[code="java"]@Entity
@Table(name = "sys_area")
public class SysArea implements java.io.Serializable {

private int areaId;

private String areaNameen;

private String areaDatabase;

private String areaDbname;

private String areaDbpwd;

private String areaDbserve;



public SysArea() {
}



@Id
@GeneratedValue (strategy=GenerationType.AUTO)
@Column(name = "AREA_ID", unique = true, nullable = false)
public int getAreaId() {
return this.areaId;
}

public void setAreaId(int areaId) {
this.areaId = areaId;
}

@Column(name = "AREA_NAMEEN", nullable = false, length = 16)
public String getAreaNameen() {
return this.areaNameen;
}

public void setAreaNameen(String areaNameen) {
this.areaNameen = areaNameen;
}


@Column(name = "AREA_DATABASE", nullable = false, length = 32)
public String getAreaDatabase() {
return this.areaDatabase;
}

public void setAreaDatabase(String areaDatabase) {
this.areaDatabase = areaDatabase;
}

@Column(name = "AREA_DBNAME", nullable = false, length = 32)
public String getAreaDbname() {
return this.areaDbname;
}

public void setAreaDbname(String areaDbname) {
this.areaDbname = areaDbname;
}

@Column(name = "AREA_DBPWD", nullable = false, length = 64)
public String getAreaDbpwd() {
return this.areaDbpwd;
}

public void setAreaDbpwd(String areaDbpwd) {
this.areaDbpwd = areaDbpwd;
}

@Column(name = "AREA_DBSERVE", nullable = false, length = 256)
public String getAreaDbserve() {
return this.areaDbserve;
}

public void setAreaDbserve(String areaDbserve) {
this.areaDbserve = areaDbserve;
}

}

SessionFactory 类:


[code="java"]package com.og.cms.dao.impl;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceException;

import com.og.cms.AppConfig;
import com.og.cms.HttpContext;


public class SessionFactory {
private static final Map map = new HashMap();
private static final Map> factory = new HashMap>();
private static final String PUBLICDB = HttpContext.getConfig().getString(AppConfig.PUBLICDB_SUBDIVISION);

static {
EntityManagerFactory emf = map.get(PUBLICDB);
if(emf == null){
emf = Persistence.createEntityManagerFactory(PUBLICDB);
map.put(PUBLICDB, emf);
}
}
private SessionFactory(){

}

public static EntityManagerFactory getFactory(String unitName){
EntityManagerFactory emf = map.get(unitName);
if(emf == null){
Map mp = AreaFactory.getInstance().getAreaMap(unitName);
emf = Persistence.createEntityManagerFactory("hdbms",mp);
map.put(unitName, emf);
}
return emf;
}
public static EntityManager get(final String unitName){
ThreadLocal local = factory.get(unitName);
if(local == null){
local=new ThreadLocal(){
protected synchronized EntityManager initialValue() {
EntityManagerFactory emf = getFactory(unitName);
return emf.createEntityManager();
         }
};
factory.put(unitName, local);
}
EntityManager em = local.get();
if(em == null||!em.isOpen()){
em = getFactory(unitName).createEntityManager();
local.set(em);
}
return em;

}

public static void close(final String unitName) throws PersistenceException {
ThreadLocal local = factory.get(unitName);
if(local == null) return;
EntityManager em = local.get();
local.set(null);
if (em != null)
em.close();
}
}



基本测试




[code="java"]class testDao {

     public List> findAllInfoSoure(String unitName) throws  PersistenceException {
List> list = null;
EntityManager em = SessionFactory.get(unitName);
try{
list = em.createQuery("FROM xxx po ORDER BY po.xxDESC").getResultList();
}
catch(PersistenceException ex) {
throw new PersistenceException();
}
finally{
if (em.isOpen()) em.close();
}
return list;
}
}

其中:unitName 代表是哪个表


1
2
分享到:
评论

相关推荐

    Spring Boot+Jpa多数据源配置Demo(支持不同数据库)

    在现代企业级应用程序开发中,数据源管理是一个关键部分,特别是在需要处理来自多个数据库的数据时。Spring Boot结合JPA(Java Persistence API)和JdbcTemplate,为开发者提供了灵活且强大的多数据源配置能力。本...

    springBoot Jpa多数据源配置.rar

    下面将详细解释如何在Spring Boot中设置JPA的多数据源配置。 首先,我们需要理解数据源是什么。数据源是连接到数据库的桥梁,它封装了数据库连接池,提供获取数据库连接的方法。在Spring Boot中,我们可以使用`...

    spring3+springmvc+jpa+hibernate多数据源

    "spring3+springmvc+jpa+hibernate多数据源"是一个示例项目,它演示了如何在一个应用中集成Spring 3、Spring MVC、JPA 2.0以及Hibernate,以实现对多个数据源的支持。下面将详细介绍这些技术及其集成的关键点。 **...

    springboot+JPA 多数据源配置

    通过以上步骤,你就可以在Spring Boot项目中成功配置并使用JPA进行多数据源操作了。这种方式允许你灵活地管理不同数据库的数据,对于复杂的分布式系统和多租户应用特别有用。在实际开发中,还可能需要考虑数据源的...

    SpringBoot操作多数据源(JPA+JdbcTemplate)

    通过配置不同的数据源,我们可以灵活地处理多个数据库的交互,同时利用HikariCP提高性能和稳定性。在实际项目中,根据需求选择合适的方式操作数据源,可以极大地提升开发效率和系统的可维护性。

    springboot+mysql+jpa多数据源操作源码

    在Spring Boot应用中,使用Spring Data JPA与MySQL数据库进行多数据源操作是一项常见的需求,尤其是在构建分布式系统或需要处理多个数据库的应用中。本项目"springboot+mysql+jpa多数据源操作源码"旨在提供一个示例...

    springboot 2.1.2.RELEASE JPA多数据源

    在SpringBoot中实现多数据源,意味着一个应用可以连接到多个不同的数据库,这在处理分布式系统或需要隔离不同业务数据的情况下非常有用。以下是一些关于SpringBoot 2.1.2.RELEASE与JPA多数据源的关键知识点: 1. **...

    springboot-多数据源配置 -mybatis-jpa

    多数据源意味着应用程序能够连接并处理来自两个或更多数据库的数据。在Spring Boot中,我们可以使用`@ConfigurationProperties`注解来定义多个数据源的配置,如数据库URL、用户名、密码等。例如: ```java @...

    springboot+jpa配置多数据源.zip

    在现代企业级应用程序中,处理多个数据库以支持不同的业务需求是常见的场景。Spring Boot结合JPA(Java Persistence API)和AOP(Aspect Oriented Programming,面向切面编程)提供了一种优雅的方式来配置和管理多...

    spring+jpa+atomikos多数据源

    在IT行业中,尤其是在企业级应用开发中,处理多个数据库已经成为常态。"spring+jpa+atomikos多数据源"是一个重要的技术组合,用于构建能够同时连接并操作不同数据库的应用程序。下面将详细介绍这个主题涉及的知识点...

    Springboot 动态多数据源 jta分布式事务

    总之,Spring Boot的多数据源和JTA分布式事务功能为企业级应用提供了强大的支撑,让开发者可以灵活地处理复杂的数据操作和事务管理。如果你是初学者,通过在线教程和提供的`demo`项目,相信你能够快速掌握这一技能。

    SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式

    3. **事务管理**:SpringBoot默认使用LocalContainerEntityManagerFactoryBean处理JPA事务,但在多数据源环境中,需要改为使用Atomikos的`JtaPlatformTransactionManager`。此外,确保开启@...

    各种数据源配置之Spring+JPA配置BoneCP数据源

    本篇文章将详细讲解如何在Spring应用中配置JPA,并使用BoneCP作为数据源。 BoneCP是一款高效的、开源的数据库连接池,它能显著提高数据库操作性能。 首先,我们需要理解Spring与JPA的关系。Spring是企业级Java应用...

    SpringBoot+gradle+mybatis多数据源动态配置

    本项目结合了SpringBoot、Gradle和MyBatis,旨在实现多数据源的动态配置,这对于处理多个数据库或者分库分表的场景尤其有用。以下是对这个项目的详细解析: **SpringBoot** SpringBoot是由Pivotal团队提供的全新...

    Spring Jpa多数据源工程配置过程解析

    总的来说,配置Spring JPA的多数据源工程涉及多个步骤,包括添加依赖、配置属性文件、创建数据源bean以及可能的JpaRepository和事务管理。通过这种方式,你可以灵活地管理和操作多个数据库,满足复杂业务场景的需求...

    MongoDB 配置多数据源

    对于多数据源,我们需要在配置文件中定义多个数据源,并为每个数据源指定不同的连接信息,如主机地址、端口、数据库名称和认证信息。 以下是一个示例`application.yml`配置,展示如何配置两个MongoDB数据源: ```...

    SpringMVC配置多数据源实战

    使用`PlatformTransactionManager`来处理多数据源的事务管理。需要为每个数据源创建一个事务管理器,并在`determineCurrentLookupKey()`返回的键值与之匹配。 ```java @Bean(name = "db1TransactionManager") ...

    springboot druid maven多数据源(mysql+SqlServer)

    本项目将介绍如何在SpringBoot项目中结合Maven构建一个支持多数据源的系统,特别是如何处理MySQL和SQLServer两种不同的数据库类型,并使用Druid作为数据源连接池。 首先,我们需要理解“多数据源”这一概念。多数据...

    spring多数据源动态切换方案

    在企业级应用开发中,Spring框架的广泛使用使得数据源管理变得尤为重要,特别是在处理多数据库环境时。"Spring多数据源动态切换方案"是解决这一问题的关键技术,它允许应用程序根据业务需求动态选择数据源,提高了...

    springboot动态多数据源配置

    在Spring Boot应用中,动态多...总之,Spring Boot的动态多数据源配置结合JPA,提供了一种高效、灵活的解决方案,使得开发者可以轻松处理多个数据库环境。理解并掌握这一技术,对于提升Java后端开发能力具有重要意义。

Global site tag (gtag.js) - Google Analytics