您的位置:首页 > 数据库

JDBC自定义 数据库连接池

2016-05-02 16:07 453 查看
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

在不使用C3P0等开源的数据库连接池的情况下,我们尝试使用自定义数据库连接池来 了解Jdbc连接池的原理及其功能作用。

自定义连接池实现的几个步骤

1. 创建数据库连接类 JdbcUtils 。

2. 创建类MyDataSource类 实现DataSource接口,该类下的步骤主要有:

1) 批量的实现数据库的连接,并把创建的连接放入到LinkList中(因为要进行增和删操作,Linklist比ArrayList性能 高上许多);

2)实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户, 3)在该类中创建方法addBackToPool(Connection con),当用户使用完后,重新将连接 放回到连接池中。

3.编写测试类 进行测试

具体的代码如下:

数据库连接类—通过读取配置文件properties文件中的配置信息,配置文件就不列举了

package com.mystore.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ResourceBundle;

/**
* 提供数据库连接池 和数据库连接
* 方法为静态的 通过类型访问
* @author huhongda
*
*/
public class JdbcUtils {

private static String driverName = null;
private static String url=null;
private static String userName = null;
private static String userPwd =null;
//读取配置文件中的内容
//静态方法块
static{
ResourceBundle bundle = ResourceBundle.getBundle("dataBase");
driverName = bundle.getString("driverName");
url = bundle.getString("url");
userName= bundle.getString("userName");
userPwd = bundle.getString("userPwd");
}
//建立连接
public static Connection getConnection(){
try {
//注册驱动
loadDriver();
//System.out.println("创建连接成功");
//建立连接 并返回
return DriverManager.getConnection(url, userName, userPwd);

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null;
}
//注册驱动
public static void loadDriver(){
try {
Class.forName(driverName);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
//释放资源
public static void release(ResultSet rs,Statement stat,Connection con){
//存在连接或结果集的时候 释放
if(rs!=null){
try {
rs.close();
} catch (Exception e) {
// TODO: handle exception
}
rs= null;
}
if(stat!=null){
try {
stat.close();
} catch (Exception e) {
// TODO: handle exception
}
stat = null;
}
if(con!=null){
try {
con.close();
} catch (Exception e) {
// TODO: handle exception
}
con = null;
}
}
}


连接池类

package DataSource;

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;

import javax.sql.DataSource;

import com.mystore.utils.JdbcUtils;
//简单的实现自定义 连接池
public class MyDataSource implements DataSource {
//通过 linkList充当 池
private LinkedList<Connection> pool = new LinkedList<Connection>();
//构造 函数 初始化 连接 数目
public MyDataSource(){
System.out.println("构造函数 创建 20个连接");
for (int i = 0; i < 20; i++) {
//创建 连接
Connection connection = JdbcUtils.getConnection();
//把 创建的连接 放入池子中
pool.add(connection);
}
}
//用完 之后  将传递的连接放回  池中
public void addBackToPool(Connection connection){
pool.add(connection);
}
@Override
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return null;
}

@Override
public void setLogWriter(PrintWriter out) throws SQLException {
// TODO Auto-generated method stub

}

@Override
public void setLoginTimeout(int seconds) throws SQLException {
// TODO Auto-generated method stub

}

@Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
}

@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}

@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
}
//从线程池 中 取得 第一个
@Override
public Connection getConnection() throws SQLException {
// TODO Auto-generated method stub
//首先 判断 是否为空
if(pool.isEmpty()){
//为空的话  继续创建 5个连接
for (int i = 0; i < 5; i++) {
Connection connection = JdbcUtils.getConnection();
pool.add(connection);
}
}
//有连接的话  就取出第一个
Connection con = pool.removeFirst();
System.out.println("取得一个连接 使用");
return con;
}

@Override
public Connection getConnection(String username, String password)
throws SQLException {
// TODO Auto-generated method stub
return null;
}

}


简单的测试类

package DataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.mystore.utils.JdbcUtils;

//对自定义 连接池的 测试
public class TestDataSource {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection connection = null;
PreparedStatement stmt = null;
MyDataSource ds = null;
ResultSet rs =null;
try {
ds = new MyDataSource();
//从连接池 中 取得 连接
connection = ds.getConnection();
stmt = connection.prepareStatement("update users set passward ='123' where userName=?");
//给占位符 设值
stmt.setString(1,"huhongda");
//执行
stmt.executeUpdate();

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
//最终  将 连接 放回到 连接池中
ds.addBackToPool(connection);
System.out.println("使用完 后将连接 放回 连接池中");
//释放 资源 并 不将连接 释放
JdbcUtils.release(rs, stmt, null);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jdbc 数据库连接池