菜鸟的java多数据库切换手动实现,欢迎指点

纯属工作之余为了理解而写的,参考了很多博客,内容涉及java动态装载,xml解析,数据库连接池,可能未写详尽,欢迎广大朋友评论指出~大笑,共同学习!


目录结构:




package com.vyin.db.bean;

/**
* @ author liu qihang:
* @version 创建时间 2017年6月23日上午11:33:32
*/
public class A_db {

private String aUrl;
private String aDriver;
private String aUserName;
private String aPassword;


public String getaUrl() {
return aUrl;
}


public void setaUrl(String aUrl) {
this.aUrl = aUrl;
}


public String getaDriver() {
return aDriver;
}


public void setaDriver(String aDriver) {
this.aDriver = aDriver;
}


public String getaUserName() {
return aUserName;
}


public void setaUserName(String aUserName) {
this.aUserName = aUserName;
}


public String getaPassword() {
return aPassword;
}


public void setaPassword(String aPassword) {
this.aPassword = aPassword;
}




}




/*************************************************************/


package com.vyin.db.bean;
/**
* @ author liu qihang:
* @version 创建时间 2017年6月23日下午12:40:20

*/
public class B_db {


private String bUrl;
private String bDriver;
private String bUserName;
private String bPassword;

public String getbUrl() {
return bUrl;
}


public void setbUrl(String bUrl) {
this.bUrl = bUrl;
}


public String getbDriver() {
return bDriver;
}


public void setbDriver(String bDriver) {
this.bDriver = bDriver;
}


public String getbUserName() {
return bUserName;
}


public void setbUserName(String bUserName) {
this.bUserName = bUserName;
}


public String getbPassword() {
return bPassword;
}


public void setbPassword(String bPassword) {
this.bPassword = bPassword;
}


}

/*************************************************************/


package com.vyin.db.pools;


import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;


import com.vyin.db.bean.A_db;
import com.vyin.db.bean.B_db;
import com.vyin.db.utils.DynamicLoadBean;


/**
 * @ author liu qihang:
 * 
 * @version 创建时间 2017年6月23日上午11:33:21
 * @param <T>
 * 
 */
public class ConnectionPools<T> {


private String jdbcDriver;// 数据库驱动
private String dbUrl;// 数据 URL
private String dbUsername;
private String dbPassword;
private int initConnections = 10;
private int maxConnections = 50;
private int incrementalConnections = 5;
private LinkedList<PooledConnection> listConnections = null;


@SuppressWarnings("hiding")
public static <T> T getDataSource() {
return DynamicLoadBean.sureDBInstance();
}


public synchronized void createPool() throws Exception {
if (listConnections != null)
return;
Driver driver = (Driver) Class.forName(jdbcDriver).newInstance();
DriverManager.deregisterDriver(driver);
listConnections = new LinkedList<PooledConnection>();
createConnections(initConnections);
System.out.println("create pool connection success !");
}


private void createConnections(int numConnections) throws SQLException {
for (int i = 0; i < numConnections; i++) {
if (this.maxConnections > 0 && listConnections.size() >= this.maxConnections) {
break;
}
PooledConnection pooledConnection = new PooledConnection(newConnection(), false);
listConnections.add(pooledConnection);
}
}


private Connection newConnection() throws SQLException {
Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
// 获取数据库允许创建的最大连接数量,自定义的最大连接数需小于等于允许的连接数量
if (listConnections != null && listConnections.size() == 0) {
DatabaseMetaData dbmd = conn.getMetaData();
int driverMaxConnection = dbmd.getMaxConnections();
if (driverMaxConnection != 0 && maxConnections > driverMaxConnection) {
this.maxConnections = driverMaxConnection;
}
}
return conn;
}


public synchronized Connection getConnection() throws SQLException {
if (listConnections == null) {
return null;
}
Connection conn = getFreeConnection();
while (conn == null) {
wait(30);
conn = getFreeConnection();
}
return conn;
}


private Connection getFreeConnection() throws SQLException {
Connection conn = findFreeConnection();
if (conn == null) {
createConnections(incrementalConnections);
conn = findFreeConnection();
if (conn == null) {
System.out.println("get connection failed");
return null;
}
}
return conn;
}


private Connection findFreeConnection() throws SQLException {
Connection conn = null;
for (int i = 0; i < listConnections.size(); i++) {
PooledConnection pconn = listConnections.get(i);
if (!pconn.isBusy) {
pconn.setBusy(true);
conn = pconn.getConnection();
}
break;
}
return conn;
}


private void wait(int mSeconds) {
try {
Thread.sleep(mSeconds);
} catch (InterruptedException e) {
}
}


public class PooledConnection {
private Connection connection;
private boolean isBusy;// false为未使用,true为使用状态


public PooledConnection(Connection connection, boolean isBusy) {
this.connection = connection;
this.isBusy = isBusy;
}


public Connection getConnection() {
return connection;
}


public void setConnection(Connection connection) {
this.connection = connection;
}


public boolean isBusy() {
return isBusy;
}


public void setBusy(boolean isBusy) {
this.isBusy = isBusy;
}
}


public int getIncrementalConnections() {
return incrementalConnections;
}


public void setIncrementalConnections(int incrementalConnections) {
this.incrementalConnections = incrementalConnections;
}


public int getInitConnections() {
return initConnections;
}


public void setInitConnections(int initConnections) {
this.initConnections = initConnections;
}


public int getMaxConnections() {
return maxConnections;
}


public void setMaxConnections(int maxConnections) {
this.maxConnections = maxConnections;
}


public ConnectionPools(String jdbcDriver, String dbUrl, String dbUsername, String dbPassword) {
this.jdbcDriver = jdbcDriver;
this.dbUrl = dbUrl;
this.dbUsername = dbUsername;
this.dbPassword = dbPassword;
}


public static void main(String[] args) throws Exception {
ConnectionPools cp = null;
Object o = getDataSource();
if (o instanceof A_db) {
A_db a_db = (A_db) o;
System.out.println("数据库A");
cp = new ConnectionPools<>(a_db.getaDriver(), a_db.getaUrl(), a_db.getaUserName(), a_db.getaPassword());
} else if (o instanceof B_db) {
B_db b_db = (B_db) o;
System.out.println("数据库B");
cp = new ConnectionPools<>(b_db.getbDriver(), b_db.getbUrl(), b_db.getbUserName(), b_db.getbPassword());
}
cp.createPool();


Connection conn = cp.getConnection();
System.out.println(conn);


}


}



