package com.yunchow.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
/**
* 自定义数据源
* @author yunchow
* @version 1.2 09/8/6
*/
public class MyDataSource {
private static final String DRIVER_CLASS_NAME;
private static final String URL;
private static final String USER;
private static final String PASSWORD;
private static final int INIT_CONNECTION;
private static final int MAX_CONNECTION;
private static final int MAX_IDLE_CONNECTION;
/** 当前连接数 **/
private static int currentConnection = 0;
/** 连接缓冲池 */
private static final LinkedList<Connection> pool;
/** 正在等待连接的线程个数 **/
private static int waitCount = 0;
static {
DRIVER_CLASS_NAME = JdbcConfigBean.getInstance().getProperty("driver");
URL = get("url");
USER = get("user");
PASSWORD = get("password");
String init = get("initConnection");
if(init != null)
INIT_CONNECTION = Integer.parseInt(init);
else
INIT_CONNECTION = 5;
String max = get("maxConnection");
if(max != null)
MAX_CONNECTION = Integer.parseInt(max);
else
MAX_CONNECTION = 10;
String idle = get("idleConnection");
if(idle != null)
MAX_IDLE_CONNECTION = Integer.parseInt(idle);
else
MAX_IDLE_CONNECTION = INIT_CONNECTION;
pool = new LinkedList<Connection>();
try {
// 加载驱动
Class.forName(DRIVER_CLASS_NAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public MyDataSource() {
for(int i=0; i<INIT_CONNECTION; i++) {
currentConnection ++;
pool.addLast(createConnectionProxy());
}
new PoolScan().start(); // 启动后台线程,扫描连接池
}
/**
* 扫描当前池里的空闲线程,并将其释放
*/
private class PoolScan extends Thread {
public void run() {
try {
while(true) {
//System.out.print("当前连接数: " + pool.size());
//System.out.println("\t最多空闲数: " + MAX_IDLE_CONNECTION);
Thread.sleep(3000); // 每一秒扫描一次连接池
if(pool.size() > MAX_IDLE_CONNECTION) {
//System.out.println("发现多于的空闲连接");
for(int i=0; i<pool.size()-MAX_IDLE_CONNECTION; i++) {
((DBSourceRelease)pool.removeFirst()).release(); // 释放连接
currentConnection --; // 将当前可用连接数减一
System.out.println("Thread-daemo : release();");
}
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
private static Connection createConnectionProxy() {
Connection proxy = null;
// System.out.println("createConnectionProxy");
try {
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
// System.out.println("xxxxxxxx"+conn);
proxy = new MyConnection(conn).getProxy();
} catch(Exception ex) {
throw new ExceptionInInitializerError(ex);
}
return proxy;
}
private static String get(String arg) {
return JdbcConfigBean.getInstance().getProperty(arg);
}
/**
* 从缓冲池中获取一个连接,如果连接还没有达到最大的连接数,便等待
* 如果还等不到,就抛出数据库异常
*/
public Connection getConnection() throws SQLException {
if(pool.size() > 0) {
synchronized(pool) {
if(pool.size()>0)
return pool.removeFirst();
}
} else if(currentConnection < MAX_CONNECTION) {
currentConnection ++;
return createConnectionProxy();
} else if(currentConnection == MAX_CONNECTION) {
synchronized(pool) {
try {
waitCount ++;
//System.out.println("wait .... ");
pool.wait();
if(pool.size()>0)
return pool.removeFirst();
} catch(Exception ex) {
throw new SQLException("MyDataSource : timeout ");
}
}
throw new SQLException("MyDataSource : timeout ");
}
throw new SQLException("MyDataSource : no more connection ");
}
/**
* 归还连接, 同时还要唤醒正在等待中的线程
*
*/
public static void rebackConnection(Connection conn) {
synchronized(pool) {
pool.addLast(conn);
if(waitCount > 0) {
pool.notifyAll();
//System.out.println("notifyAll .... ");
}
}
}
}
分享到:
相关推荐
通过简单的demo实现SpingBoot多数据源配置并动态切换多数据源
主要介绍了谈谈Spring Boot 数据源加载及其多数据源简单实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
springboot+mybatis多数据源+动态数据源配置(连接池),mysql数据库,代码实现了简单的读写分离,但是不建议这种操作,建议使用数据库中间件进行读写分离,例如使用mycat进行读写分离主从热备,使用该代码对于多个...
Java中的数据源就是javax.sql.DataSource。DataSource的创建可以有不同的实现。 -JNDI方式创建DataSource -Apache提供的简单连接池创建数据源 -C3P0方式创建数据源 -Proxool方式创建数据源 -BoneCP方式创建数据源
云雀 是一款数据集成工具,实现异构数据源的整合,帮助企业构建数据仓库、数据湖 等应用架构。云雀目前支持数据源达到14种,能够实现异构数据源的同步。云雀支持拖拉拽的图形化的操作,用户可以通过页面的组装输入和...
springboot+mybatis+mysql+AbstractRoutingDataSource实现多数据源切换(一写多读数据源)项目中包含完整的demo案例配备文档说明,亲测可用;实现简单,代码思路清晰.
java简单分布式架构,多个数据源,线程池创建多线程访问数据库表,提高效率
springmvc mybatis 整合druid多数据源配置 实现简单的读写分离,windows上mysql主从复制
springboot完美实现多数据源,简单易学。全工程无多余代码,只有数据源配置和两组controller和mapper测试类,绝对原创。希望能帮到springboot初学者
项目框架是springMVC+hibernate,一个简单的demo易懂,数据库配置自己修改datasource.properties文件,其中连接了两个MySQL数据库,数据库分别各有一张表,一张student表和一张t_user需要自己创建
DataX3.0 概览 DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 设计理念 为了解决异构数据...
在查阅大量多数据源配置资料和文章并结合工作实践的基础上开发了一个简单实用的spring boot动态多数据源demo,该demo主要功能如下: 自定义多数据源类MultiplyDataSource(继承HikariDataSource),通过多线程类...
基于springboot实现的多数据源配置,配置简单明了,欢迎下载
RDLC报表绑定本地数据源 ============================= 1、简单易用的控件,特别是Table控件,非常方便字段在报表上的排列 2、灵活的可定制性,用XML来描述一个报表相关的一切 3、高度可编程性,在你的项目中,甚至...
点击出现的下拉菜单,简单设置数据源就可以实现效果
SpringBoot2.x 继承 AbstractRoutingDataSource 动态数据源切换实现 JPA读写分离。 使用MyCat代理MySQL8数据库,添加root账户(读写)和user账户(只读)模拟读写简单分离。
jasperreport创建多个List数据源报表 通多个detail实现多个table效果,简单 快捷
针对用户需求选择访问不同...其次,实现简单,易于维护。这个方案虽然我说了这么多东西,其实都是分析,真正需要我们写的代码就只有MultiDataSource、SpObserver两个类。 最后,这个方案可以使单数据源与多数据源兼容。
springboot+mybatis多数据源配置整合。一个最简单的测试用例。实现了数据库数据处理及springboot多数据源问题。亲测