自定义DB连接池实现
实现一个简单的数据库连接池
1,连接池接口
package dbsource; import java.sql.Connection;
import java.sql.SQLException; /**
* 连接池接口
* @author lxz
*
*/
public interface DBSource { Connection getConnection() throws SQLException; void closeConnection(Connection con) throws SQLException;
}
2,连接池实现
package dbsource; import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties; public class BasicDBSource implements DBSource { private final static String URL = "url";
private final static String PASSWORD = "password";
private final static String USER = "user";
private final static String POOLMAX = "poolmax";
private final static String DRIVER = "driver";
private final static String INIT = "init";
private final static String DEFAULT_PRO = "myjdbc.properties"; private Properties pro = new Properties();// 属性文件对象
private String url;// 地址
private String user;// 数据库用户名
private String password;// 数据库密码
private int max;// 最大连接数
private int init;//初始化连接池
private List<Connection> connections;// 数据连接集合 public BasicDBSource(String configFile) throws IOException,
ClassNotFoundException {
pro.load(new FileInputStream(configFile));
url = pro.getProperty(URL);
user = pro.getProperty(USER);
password = pro.getProperty(PASSWORD);
max = Integer.parseInt(pro.getProperty(POOLMAX));
init = Integer.parseInt(pro.getProperty(INIT));
Class.forName(pro.getProperty(DRIVER));
connections = new ArrayList<Connection>();
for(int i=0;i<init;i++){
try {
connections.add(DriverManager.getConnection(url,user,password));
} catch (SQLException e) {
//数据库连接失败
}
}
} public BasicDBSource() throws ClassNotFoundException, IOException{
this(DEFAULT_PRO);
} public Connection getConnection() throws SQLException {
if(connections.size()==0){
return DriverManager.getConnection(url,user,password);
}else{
int last = connections.size()-1;
return connections.remove(last);
}
} public void closeConnection(Connection con) throws SQLException {
if(connections.size()>=max){
con.close();
}else{
connections.add(con);
}
} }
3,配置文件
url=数据库地址
password=密码
user=用户名
poolmax=最大连接数
driver=数据库驱动
init=初始化连接数
4,测试
package source; import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException; import dbsource.BasicDBSource;
import dbsource.DBSource; public class MainTest { public static void main(String[] args) {
try {
DBSource dbsource = new BasicDBSource("myjdbc.properties");
Connection con1 = dbsource.getConnection();
System.out.println("第一次获取的数据库连接对象地址:"+con1);
dbsource.closeConnection(con1);
Connection con2 = dbsource.getConnection();
System.out.println("第二次获取的数据库连接对象地址:"+con2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
} }
自定义DB连接池实现的更多相关文章
- java通过代理创建Conncection对象与自定义JDBC连接池
最近学习了一下代理发现,代理其实一个蛮有用的,主要是用在动态的实现接口中的某一个方法而不去继承这个接口所用的一种技巧,首先是自定义的一个连接池 代码如下 import java.lang.reflec ...
- JavaWeb之数据源连接池(4)---自定义数据源连接池
[续上文<JavaWeb之数据源连接池(3)---Tomcat>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究其原 ...
- 利用python list 完成最简单的DB连接池
先来看查看效果: 在代码连接数据库后,并且执行三条sql后,将mysql直接重启掉,故我们的连接池连接均是不ok的,所以,它会全部删除再抓新的连接下来,重启mysql命令: 关于python代码: # ...
- Java 自定义FTP连接池
转自:https://blog.csdn.net/eakom/article/details/79038590 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...
- JDBC数据源连接池(4)---自定义数据源连接池
[续上文<JDBC数据源连接池(3)---Tomcat集成DBCP>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究 ...
- db连接池
目前常用的连接池有: DBCP:org.apache.commons.dbcp.BasicDataSource dataSource: 要连接的 datasource (通常我们不会定义在 serve ...
- 自定义redis连接池(字典操作)
pool=redis.ConnectionPool(host='127.0.0.1', port=6379,max_connections=1000)conn=redis.Redis(connecti ...
- JAVA自定义连接池原理设计(一)
一,概述 本人认为在开发过程中,需要挑战更高的阶段和更优的代码,虽然在真正开发工作中,代码质量和按时交付项目功能相比总是无足轻重.但是个人认为开发是一条任重而道远的路.现在本人在网上找到一个自定义连接 ...
- SpringBoot 整合mongoDB并自定义连接池
SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...
随机推荐
- vim忽略大写和小写查找配置
作者:zhanhailiang 日期:2014-12-17 默认 vim 的查找是区分大写和小写,可通过下面两种方式实现忽略大写和小写查找 set ic? noignorecase 1 指令设定: : ...
- RabbitMQ消息队列应用
RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...
- 如何禁止使用teamviwer的使用
前几天有人问我teamviwer怎么禁止,刚开始做实验的时候过滤了teramviwer.com解析出来的IP,可是还是没有用,其实将teamviwer登陆的服务器地址在路由器上过滤,teramviwe ...
- 腾讯视频QLV格式转换mp4的方法
腾讯视频QLV格式转换mp4的方法不知道大家知不知道用?喜欢用腾讯视频的朋友应该都知道腾讯视频单独搞出了个QLV格式文件,只能用腾讯独有的腾讯视频软件才能播放,就算用格式工厂转换也不行,那么腾讯视频的 ...
- 全栈JavaScript之路(十八)HTML5 自己定义数据属性
HTML5 规范规定,用户能够为元素 自己定义非标准属性, 可是要加入 data- 前缀. 目的是为元素提供与页面渲染无关的信息.或者语义信息.这些属性名能够任意加入,仅仅要带上前缀 data- 开头 ...
- Maven安装中的问题
按照<Maven实战>中的讲述,在安装完Maven后执行mvn -v的时候,出现了问题.在网上搜索到了解决办法: 引用:http://blog.csdn.net/xueyepiaoling ...
- WPF与混淆器
原文:WPF与混淆器 时至今日,混淆依然是.Net程序的一道重要保护手段,而混淆器对WPF应用程序的支持是怎样的呢?我们今天就通过实例讲解一下. 首先建立如下图所示的简单的用户界面: 在界面代码中设置 ...
- Linux应用环境实战05:在Ubuntu 14.10中借用Windows的字体 (转)
阅读目录 设置系统字体 安装微软的英文字体 查看系统的配置文件 借用Windows的字体 编写配置文件 在前一篇随笔中,我详细讨论了字体的分类及用途,也以Fedora 20为例,展示了字体配置的思路和 ...
- UVA 707 - Robbery(内存搜索)
UVA 707 - Robbery 题目链接 题意:在一个w * h的图上.t个时刻,然后知道一些信息,每一个时刻没有小偷的矩阵位置,问哪些时刻能够唯一确定小偷位置.和确定小偷是否已经逃走,假设没逃走 ...
- restrictkeyword
今天在移植ffmpeg到opencore时出现一个编译错误: /libavcodec/dsputil.c:545: error: expected ';', ',' or ')' before 'bl ...