JDBC自定义 数据库连接池

来源:互联网 发布:水果竞猜php源码 编辑:程序博客网 时间:2024/05/17 22:31

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

在不使用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);        }    }}
1 0
原创粉丝点击