`
jjjachyty
  • 浏览: 623 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
最近访客 更多访客>>
社区版块
存档分类
最新评论

自定义框架TFrameWork之自定义jdbc连接池

 
阅读更多
最近一直想自己封装下jdbc,写个orm,在此拿出来分享分享我的代码,让高人指点指点,共同进步,也做个备份
先上代码
DataSource.java
package org.tension.framework.common.das;

import java.io.InputStream;
import java.util.Iterator;

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


/**
* 数据源
* @author tension
*
*/
public class DataSource {
protected static String driverClassName;
protected static String url;
protected static String user;
protected static String password;
protected static int poolSize;
protected static int maxUseCount;
protected static int maxPoolSize;
protected static int minPoolSize;
protected static String transaction_Isolation;

static{
try {
InputStream ips = DataSource.class.getClassLoader().getResourceAsStream("user-config.xml");
SAXReader reader = new SAXReader();
Document doc = null;
doc = reader.read(ips);
Element root = doc.getRootElement();
Element  module = root.element("module");
Element group = module.element("group");
Iterator<?> configValue = group.elementIterator("configValue");
while(configValue.hasNext()){
Element e = (Element) configValue.next();
String key = e.attributeValue("key");
String value = e.getText();
if("DriverClass".equalsIgnoreCase(key)){
driverClassName = value;
}else if("Url".equalsIgnoreCase(key)){
url = value;
}else if("UserName".equalsIgnoreCase(key)){
user = value;
}else if("Password".equalsIgnoreCase(key)){
password = value;
}else if("PoolSize".equalsIgnoreCase(key)){
poolSize = Integer.valueOf(value);
}else if("MaxUseCount".equalsIgnoreCase(key)){
maxUseCount = Integer.valueOf(value);
}else if("MaxPoolSize".equalsIgnoreCase(key)){
maxPoolSize = Integer.valueOf(value);
}else if("MinPoolSize".equalsIgnoreCase(key)){
minPoolSize = Integer.valueOf(value);
}else if("Transaction-Isolation".equalsIgnoreCase(key)){
transaction_Isolation = value;
}
}
Class.forName(driverClassName);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
}
至于为什么没有去实现DataSource接口,我觉得我暂时不用它,所有没有去实现


ConnectionPool.java
package org.tension.framework.common.das;

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

/**
*
* 2012-9-12
*
* @author <a href="mailto:429810818@qq.com">tension</a>
*
*/
public class ConnectionPool extends DataSource{
/**当前连接数*/
int currentCount = 0;

LinkedList<Connection> connectionsPool = new LinkedList<Connection>();


    /**
     * 默认构造方法,一次性获得poolSize个连接放进connectionsPool连接池中
     */
public ConnectionPool() {
CreateConnectionPool(poolSize);
}
/**
* 获取连接记录当前连接个数
* 如果连接池还有连接则直接从连接池取连接,如果连接大于最大连接数
* @return
* @throws SQLException
*/
public Connection getConnection() throws SQLException {
synchronized (connectionsPool) {
if (this.connectionsPool.size() > 0){
this.currentCount++;
return this.connectionsPool.removeFirst();
}
            if(this.currentCount < maxPoolSize){
            int buffer = this.currentCount + minPoolSize;
            if (buffer < maxPoolSize || buffer == maxPoolSize) {
    this.currentCount++;
    CreateConnectionPool(minPoolSize);
    }else{
    this.currentCount++;
    CreateConnectionPool(buffer - maxPoolSize);
    }
            return this.connectionsPool.removeFirst();
            }

throw new SQLException("暂无连接可用");
}
}
/**
* 创建连接放入连接池中,缓冲连接池
* @param count 个数
*/
public void CreateConnectionPool(int count){
try {
for (int i = 0; i < count; i++) {
this.connectionsPool.addLast(this.createConnection());
this.currentCount++;
}
} catch (SQLException e) {
throw new ExceptionInInitializerError(e);
}
}
    /**
     * 释放连接方法
     * 把用完的连接重新放回连接池中
     * @param conn
     */
public void free(Connection conn) {
this.connectionsPool.addLast(conn);
}
    /**
     * 创建连接
     * @return warpedConnection
     * @throws SQLException
     * @author tension
     */
private Connection createConnection() throws SQLException {
Connection realConn = DriverManager.getConnection(url, user, password);
ConnectionHandler proxy = new ConnectionHandler(this);
return proxy.bind(realConn);
}
}
这个就是所谓的连接池了,简单,没有现在主流的那么NB,供学习

ConnectionHandler
package org.tension.framework.common.das;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;

/**
* 连接池的代理类
* 用于处理Connection的colse方法,把连接放回连接池
* @author tension
* 2012-09-12
*/
class ConnectionHandler  extends DataSource implements InvocationHandler{
/**真正的连接对象 */
private Connection realConnection;
/**代理的连接对象 */
private Connection warpedConnection;
/**连接池*/
private  ConnectionPool conn;
/**当前用户使用的次数*/
private int currentUserCount = 0;
    /**
     * 默认构造方法
     * @param conn 连接池
     */
ConnectionHandler(ConnectionPool conn) {
this.conn = conn;
}
    /**
     * java.sql.Connection的代理方法
     * @param realConn warpedConnection 代理后的对象
     * @return
     */
Connection bind(Connection realConn) {
this.realConnection = realConn;
this.warpedConnection = (Connection) Proxy.newProxyInstance(this
.getClass().getClassLoader(), new Class[] { Connection.class },
this);
return warpedConnection;
}
    /**
     * 方法拦截
     * 如果为close方法的话不直接调用真正Connection的close方法
     * 如果使用次数小于5次的话就放回连接池中否则关闭这个连接
     */
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if ("close".equals(method.getName())) {
this.currentUserCount++;
if (maxUseCount == 0 || this.currentUserCount < maxUseCount)
this.conn.connectionsPool.addLast(this.warpedConnection);
else {
this.realConnection.close();
this.conn.currentCount--;
}
}
return method.invoke(this.realConnection, args);
}

}
Connection的代理,主要是修改colse方法
user-config.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<application>
    <module name="DataSource">
<group name="default">
<configValue key="DriverClass">oracle.jdbc.driver.OracleDriver</configValue>
<configValue key="Url">jdbc:oracle:thin:@tension:1521:ORCL</configValue>
<configValue key="UserName">xxx</configValue>
<configValue key="Password">ooo</configValue>
<configValue key="PoolSize">1</configValue><!-- 初始大小 -->
<configValue key="MaxUseCount">0</configValue> <!-- 最大连接数 使用次数-->
<configValue key="MaxPoolSize">3</configValue> <!-- 最大连接数 -->
<configValue key="MinPoolSize">2</configValue><!-- 每次增长 -->
<configValue key="Transaction-Isolation">ISOLATION_READ_COMMITTED</configValue><!-- 事物隔离级别 -->
</group>
    </module>

</application>
分享到:
评论

相关推荐

    数学建模拟合与插值.ppt

    数学建模拟合与插值.ppt

    [net毕业设计]ASP.NET教育报表管理系统-权限管理模块(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    mysql相关资源.txt

    mysql相关资源.txt

    利用HTML+CSS+JS的国漫分享网站(响应式)

    此项目为一个HTML+CSS+JS的国漫分享网站,用户可以在此网站中观看自己喜欢的国漫。此网站共有4个页面,分别为首页,最新动态,热门推荐,分类。页面动漫图片齐全,内容可更改。可用于期末课程设计或个人课程设计。

    Python爬虫爬取漫画

    Python爬虫爬取漫画

    C++语言编程用模拟退火算法解决旅行商问题

    模拟退火算法应用。C++语言编程用模拟退火算法解决旅行商问题。该资源包含模拟退火算法C++语言的源代码。模拟退火算法是一种基于概率的全局优化算法,最初来自于物理学中的退火过程。它通过模拟金属冷却时原子排列逐渐趋于最低能量状态的过程来寻找问题的最优解。模拟退火算法常用于解决非线性、组合优化问题,特别适合于大规模、复杂的搜索空间。

    传感器试题及答案.doc

    传感器试题及答案.doc

    [net毕业设计]ASP.NET网上书店(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    MongoDB数据表基本操作中文最新版本

    本文档主要讲述的是MongoDB数据表基本操作;希望对大家会有帮助;感兴趣的朋友可以过来看看

    1-全国各省废气、废水排放二氧化硫、氮氧化物、烟尘、颗粒物排放量统计数据2011-2021年-社科数据.zip

    本数据集提供了2011至2021年间全国各省废气和废水中主要污染物的排放量统计数据。数据涵盖了二氧化硫、氮氧化物、烟尘和颗粒物等关键污染物的排放量,为研究中国环境状况和污染物排放趋势提供了宝贵信息。数据显示,2011-2021年间,各省的二氧化硫排放量从数十万吨到数百万吨不等,其中广东、广西、海南等省份的排放量较高。氮氧化物排放量同样显示出地域差异,北京、天津等北方城市的排放量相对较低,而一些工业大省如河北、山西的排放量较高。颗粒物排放量统计显示,工业源和生活源是主要的排放源,其中工业源排放量占比较大。这些数据不仅对环保政策制定者具有参考价值,也为学术研究提供了实证基础。

    脉冲宽度测量单片机课程设计.doc

    脉冲宽度测量单片机课程设计.doc

    [net毕业设计]ASP.NET在线毕业论文提交系统的设计与实现(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    求职与招聘(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    [net毕业设计]ASP.NET视频点播系统的设计与实现(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    全国矢量地图数据【国道+高速】-ArcGis Shape 格式数据集

    全国矢量地图数据【国道+高速公路】ArcGIS Shape格式数据集是一种专门用于地理信息系统(GIS)的矢量数据集,包含中国范围内国道和高速公路的详细路网信息。该数据集广泛应用于交通规划、导航、物流分析和灾害应急等领域,具有高精度和易用性。 数据集特点: 1. 数据内容: 国道:包括以“G”开头的国家级公路,如G1京哈高速、G107国道等。 高速公路:包括全国范围内的所有高速公路网,覆盖主要经济区、城市和边境口岸。 属性数据: 道路编号(国道或高速公路编号)。 道路名称。 道路等级(如一级、二级、快速路等)。 起点和终点坐标。 道路长度(单位:公里)。 相关属性(如路段建成年份、设计速度、车道数等)。 2. 数据格式: **Shapefile(.shp)**格式,支持主流GIS软件(如ArcGIS、QGIS)及数据处理工具(如Python、Matlab)。 3. 投影坐标系: 一般采用WGS84地理坐标系,或可根据需求转换为**GCJ-02(火星坐标系)**以配合国内导航应用。

    4.html

    4

    ASP网上作业提交系统(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    Oracle常用分析函数说明中文最新版本

    Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。 感兴趣的朋友可以过来看看

    1-商道融绿ESG评级季度数据及分项ESG评级2015-2022年-社科数据.zip

    商道融绿ESG评级季度数据及分项ESG评级2015-2022年的数据集提供了一个全面评估上市公司在环境、社会和公司治理(ESG)方面表现的视角。该数据集覆盖了2015至2022年间的数据,包含了沪深A股上市公司以及港股通的香港上市公司。数据集包含了多个维度的指标,如公司代码、公司名称、评级日期、ESG综合评级、历史评级、财务状况和所属行业等,共计13个指标。这些指标不仅包括了ESG评级,还涵盖了公司的财务分析,例如总市值、流通市值、市盈率PE(TTM)、每股收益EPS(TTM)、每股营业收入(TTM)以及每股经营活动产生的现金流量净额(TTM)等。此外,数据集还提供了证监会行业和Wind行业的分类信息,为研究者提供了一个多角度分析上市公司ESG表现的工具。该数据集对于投资者、资产管理公司以及企业自身在可持续发展报告撰写和风险管理中具有重要参考价值。

    WPF树菜单拖拽功能,下级目录拖到上级目录,上级目录拖到下级目录.zip

    WPF树菜单拖拽功能,下级目录拖到上级目录,上级目录拖到下级目录.zip

Global site tag (gtag.js) - Google Analytics