java学习笔记—标准连接池的实现(27)
javax.sql.DataSource.
Java.sql.*
DataSource 接口由驱动程序供应商实现。共有三种类型的实现:
- 基本实现 - 生成标准的 Connection 对象 – 一个DataSource数据源中,只有一个Connection ,这个不是池管理。
- 连接池实现 [W1] - 生成自动参与连接池的 Connection 对象。
- 分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。JTA.jar – SUN。
标准的连接池,要求:
1:实现dataSource接口。
2:声明一个集合类用于管理多个连接。
3:必须要拥有一种能力,回收连接。
4:必须要实现一个方法,getConnection以获取一个连接。
5:实现DataSource接口的类,一般不能拥有static池对象。List.
6:在一个程序中,要求只拥有一个DataSource实例就可以了。
以下是具体的实现:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import javax.sql.DataSource;
/**
* 标准的连接
*/
public class DBPool implements DataSource {
//声明一个池管理对象
private LinkedList<Connection> pool = new LinkedList<Connection>();
//在初始化这个DataSourc的子类时在构造方法设置多个连接
public DBPool(){
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///db909?characterEncoding=UTf8";
for(int i=;i<;i++){
Connection con = DriverManager.getConnection(url,"root","");
//将生成的这个连接。放到pool
pool.add(con);
}
}catch(Exception e){
throw new RuntimeException(e.getMessage(),e);
}
}
public Connection getConnection() throws SQLException {
return pool.removeFirst();
}
///其他的方法。不实现
}
2:实现连接的回收
package cn.itcast.utils; import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import javax.sql.DataSource;
/**
* 标准的连接
*/
public class DBPool implements DataSource {
//声明一个池管理对象
private LinkedList<Connection> pool = new LinkedList<Connection>();
//在初始化这个DataSourc的子类时在构造方法设置多个连接
public DBPool(){
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///db909?characterEncoding=UTf8";
for(int i=;i<;i++){
final Connection con = DriverManager.getConnection(url,"root","");
Object proxyedConn =
Proxy.newProxyInstance(DBPool.class.getClassLoader(),
new Class[]{Connection.class},
new InvocationHandler() {
public Object invoke(Object proxyedConnection, Method method, Object[] args)
throws Throwable {
if(method.getName().equals("close")){
synchronized (pool) {
pool.addLast((Connection) proxyedConnection);
pool.notify();
}
return null;
}
//目标方法的返回值
Object returnValue=method.invoke(con, args);
return returnValue;
}
});
pool.add((Connection) proxyedConn);
}
}catch(Exception e){
throw new RuntimeException(e.getMessage(),e);
}
}
public Connection getConnection() throws SQLException {
synchronized (pool) {
if(pool.size()==){
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return getConnection();
}
Connection con = pool.removeFirst();
System.err.println("siize:"+pool.size());
return con;
}
}
}
java学习笔记—标准连接池的实现(27)的更多相关文章
- java学习笔记—c3p0连接池与元数据分析(42)
第一步:导入c3p0包 第二步:在classpath目录下,创建一个c3p0-config.xml <?xml version="1.0" encoding="UT ...
- 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal
什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...
- java学习笔记—第三方数据库连接池包1(29)
第一步:导入dbcp包 第二步:通过核心类连接数据 BasicDataSource它是javax.sql.DataSrouce的子类. 一个工具类:BasicDataSourceFactory. 手工 ...
- Java学习笔记42(数据库连接池 druid连接池)
druid连接池: 是阿里的连接池,druid的稳定性及效率都很高,目前用的比较广,所以建议开发过程中尽量用druid连接池(支持国产最重要) druid连接池也需要配置文件,配置文件必须是prope ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- 20145230《java学习笔记》第九周学习总结
20145230 <Java程序设计>第9周学习总结 教材学习内容 JDBC JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作, ...
- 20145330第九周《Java学习笔记》
20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...
- 20155234 2016-2017-2第十周《Java学习笔记》学习总结
20155234第十周<Java学习笔记>学习总结 教材学习内容总结 网络编程 在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定 ...
- 20155234 2610-2017-2第九周《Java学习笔记》学习总结
20155234第九周<Java学习笔记>学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC(Ja ...
随机推荐
- YII cookie和session的使用方法
设置cookie://首先新建cookie$cookie = new CHttpCookie(‘mycookie’, ‘this is my cookie’);//定义cookie的有效期$cooki ...
- 提交iframe页面中的表单
function getIframeDoc(id){ var doc; if (document.all){//IE do ...
- c# 将json数据转为键值对
string json = "{\"orderId\":\"000001\",\"haha\":\"001\" ...
- Jboss:The LogManager was not properly installed (you must set the "java.util.logging.manager" system prop
可能是jboss的服务器版本选择不对 ,比如我本地的Jboss服务器版本是 jboss-as-web-7.0.2.Final,选择的服务器版本是JBOOS V7.1 Runtime ,就会报上面 ...
- modern.IE
1.主要测试IE浏览器的兼容性问题 2.网站上提供各种虚拟机来表现兼容性问题,可以像平常一样使用浏览器测试,但是中国访问速度比较慢 3.网址:http://loc.modern.ie/zh-cn/vi ...
- readonly const
readonly:只读域,只能在初始化--声明初始化或构造器初始化--的过程中赋值,其他地方不能进行对只读域的赋值操作,否则编译器会报错.只读域可以是实例域也可以是静态域.只读域的类型可以是C#语言的 ...
- CSS使文字、大小不固定的图片垂直居中
一:单行文字垂直居中 使用line-height为父元素高度即可. 二:多行文字垂直居中 使用display:table-cell属性. 将父元素设置为display:table-cell,同时ver ...
- UNITY_INITIALIZE_OUTPUT宏
UNITY_INITIALIZE_OUTPUT宏 UNITY_INITIALIZE_OUTPUT(type,name) –此宏用于将给定类型的名称变量初始化为零.在使用旧版标准所写的Shader时,经 ...
- Linux下patch的制作和应用
转自:http://blog.chinaunix.net/u3/100239/showart_1984963.html 首先介绍一下diff和patch.在这里不会把man在线文档上所有的选项都介绍一 ...
- 2-ubuntu下访问window的磁盘
双系统Ubuntu无法进入Windows磁盘的解决方法 有些用户在电脑上安装了Ubuntu和Win10的双系统,正常情况下Ubuntu是可以正常访问Windows磁盘的.但是有些用户就是无法再Ubun ...