自己的一个数据库作业的一部分,数据库连接池的简单实现,采取的是单例模式,同时采用了同步锁机制。关于单例模式大家可以参考《java与模式》,条件同步锁可以参考我之前的一些博文介绍。代码如下,忘大家不吝赐教。
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//采用单例模式进行设计
public class ConnectionPool {
private static final ConnectionPool m_instance = new ConnectionPool();
private List<Connection> pool=null;
private int initialSize = 5;//连接池的初始大小
private String driverClassName = null;
private String username = null;
private String password = null;
private String url =null;
//条件同步锁
private Lock Conlock;
private Condition T;
//构造一个连接池
private ConnectionPool()
{
init();
}
// 返回单例
public static ConnectionPool getInstance()
{
return m_instance;
}
//从连接池中获得一个连接,这里采用条件同步机制
public Connection getConnetion() throws InterruptedException
{
Conlock.lock();
try{
while(pool.size()==0)
{
T.await();
}
Connection con=pool.get(0);
pool.remove(0);
return con;
}
finally
{
Conlock.unlock();
}
}
//释放一个连接
public void releaseConnetion(Connection con)
{
Conlock.lock();
try{
pool.add(con);
T.signalAll();
}
finally
{
Conlock.unlock();
}
}
//关闭连接池
public synchronized void closePool()
{
for(int i=0;i<pool.size();i++){
try {
((Connection)pool.get(i)).close();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
pool.remove(i);
}
}
//初始化
private void init()
{
pool=new Vector<Connection>(initialSize);
Conlock = new ReentrantLock();
T = Conlock.newCondition();
readConfig();
creatConnection();
}
//建立初始大小的连接池
private void creatConnection()
{
Connection con=null;
for(int i=0;i<initialSize;i++)
{
try {
con=DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
pool.add(con);
}
}
// 读取设置连接池的属性文件
private void readConfig() {
try {
//这里路径由用户设置,可以设置为相对路径
String path = "E:\\eclijobs\\SCStest\\dbpool.properties";
FileInputStream is = new FileInputStream(path);
Properties props = new Properties();
props.load(is);
this.driverClassName = props.getProperty("driverClassName");
this.username = props.getProperty("username");
this.password = props.getProperty("password");
this.url = props.getProperty("url");
this.initialSize = Integer.parseInt(props.getProperty("initialSize"));
} catch (Exception e) {
e.printStackTrace();
System.out.print(System.getProperty("user.dir"));
System.err.println("读取属性文件出错. ");
}
}
}
下面是属性文件,针对的是Microsoft sql。
driverClassName=com.mysql.jdbc.Driver
username=root
password=123
url=jdbc\:mysql\://localhost\:3306/selectcourse?characterEncodering\=GBk
poolSize=10
分享到:
相关推荐
此类非常简单,免去了网上众多资料里所说的麻烦的tomcat配置,更强的是它可以通用!不仅oracle,mysql,sqlserver2000都行,因为它依据的是你自己连接数据库的驱动。当然首先你要保证你拥有一个能连接自己数据库的对应...
用java实现的简易的数据库连接池及其管理 课程设计 编写一关于Microsoft Access数据库连接池及其管理的相关类,要求能从XML配置文件中读取该数据库驱动程序,数据库名,连接池最大连接数,最多等待用户数,查询...
JDBC数据库连接池的简单实现.rar
数据库连接池的一个简单实现 Java版源代码
自定义实现的数据库连接池,并进行加锁,保证线程安全,适合初学者学习。
数据库连接池用在网站后台架构中,非常有利于提高用户请求的响应速度。为此,我编写了一个功能简单,但非常强大的。经过上千个多线程同时访问的数据库连接池程序 。 资源包括一个接口,两个实现。一个测试类。 ...
java数据库连接池,是一个简单实现数据库连接池的类
JavaWeb Druid数据库连接池+Spring JDBC+BeanUtils简单实现登录功能,博客地址:https://blog.csdn.net/qq_44515800/article/details/121856426
在java中使用一种简单JDBC数据库连接池的实现
主要为大家介绍了Java实现数据库连接池简易教程,感兴趣的小伙伴们可以参考一下
本文采用J2EE技术设计了物流企业电子商务的在线购物和配送管理系统,文中简单介绍了该系统的逻 辑结构、功能结构和数据流程 ,详细描述 了在线购物模块中的数据库连接池及 DAO 的实现方法 并给 出了核心流程代 码。
R2通过代理connection对象和工厂模式实现了不改变原jdbc调用方式的前提下的jdbc数据库连接池。结构简单,功能完善,高可配置,充分应用了jdk1.6的同步包特性,提高了并发效率,并能够完美应用于非web项目和web项目,...
最简单高效的JAVA对象池、线程池、以及使用对象池技术实现的数据库连接池 已在生产运行5年以上的代码 若有任何问题请与我联系
把该模式应用到数据库连接管理领域,是建立一个数据库连接池,提供一套高效的连接分配、使用策略,终目标是实现连接的高效、安全的复用。 数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并...
这个类就是利用了DBCP包写数据库连接池。 4.ISqlHelper.java 其实这个接口也很简单,定义了那么几个方法,说白了就是操作数据库的,为什么要写成泛型的接口,为了就是后面大家的业务有针对性,一个实体一个业务...
对数据库连接池一直认为是个很神秘的东西,但是看完这个代码后,就能明白,原来连接池的实现是这样简单
文章简单介绍了JDBC数据库连接原理和数据库连接池工作原理,结合其原理和Java应用系统存在的问题,提出基于JDBC的数据库连接池实现连接及语句分享的实现方案,其目的是在连接数不断增加的情况下,提高应用系统对用户请求...
简单的java连接池代码,很实用不错的例子。
上述伪代码忽略了一些细节,在实现连接池中是需要考虑的: (1)如果连接全部被占用,是返回失败,还是让上游等待 (2)需要实施连接可用性检测 (3)为了让调用方更友好,可能还需要包装一层DAO层,让“连接”这个...
下载程序和配置文件范例 博文链接:https://inotgaoshou.iteye.com/blog/860454