mysql数据库连接池 手动编写
源码来源于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数据库连接池 手动编写的更多相关文章
- 一个简单的MySql数据库连接池的实现
package cn.hc.connectionPool; import java.io.IOException; import java.io.InputStream; import java.sq ...
- Python实现Mysql数据库连接池
python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...
- mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息
1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...
- MySql数据库连接池专题
MySql数据库连接池专题 - aspirant - 博客园https://www.cnblogs.com/aspirant/p/6747238.html
- python3 实现mysql数据库连接池
首先声明一下,这篇博客进行了通过自己的代码方式,加上这篇博客,最后总结出这段代码.参考博客连接:http://blog.csdn.net/zbc1090549839/article/details/5 ...
- MySql数据库连接池
1.传统链接(如下为示意图) 注意: (1).传统方式找DriverManager要连接,数目是有限的. (2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的 ...
- mysql数据库连接池使用(二)实现自己的数据库连接池
上一个章节,我们讲了xml文件的解析框架XMLConfiguration的使用,不懂的可以参考 Apache Commons Configuration读取xml配置具体使用. 这个章节主要实现自己的 ...
- mysql数据库连接池使用(一)dbcp方式的配置
Apache的数据库连接池 DBCP的常用配置说明,因为项目中用到了需要对其封装,所以必须先了解怎么配置以及各个配置字段的含义,理解的基础上开发我们自己的数据库连接池.可以参考官网dbcp官网. db ...
- node+mysql 数据库连接池
1. 什么是数据库连接池? 数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个池,由程序动态地对池中的连接进行申请,使用和释放. 2. 使用数据库连接池原理及优点是什么? 数据库连接池 ...
随机推荐
- SVG之初识
什么是SVG? 也许现在很多人都听说过SVG的人比较多,但不一定了解什么是SVG:SVG(Scalable Vector Graphics 一大串看不懂的英文)可伸缩矢量图形,它是用XML格式来定义用 ...
- win7 开启休眠
使用cmd命令进行开启,首先点击开始菜单,在“搜索程序和文件”中输入“cmd”,然后点击回车键.如下: 2 弹出如下图的界面,在其中最后的地方输入“powercfg -hibernate on”,然后 ...
- oracle发送邮件
1.创建发送邮件的存储过程 CREATE OR REPLACE PROCEDURE send_mail(p_recipient VARCHAR2, -- 邮件接收人 p_subject VARCHAR ...
- IOS 后台执行
在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间 ...
- Regsvr32注册ActiveX控件
命令:Regsvr32 XX.dll 注册ActiveX控件 Regsvr32命令参数:/u 卸载ActiveX控件/s 注册成功后不显示操作成功信息框/c 控制台输出/I 调用DllInstall安 ...
- double与int类型自动转换
package com.abc.test; public class SumTest { public static void main(String[] args) { //题目A:2+4+6+8+ ...
- Fedora 19 配置参考
1. 安装完Fedora 19之后,第一件事不是升级系统,而是添加源. 下载我配置好的源,非常全面,适用Fedora 19 x86_64.点我下载 打开终端,切换到repo.zip所在目录:mv re ...
- 增量与位置PID
转载:http://blog.sina.com.cn/s/blog_408540af0100b17n.html http://bbs.ednchina.com/BLOG_ARTICLE_211739. ...
- JS对select动态添加options操作[IE&FireFox兼容]
<select id="ddlResourceType" onchange="getvalue(this)"> </select> 动态 ...
- SASS语法备忘
sass语法 关于sass 3.3.0更新说明——3.3.0 sublime相关插件为:scss语法高亮,sass语法高亮,编译,保存即编译,格式化 文件后缀名 sass有两种后缀名文件:一种后缀名为 ...