源码来源于http://www.toutiao.com/a6350448676050174209/,留存以供以后参考学习

先上一张项目托普图

然后分别列出各个文件的源码:

MyPool.java(就是个接口)

package com.audi;

public interface MyPool
{
PoolConnection getConnection();
void createConnections(int count);
}

MyPoolImpl.java(接口的实现类)

package com.audi;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.Vector; import com.mysql.jdbc.Driver; public class MyPoolImpl implements MyPool
{
private static String jdbcDriver = "";
private static String jdbcUrl = "";
private static String userName = "";
private static String password = "";
private static int initCount;
private static int stepSize;
private static int poolMaxSize; private static Vector<PoolConnection> poolConnections = new Vector<PoolConnection>(); public MyPoolImpl()
{
// TODO Auto-generated constructor stub
init();
} private void init()
{
// TODO Auto-generated method stub
// 读取配置文件
InputStream in = MyPoolImpl.class.getClassLoader()
.getResourceAsStream("mysqlConnection.properties");
// InputStream inputStream = new in
Properties pro = new Properties();
try
{
// 装载配置文件输入流
pro.load(in);
} catch (Exception e)
{
// TODO: handle exception
}
// 从配置文件中读取出配置参数
jdbcDriver = pro.getProperty("jdbcDriver");
jdbcUrl = pro.getProperty("jdbcUrl");
userName = pro.getProperty("userName");
password = pro.getProperty("password");
initCount = Integer.valueOf(pro.getProperty("initCount"));
stepSize = Integer.valueOf(pro.getProperty("stepSize"));
poolMaxSize = Integer.valueOf(pro.getProperty("poolMaxSize")); try
{
// 获取驱动对象并注册
Driver driver = (Driver) Class.forName(jdbcDriver).newInstance();
DriverManager.registerDriver(driver);
} catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
// 创建一定数量的初始链接
createConnections(initCount);
} @Override
public PoolConnection getConnection()
{
// TODO Auto-generated method stub
if (poolConnections.size() <= 0)
{
System.out.println("链接池为空,获取数据库链接失败!!!");
throw new RuntimeException("链接池为空,获取数据库链接失败!!!");
}
PoolConnection connection = getRealConnection(); // 如果没有成功的获取链接就创建一定数量的链接 并从中获取一个有效链接
while(connection == null)
{
createConnections(stepSize);
connection = getRealConnection();
try
{
// 这里睡眠的原因时考虑到第一次获取链接失败,可能有多个线程在等待链接资源,所以当前线程先等待一下,避开高峰
Thread.sleep(300);
} catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
}
return connection;
} // 注意有synchronized关键字
private synchronized PoolConnection getRealConnection()
{
// TODO Auto-generated method stub
for (PoolConnection conn : poolConnections)
{
// 如果当前链接空闲则返回该链接对象
if (!conn.isBusy())
{
Connection connection = conn.getConn();
try
{
// 判断获得的链接是否是有效的,如果无效就创建一个新的链接 isValid方法其实就是在定时时间到的时候执行一下sql语句
if (!connection.isValid(2000))
{
Connection validConn = DriverManager.getConnection(jdbcUrl, userName, password);
conn.setConn(validConn);
}
} catch (Exception e)
{
// TODO: handle exception
}
}
conn.setBusy(true);
return conn;
}
return null;
} // 创建链接
@Override
public void createConnections(int count)
{
// TODO Auto-generated method stub
if (poolMaxSize > 0 && poolConnections.size() + count > poolMaxSize)
{
System.out.println("创建链接对象失败,因为数据库链接数量已达上限!!");
throw new RuntimeException("创建链接对象失败,因为数据库链接数量已达上限!!");
} // 否则就开始创建链接
for (int i = 0; i < count; i++)
{
try
{
Connection conn = DriverManager.getConnection(jdbcUrl, userName, password);
// 封装链接对象 并存入vecter
PoolConnection poolConnection = new PoolConnection(conn, false);
poolConnections.add(poolConnection);
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} } }

 PoolConnection.java(里面会进行一些连接参数的配置)

package com.audi;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement; public class PoolConnection
{
private Connection conn;
private boolean isBusy = false; public Connection getConn()
{
return conn;
} public void setConn(Connection conn)
{
this.conn = conn;
} public boolean isBusy()
{
return isBusy;
} public void setBusy(boolean isBusy)
{
this.isBusy = isBusy;
} public PoolConnection(Connection conn,boolean isBusy)
{
this.conn = conn;
this.isBusy = isBusy;
} public ResultSet querySql(String sql)
{
ResultSet resultSet = null;
Statement statement = null;
try
{
statement = conn.createStatement();
resultSet = statement.executeQuery(sql);
} catch (Exception e)
{
// TODO: handle exception
}
return resultSet;
} public void close()
{
this.isBusy = false;
}
}

PoolManager.java(使用内部类的方式获取连接池对象)

package com.audi;

public class PoolManager
{
private static class CreatePool
{
private static MyPoolImpl myPoolImpl= new MyPoolImpl();
} public static MyPoolImpl getInStance()
{
return CreatePool.myPoolImpl;
}
}

最后是测试类

package com.audi;

import java.sql.ResultSet;

public class TestPool
{
private static MyPoolImpl poolImpl =PoolManager.getInStance(); public static void main(String[] args)
{
// TODO Auto-generated method stub
/*long time= System.currentTimeMillis();
for (int i = 0; i < 2000; i++)
{
System.out.println("第"+i+"次执行");
selecData();
}
System.out.println("運行時間"+(System.currentTimeMillis()-time));*/
// System.out.println(new Date());
//selecData();
// 创建2000个数据库链接线程
long time= System.currentTimeMillis();
for (int i = 0; i < 2000; i++)
{
System.out.println("第"+i+"次执行");
new Thread(new Runnable()
{
public void run()
{
selecData();
}
});
}
System.out.println("運行時間"+(System.currentTimeMillis()-time));
} public synchronized static void selecData()
{
PoolConnection connection = poolImpl.getConnection();
ResultSet resultSet = connection.querySql("select * from Student");
try
{
while (resultSet.next())
{
System.out.println(resultSet.getString("ID")+"\t"+resultSet.getString("NAME")+"\t"+resultSet.getString("AGE"));
}
resultSet.close();
connection.close();
} catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
}
}

数据库连接参数配置文件

mysqlConnection.properties

jdbcDriver=com.mysql.jdbc.Driver
jdbcUrl=jdbc\:mysql\://localhost\:3306/test
userName=root
password=w513723
initCount=10
stepSize=5
poolMaxSize=200

mysql数据库连接池 手动编写的更多相关文章

  1. 一个简单的MySql数据库连接池的实现

    package cn.hc.connectionPool; import java.io.IOException; import java.io.InputStream; import java.sq ...

  2. Python实现Mysql数据库连接池

    python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...

  3. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息

    1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...

  4. MySql数据库连接池专题

    MySql数据库连接池专题 - aspirant - 博客园https://www.cnblogs.com/aspirant/p/6747238.html

  5. python3 实现mysql数据库连接池

    首先声明一下,这篇博客进行了通过自己的代码方式,加上这篇博客,最后总结出这段代码.参考博客连接:http://blog.csdn.net/zbc1090549839/article/details/5 ...

  6. MySql数据库连接池

    1.传统链接(如下为示意图) 注意: (1).传统方式找DriverManager要连接,数目是有限的. (2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的 ...

  7. mysql数据库连接池使用(二)实现自己的数据库连接池

    上一个章节,我们讲了xml文件的解析框架XMLConfiguration的使用,不懂的可以参考 Apache Commons Configuration读取xml配置具体使用. 这个章节主要实现自己的 ...

  8. mysql数据库连接池使用(一)dbcp方式的配置

    Apache的数据库连接池 DBCP的常用配置说明,因为项目中用到了需要对其封装,所以必须先了解怎么配置以及各个配置字段的含义,理解的基础上开发我们自己的数据库连接池.可以参考官网dbcp官网. db ...

  9. node+mysql 数据库连接池

    1. 什么是数据库连接池? 数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个池,由程序动态地对池中的连接进行申请,使用和释放. 2. 使用数据库连接池原理及优点是什么? 数据库连接池 ...

随机推荐

  1. 16款最佳HTML5超酷动画演示及源码

    1.HTML5/CSS3图片选择动画 可选择多张图片 之前我们已经分享过几款很酷的HTML5图片特效,像HTML5 3D图片折叠特效.HTML5 3D旋转图片相册等应用.今天我们来分享一款既炫酷又实用 ...

  2. berkerly db 中简单的读写操作(有一些C的 还有一些C++的)

    最近在倒腾BDB,才发现自己确实在C++这一块能力很弱,看了一天的api文档,总算是把BDB的一些api之间的关系理清了,希望初学者要理清数据库基本知识中的环境,句柄,游标的基本概念,这样有助于你更好 ...

  3. 在Android项目中调用已有.so库

    注意该.so库指的是android平台的,非一般linux.unix平台:1.现有库libcom_ycan_testLib.so2.新建android项目TestLib23.添加新类:类名:testL ...

  4. VS2010使用TeeChart5的ColorGrid绘制一维距离像

    绘制一维距离像原理:使用TeeChart控件中的ColorGrid显示(X,Y,Z)三维数据,X和Z分别代表一维距离像的x轴和y轴数据,Y代表对应的数值,以不同颜色显示. 1.注册TeeChart5 ...

  5. iOS Foundation框架 -2.常用集合类简单总结

    Foundation框架中常用的类有:NSString.NSArray.NSSet.NSDictionary 以及它们对应的子类 NSMutableString.NSMutableArray.NSMu ...

  6. 【OpenCV第一篇】安装OpenCV

    [OpenCV第一篇]安装OpenCV 本篇主要介绍如何下载OpenCV安装程序,如何在VS2008下安装配置OpenCV,文章最后还介绍了一个使用OpenCV的简单小例子. <OpenCV入门 ...

  7. AngularJS(13)-包含

    AngularJS 包含 使用 AngularJS, 你可以使用 ng-include 指令来包含 HTML 内容: 实例 <body> <div class="conta ...

  8. jQuery select的操作代码

    jQuery對select的操作的实际应用代码. //改變時的事件  复制代码代码如下: $("#testSelect").change(function(){ //事件發生  j ...

  9. jqueryGrid 内置的onclickSubmit afterSubmit

    $(document).ready(function() { $('#jpgCustomers').jqGrid({ //url from wich data should be requested ...

  10. 相同的 birthday

    Description Sometimes some mathematical results are hard to believe. One of the common problems is t ...