纯属工作之余为了理解而写的,参考了很多博客,内容涉及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>