/**********************************************************/


package com.vyin.db.utils;


import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


import com.vyin.db.bean.A_db;


/**
 * @ author liu qihang:
 * 
 * @version 创建时间 2017年6月23日下午12:41:54
 */
public class DynamicLoadBean {


private final static String DB_XML = "db.xml";


public static <T> T sureDBInstance() {
T t = null;
String realPath = DynamicLoadBean.class.getResource("/" + DB_XML).getFile();
System.out.println(realPath);
File file = new File(realPath);
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(file);


String kind = document.selectSingleNode("dbs/choice").getText();


Element element = (Element) document.selectSingleNode("dbs/" + kind);
String className = element.attribute("class").getValue();
List<?> list = element.selectNodes("property");
Map<String, String> keyValuePairs = new HashMap<String, String>();
Iterator<?> items = list.iterator();
while (items.hasNext()) {
Element ele = (Element) items.next();
String pName = ele.attribute("name").getValue();
String pType = ele.attribute("type").getValue();
String pValue = ele.element("value").getText();
keyValuePairs.put(pName, pType + ";" + pValue);
}
t = getNewInstance(className, keyValuePairs);
} catch (Exception e) {
e.printStackTrace();
}
return t;
}


@SuppressWarnings("unchecked")
public static <T> T getNewInstance(String className, Map<String, String> kvp) {
T t = null;
try {
t = (T) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
for (Map.Entry<String, String> entry : kvp.entrySet()) {
@SuppressWarnings("rawtypes")
Class c = null;
String[] values = entry.getValue().split(";");
String type = values[0];
String value = values[1];
String methodStr = "set" + entry.getKey();


try {
c = Class.forName(type);
Method method = t.getClass().getMethod(methodStr, c);
method.invoke(t, value);
} catch (Exception e) {
e.printStackTrace();
}
}
return t;
}


public static void main(String[] args) {
A_db a_db = (A_db) DynamicLoadBean.sureDBInstance();
System.out.println(a_db.getaDriver());
}


}


/*********************************/


db.xml 



<?xml version="1.0" encoding="UTF-8"?>
<dbs>
<choice>a_db</choice>
<a_db name="a_db" class="com.vyin.db.bean.A_db">
<property name="aUrl" type="java.lang.String">
<value>jdbc:mysql://*********************</value>
</property>
<property name="aDriver" type="java.lang.String">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="aUserName" type="java.lang.String">
<value>***********</value>
</property>
<property name="aPassword" type="java.lang.String">
<value>************</value>
</property>
</a_db>
<b_db name="b_db" class="com.vyin.db.bean.B_db">
<property name="bUrl" type="java.lang.String">
<value>jdbc:mysql:/**************</value>
</property>
<property name="bDriver" type="java.lang.String">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="bUserName" type="java.lang.String">
<value>***********</value>
</property>
<property name="bPassword" type="java.lang.String">
<value>***********</value>
</property>
</b_db>


</dbs>


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值