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

前言:因为需要正式做项目,了解到了连接池这个东西。在网上找了很多资料,发现都是大同小异,各种转载,看上去搜出来了几十个答案,结果很可能是同一个。并且大多都是基于框架的数据库连接池。可是我只是想采用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();
        }
    }
}
--------------------- 

转载:https://blog.csdn.net/m0_37568521/article/details/78598766 
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值