天天看點

jpa多資料源處理

項目中需要多個資料庫,而且每個資料庫的基本資訊都是儲存在一個公共庫(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]

根據資料庫名稱取連結屬性類:

[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;

}

}[/code]

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;

}

}[/code]

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;

}

}[/code]

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]

基本測試

[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;

}

}[/code]

其中:unitName 代表是哪個表