数据库连接池!

创建数据库连接是一个非常消耗时间和资源的操作,如果对于每个数据库操作都去建立数据库连接,然后操作执行完毕后关闭连接,那效率会非常低下。而数据库连接池它可以集中管理数据库连接,在系统初始化的时候创建多个数据库连接,然后集中管理他们。

我们可以自己定义一个数据库连接池,步骤是:
1.编写一个类MyDataSource实现DataSource接口。
2.用Class构造器一次创建十个连接,将其保存在Linkedlist中。
3.使用getConnection从LinkedList中取出一个连接。
4.提供将连接放回的方法。

首先,考虑到多线程并发问题,应该在每个方法上加上Synchronized关键字确保线程是同步的。
然后,为了能够连接不同的数据库比如mysql和oracle,可以采用策略:设计一个符合单例模式的连接池管理类,在管理类的唯一实例被创建时读取一个资源文件,资源文件中存放多个数据库的url等地址信息。根据资源文件提供的信息可以创建多个连接池实例,每个实例都是特定的数据库连接池。为每个连接池实例取一个名字,根据不同的名字来管理连接池。然后,考虑到数据库中的事务机制,我们可以将connection的autocommit属性设置为false,让每个事务占用一个连接,提高连接的复用性。
然后,关于连接的释放与分配问题,可以将已经创建但还没有分配的连接放在一个空闲池中。每当用户请求连接的时候,就先检查空闲池中有没有空闲连接。如果有就把建立时间最久的空闲连接分配给它,如果没有就检察所开的连接是否已经达到线程池所能允许的最大连接数,如果没有达到就新建一个连接,如果达到了就等待一段时间。如果在等待的时间内有连接被释放出来就把这个空闲的连接分配给用户,如果等待时间超时就返回空值。系统对已经分配出去的在使用的连接只做计数,使用完毕后归还给连接池。
还要进一步考虑线程池的配置和维护问题。要设置线程池的最大连接数和最小连接数来控制线程池中的连接。最小连接数是系统启动时所创建的连接数,如果创建的太多会导致系统启动慢,但是创建完成后系统的响应速度会很快;如果创建得少,系统启动会很快,但是创建完成后系统的响应速度会变慢。所以,在开发的时候,可以设置较少的最小连接数以便系统能快速启动;而在实际使用中要设置大的最小连接数,这样客户访问得会快一些。为了保证系统的最小连接数,可以每隔一段时间去动态检测,如果发现连接数小于最小连接数就补充相应数量的连接数。最大连接数是线程池允许创建的最大连接数目,要根据系统的访问量进行反复测试。

    public class MyDataSource implements DataSource {
              //链表 --- 实现栈结构
              privateLinkedList<Connection> dataSources = new LinkedList<Connection>();
 
              //初始化连接数量
              publicMyDataSource() {
                     //一次性创建10个连接
                     for(int i = 0; i < 10; i++) {
                            try {
                               //1、装载sqlserver驱动对象
                               DriverManager.registerDriver(new SQLServerDriver());
                               //2、通过JDBC建立数据库连接
                               Connection con =DriverManager.getConnection(
                                  "jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");
                               //3、将连接加入连接池中
                               dataSources.add(con);
                            } catch (Exception e) {
                               e.printStackTrace();
                            }
                     }
              }
 
              @Override
              publicConnection getConnection() throws SQLException {
                     //取出连接池中一个连接
                     finalConnection conn = dataSources.removeFirst(); // 删除第一个连接返回
                     returnconn;
              }
 
              //将连接放回连接池
              publicvoid releaseConnection(Connection conn) {
                     dataSources.add(conn);
                     }
       }

在实际生产中,可以采用现有的数据库连接池,DBCP、c3p0、Druid连接池,Druid是目前最好的数据库连接池,在功能、性能、扩展性方面都优于其他连接池。

参考:https://blog.csdn.net/shuaihj/article/details/14223015?utm_source=app#commentBox

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值