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. 使用数据库连接池原理及优点是什么? 数据库连接池 ...
随机推荐
- Part 59 to 60 Difference between Convert ToString and ToString,String and StringBuilder
Part 59 Difference between Convert ToString and ToString Part 60 Difference between String and Strin ...
- HTML之调用摄像头实现拍照和摄像功能
应该有很多人知道,我们的手机里面有个功能是“抓拍入侵者”,说白了就是在解锁应用时如果我们输错了密码手机就会调用这一功能实现自动拍照. 其实在手机上还有很多我们常用的软件都有类似于这样的功能,比如微信扫 ...
- Cocos2d-x场景生命周期函数介绍
层(Layer)的生命周期函数有如下: init().初始化层调用. onEnter().进入层时候调用. onEnterTransitionDidFinish().进入层而且过渡动画结束时候调用. ...
- 细说SQL 连接
连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句 也可以包含搜索条件,以进一步筛选连接条件所选的行. ...
- 20141128—JavaScript对象
JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... String 对象的 length 属性来获得字符串的长度: var message="Hello World!& ...
- div 显示与隐藏
visibility隐藏的对象还保留对象显示时所占的物理空间,display则不保留.可以保存下面的代码看看效果: 具体步骤: 代码示例: <div style="border:1px ...
- Linux开机启动程序详解[转]
Linux开机启动程序详解 我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤 ...
- mysql:The total number of locks exceeds the lock table size
使用mysql InnoDB存储引擎进行大量数据的更新,删除的时候容易引发”The total number of locks exceeds the lock table size”问题,解决方法之 ...
- 《Mail电子邮件日志存储的管理》RedHat6.3——以一举三
我们都知道很多日志的模块都是放在这下面的 要是想修改或是添加其他服务的日志,怎么办?修改下面的配置文件 测试下是否ok 轮转日志和定位分析和分析日志汇总报告: 安装logwatch软件包,这个没啥说的 ...
- Nginx +keepalived
Nginx +keepalived 配置高可用的Nginx 准备环境: 节点node17,node18 lftp 172.16.0.1:/pub/Sources/6.x86_64/nginx ...