Java数据库连接池的实现(不用框架)

来源:互联网 发布:做淘宝刷手有风险吗 编辑:程序博客网 时间:2024/06/08 10:01

前言:因为需要正式做项目,了解到了连接池这个东西。在网上找了很多资料,发现都是大同小异,各种转载,看上去搜出来了几十个答案,结果很可能是同一个。并且大多都是基于框架的数据库连接池。可是我只是想采用MVC做一个不是很大的项目,不需要使用到框架啊。这可怎么办,最后没办法,弄清楚连接池的原理,配合网上的资料,自己写一个简单的吧(这里暂时不考虑多线程操作,后面会继续完善这个连接池,自己挖坑,后面慢慢补)

1、连接池是什么以及连接池的好处

这里想借用老师的例子,觉得非常的贴切。我是一个图书管理员(CPU),当需要有人来借书的时候(进行数据库操作),我首先需要去图书馆找到这本书(连接数据库),然后登记把书给借书的人(执行并返回执行结果),人们来还书的时候,我们再把书放回图书馆(关闭数据库)。这是我们普通的做法,这样的做法有一个问题是这样的,图书管理员在找书的时候需要花费10分钟(连接数据库),登记把书给借书的人(执行SQL语句)只需要1分钟。这就极大的降低了性能,因此就图书管理员就想了一个办法,我首先放一些书放在前台书桌上(连接池),然后别人来借书的时候(进行数据库操作的时候),我直接看书桌上还有没有书,如果有的话,直接登记就可以了,花费的时间约为1分钟,相对之前的借书流程提高了11倍。如果没有的话,我们再去图书馆找这本书(连接数据库)。在别人还书的时候,我们也不直接把书放回图书馆,而是放在书桌上(不关闭连接,放入连接池)。

2、简单连接池的具体实现

创建一个连接池,基本原理就是,我们先创建一堆数据库连接放在List中(初始化),在要进行连接的时候,我们判断是否连接池中还有连接,如果有就直接从连接池中获取,如果没有,我们再重新创建连接。并且我们使用完成以后也不要关闭,而是重新放回List中。
IDatabaseConnection接口文件

package DBPool;import java.sql.Connection;/** * @author xiaoD * @date 2017年11月22日 上午9:00:05 * Description: 定义一个接口,更换数据库的时候方便 */public interface IDatabaseConnection {    //初始化    public void init();    //取得连接    public  Connection getConnection();    //关闭    public void close(Connection conn);}

SQLServerHandler处理器

package DBPool;import java.sql.Connection;import java.sql.DriverManager;/** * @author xiaoD * @date 2017年11月22日 上午9:02:19 * Description:  */public class SQLServerHandler {    private static final String DBDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";    private static final String DBURL = "jdbc:sqlserver://localhost:1433;DatabaseName=xiaoD";    private static final String USERNAME = "sa";    private static final String PASSWORD = "sql2008";    private Connection conn = null;    public Connection buildConnection() {        try {            Class.forName(DBDRIVER);            this.conn = DriverManager.getConnection(DBURL, USERNAME, PASSWORD);        }catch(Exception e) {            e.printStackTrace();        }        return conn;    }}

SQLServerPool

package DB;import java.sql.Connection;import java.util.LinkedList;/** * @author xiaoD * @date 2017年11月22日 下午2:49:38 * Description: 构建一个连接池 */public class SQLServerPool implements IDatabaseConnection{    //最小连接数        private static final int minCount = 1;        //最大连接数        private static final int maxCount = 10;        //连接池        private static final LinkedList<Connection> pools = new LinkedList<Connection>();        SQLServerHandler handler = new SQLServerHandler();        /**         * @author xiaoD         * @date 2017年11月22日 下午2:49:38         * Description: 重写init         */        public void init() {            Connection conn = null;            try{                for(int i=0; i<minCount; i++) {                    conn = handler.buildConnection();                    pools.add(conn);                }            }catch(Exception e) {                e.printStackTrace();            }        }        /**         * @author xiaoD         * @date 2017年11月22日 下午2:49:38         * Description: 重写getConnection         */        public synchronized Connection getConnection() {            Connection conn = null;            if(pools.size() == 0) {                conn = handler.buildConnection();            } else {                conn = pools.remove(0);            }            return conn;        }        /**         * @author xiaoD         * @date 2017年11月22日 下午2:49:38         * Description: 重写close         */        public synchronized void close(Connection conn) {            if(pools.size() < maxCount) {                pools.add(conn);            }            System.out.println(pools);        }}

测试类

package DB;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;/** * @author xiaoD * @date 2017年11月22日 下午2:52:00 * Description:  */public class DatabseTest {    static IDatabaseConnection SQLServer = new SQLServerPool();    public static void main(String args[]) {        SQLServer.init();        long start = System.currentTimeMillis();        for(int i=0; i<300; i++) {            test();        }        long end = System.currentTimeMillis();        System.out.println(end-start);    }    private static void test() {        try{            Connection conn = SQLServer.getConnection();            String sql = "select * from users";            PreparedStatement pst = conn.prepareStatement(sql);            ResultSet rs = pst.executeQuery();            System.out.println(rs);            pst.close();            SQLServer.close(conn);        }catch(Exception e) {            e.printStackTrace();        }    }}

(完) 2017/11/222 20:30

原创粉丝点击