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

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连接池实现的更多相关文章

  1. java通过代理创建Conncection对象与自定义JDBC连接池

    最近学习了一下代理发现,代理其实一个蛮有用的,主要是用在动态的实现接口中的某一个方法而不去继承这个接口所用的一种技巧,首先是自定义的一个连接池 代码如下 import java.lang.reflec ...

  2. JavaWeb之数据源连接池(4)---自定义数据源连接池

    [续上文<JavaWeb之数据源连接池(3)---Tomcat>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究其原 ...

  3. 利用python list 完成最简单的DB连接池

    先来看查看效果: 在代码连接数据库后,并且执行三条sql后,将mysql直接重启掉,故我们的连接池连接均是不ok的,所以,它会全部删除再抓新的连接下来,重启mysql命令: 关于python代码: # ...

  4. Java 自定义FTP连接池

    转自:https://blog.csdn.net/eakom/article/details/79038590 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...

  5. JDBC数据源连接池(4)---自定义数据源连接池

    [续上文<JDBC数据源连接池(3)---Tomcat集成DBCP>] 我们已经 了解了DBCP,C3P0,以及Tomcat内置的数据源连接池,那么,这些数据源连接池是如何实现的呢?为了究 ...

  6. db连接池

    目前常用的连接池有: DBCP:org.apache.commons.dbcp.BasicDataSource dataSource: 要连接的 datasource (通常我们不会定义在 serve ...

  7. 自定义redis连接池(字典操作)

    pool=redis.ConnectionPool(host='127.0.0.1', port=6379,max_connections=1000)conn=redis.Redis(connecti ...

  8. JAVA自定义连接池原理设计(一)

    一,概述 本人认为在开发过程中,需要挑战更高的阶段和更优的代码,虽然在真正开发工作中,代码质量和按时交付项目功能相比总是无足轻重.但是个人认为开发是一条任重而道远的路.现在本人在网上找到一个自定义连接 ...

  9. SpringBoot 整合mongoDB并自定义连接池

    SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...

随机推荐

  1. A Game of Thrones(17) - Bran

    It seemed as though he had been falling for years. Fly, a voice whispered in the darkness, but Bran ...

  2. svn经常使用命令具体解释(非常全,非常有用)

    ubuntu下安装subversionclient: sudo apt-getinstall subversion subversion-tools 1.检出 svn  co  http://路径(文 ...

  3. [开源]C#二维码生成解析工具,可添加自定义Logo (转)

    二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...

  4. 基于CefGlue的桌面应用开发

    原文地址:http://johnnyfee.github.io/csharp/2013/12/21/cef-glue/ 前言 如果你想使用WEB技术来开发桌面客户端,并且是想使用的语言也是C#时,那请 ...

  5. hdu5119(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5119 分析:dp[i][j]表示由前i个数组成异或和为j的方法数,则dp[i][j]=d[i-1][j ...

  6. Eclipse扩展点实践之添加快捷菜单项(Command方式实现)

    有两种方式,一种是Action的方式,另一种是Command的方式(这两种方式的区别详见:http://wiki.eclipse.org/FAQ_What_is_the_difference_betw ...

  7. 京东商城招聘自动调价系统架构师 T4级别

    岗位级别:T4 岗位职责: 1.负责自动调价系统的架构设计 2.负责自动调价的预测.相关性算法设计 3.核心代码编写,代码review 任职要求: 1.熟悉数据挖掘.机器学习理论和算法 2.熟悉海量数 ...

  8. unity中的MonoBehaviour.OnMouseDown()

    在官网的api文档中仅说明了 Description OnMouseDown is called when the user has pressed the mouse button while ov ...

  9. AE+SceneControl源代码共享

    近来的,博友发私信或邮件交换,第一次使用前SceneControl代做一点project股票,做的很粗糙.我们希望对大家有帮助,欢迎留言交流哈萨克斯坦. 除了主开.保存.数据加载.询价,几个功能主要是 ...

  10. 为什么推荐std::string而不是char*

    例如如下: map<const char*, const char*> map_test; map_test["a"] = "a"; map_tes ...