javaJDBC自定义数据库连接池

3 篇文章 0 订阅

在JDBC连接数据库的时候,一般情况下DiverManager.getConnection获得连接对象,每次都这么做,十分的耗费资源。
为了解决这个问题,于是出现连接池。跟线程池的概念差不多。

线程池:

多个Connection对象被创建了,然后放在池子里面,用的时候直接从池子里面去拿,用完了再放回去。
后面的程序如果没有抓到对象,就处于等待状态。

我们在不使用dbcpC3P0等开源的数据库连接池的情况下,我们尝试使用自定义数据库连接池来 了解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);
        }

    }

}



原文:https://blog.csdn.net/dada111111111/article/details/51296779 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值