首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >资源池模式和单例模式实现的自定义数据库连接池java实现版

资源池模式和单例模式实现的自定义数据库连接池java实现版

作者头像
Theone67
发布2019-12-20 12:51:53
9890
发布2019-12-20 12:51:53
举报

在企业级开发中,我们往往不会直接使用原生的JDBC操作来实现与数据库得连接。因为数据库的连接是一个很宝贵的资源且耗时,我们往往会在内存中引入一个资源池来统一管理数据库的连接。这个模式也被总结为一种设计模式:资源池模式和单例模式。 关于原理部分就不多做介绍了,这里也是做一个简单的原理实现。

ObjectPool连接池接口

package com.test.pool;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.concurrent.ConcurrentHashMap;

public abstract class ObjectPool<T> {
      private long expirationTime;

      private Hashtable<T, Long> locked, unlocked;

      public ObjectPool() {
        expirationTime = 30000; // 30 seconds
        locked = new Hashtable<T, Long>();
        unlocked = new Hashtable<T, Long>();
      }

      protected abstract T create();

      public abstract boolean validate(T o);

      public abstract void expire(T o);

      public synchronized T checkOut() {
        long now = System.currentTimeMillis();
        T t;
        if (unlocked.size() > 0) {
          Enumeration<T> e = unlocked.keys();
          while (e.hasMoreElements()) {
            t = e.nextElement();
            if ((now - unlocked.get(t)) > expirationTime) {
              // object has expired
              unlocked.remove(t);
              expire(t);
              t = null;
            } else {
              if (validate(t)) {
                unlocked.remove(t);
                locked.put(t, now);
                return (t);
              } else {
                // object failed validation
                unlocked.remove(t);
                expire(t);
                t = null;
              }
            }
          }
        }
        // no objects available, create a new one
        t = create();
        locked.put(t, now);
        return (t);
      }

      public synchronized void checkIn(T t) {
        locked.remove(t);
        unlocked.put(t, System.currentTimeMillis());
      }
}

JDBCConnectionPool 连接池实现

package com.test.pool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCConnectionPool extends ObjectPool<Connection> {

      private String driver, url, username, password;
      
      private JDBCConnectionPool() {
          
      }

      
      private static volatile JDBCConnectionPool instance;
      
      public static JDBCConnectionPool getInstance() {
          if(instance == null) {
              synchronized (JDBCConnectionPool.class) {
                  if(instance == null) {
                      instance = new JDBCConnectionPool();
                  }
              }
          }
          return instance;
      }

      @Override
      protected Connection create() {
        try {
          return (DriverManager.getConnection(url, username, password));
        } catch (SQLException e) {
          e.printStackTrace();
          return (null);
        }
      }

      @Override
      public void expire(Connection o) {
        try {
          ((Connection) o).close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }

      @Override
      public boolean validate(Connection o) {
        try {
          return (!((Connection) o).isClosed());
        } catch (SQLException e) {
          e.printStackTrace();
          return (false);
        }
      }

    public String getDsn() {
        return url;
    }

    public void setDsn(String dsn) {
        this.url = dsn;
    }

    public String getUsr() {
        return username;
    }

    public void setUsr(String usr) {
        this.username = usr;
    }

    public String getPwd() {
        return password;
    }

    public void setPwd(String pwd) {
        this.password = pwd;
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }
    
    public void loadDriver() {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
        }
    }
      
    
      
}

Main测试

package com.test.pool;

import java.sql.Connection;
import java.sql.SQLException;

public class Main {
      public static void main(String args[]) throws SQLException {

        JDBCConnectionPool pool = JDBCConnectionPool.getInstance();
        pool.setDriver("com.mysql.jdbc.Driver");
        pool.setDsn("jdbc:mysql://192.168.2.113:3306/jhbims?useSSL=false&useUnicode=true&characterEncoding=UTF-8&amp;autoReconnect=true");
        pool.setUsr("jhbims");
        pool.setPwd("jhbims");
        pool.loadDriver();

        // Get a connection:
        Connection con = pool.checkOut();
        System.out.println(con.isValid(0));
        
        pool.checkIn(con);
     
      }
    }

本文由博客一文多发平台 OpenWrite 发布!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档