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

在企业级开发中,我们往往不会直接使用原生的 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;

  <span class="hljs-keyword">private</span> Hashtable&lt;T, Long&gt; locked, unlocked;

  <span class="hljs-keyword">public</span> <span class="hljs-title function_">ObjectPool</span><span class="hljs-params">()</span> {
    expirationTime = <span class="hljs-number">30000</span>; <span class="hljs-comment">// 30 seconds</span>
    locked = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Hashtable</span>&lt;T, Long&gt;();
    unlocked = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Hashtable</span>&lt;T, Long&gt;();
  }

  <span class="hljs-keyword">protected</span> <span class="hljs-keyword">abstract</span> T <span class="hljs-title function_">create</span><span class="hljs-params">()</span>;

  <span class="hljs-keyword">public</span> <span class="hljs-keyword">abstract</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">validate</span><span class="hljs-params">(T o)</span>;

  <span class="hljs-keyword">public</span> <span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">expire</span><span class="hljs-params">(T o)</span>;

  <span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> T <span class="hljs-title function_">checkOut</span><span class="hljs-params">()</span> {
    <span class="hljs-type">long</span> <span class="hljs-variable">now</span> <span class="hljs-operator">=</span> System.currentTimeMillis();
    T t;
    <span class="hljs-keyword">if</span> (unlocked.size() &gt; <span class="hljs-number">0</span>) {
      Enumeration&lt;T&gt; e = unlocked.keys();
      <span class="hljs-keyword">while</span> (e.hasMoreElements()) {
        t = e.nextElement();
        <span class="hljs-keyword">if</span> ((now - unlocked.get(t)) &gt; expirationTime) {
          <span class="hljs-comment">// object has expired</span>
          unlocked.remove(t);
          expire(t);
          t = <span class="hljs-literal">null</span>;
        } <span class="hljs-keyword">else</span> {
          <span class="hljs-keyword">if</span> (validate(t)) {
            unlocked.remove(t);
            locked.put(t, now);
            <span class="hljs-keyword">return</span> (t);
          } <span class="hljs-keyword">else</span> {
            <span class="hljs-comment">// object failed validation</span>
            unlocked.remove(t);
            expire(t);
            t = <span class="hljs-literal">null</span>;
          }
        }
      }
    }
    <span class="hljs-comment">// no objects available, create a new one</span>
    t = create();
    locked.put(t, now);
    <span class="hljs-keyword">return</span> (t);
  }

  <span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">checkIn</span><span class="hljs-params">(T t)</span> {
    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> {

  <span class="hljs-keyword">private</span> String driver, url, username, password;
  
  <span class="hljs-keyword">private</span> <span class="hljs-title function_">JDBCConnectionPool</span><span class="hljs-params">()</span> {
	  
  }

  
  <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">volatile</span> JDBCConnectionPool instance;
  
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> JDBCConnectionPool <span class="hljs-title function_">getInstance</span><span class="hljs-params">()</span> {
	  <span class="hljs-keyword">if</span>(instance == <span class="hljs-literal">null</span>) {
		  <span class="hljs-keyword">synchronized</span> (JDBCConnectionPool.class) {
			  <span class="hljs-keyword">if</span>(instance == <span class="hljs-literal">null</span>) {
				  instance = <span class="hljs-keyword">new</span> <span class="hljs-title class_">JDBCConnectionPool</span>();
			  }
		  }
	  }
	  <span class="hljs-keyword">return</span> instance;
  }

  <span class="hljs-meta">@Override</span>
  <span class="hljs-keyword">protected</span> Connection <span class="hljs-title function_">create</span><span class="hljs-params">()</span> {
    <span class="hljs-keyword">try</span> {
      <span class="hljs-keyword">return</span> (DriverManager.getConnection(url, username, password));
    } <span class="hljs-keyword">catch</span> (SQLException e) {
      e.printStackTrace();
      <span class="hljs-keyword">return</span> (<span class="hljs-literal">null</span>);
    }
  }

  <span class="hljs-meta">@Override</span>
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">expire</span><span class="hljs-params">(Connection o)</span> {
    <span class="hljs-keyword">try</span> {
      ((Connection) o).close();
    } <span class="hljs-keyword">catch</span> (SQLException e) {
      e.printStackTrace();
    }
  }

  <span class="hljs-meta">@Override</span>
  <span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">validate</span><span class="hljs-params">(Connection o)</span> {
    <span class="hljs-keyword">try</span> {
      <span class="hljs-keyword">return</span> (!((Connection) o).isClosed());
    } <span class="hljs-keyword">catch</span> (SQLException e) {
      e.printStackTrace();
      <span class="hljs-keyword">return</span> (<span class="hljs-literal">false</span>);
    }
  }

<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getDsn</span><span class="hljs-params">()</span> {
	<span class="hljs-keyword">return</span> url;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setDsn</span><span class="hljs-params">(String dsn)</span> {
	<span class="hljs-built_in">this</span>.url = dsn;
}

<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getUsr</span><span class="hljs-params">()</span> {
	<span class="hljs-keyword">return</span> username;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setUsr</span><span class="hljs-params">(String usr)</span> {
	<span class="hljs-built_in">this</span>.username = usr;
}

<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getPwd</span><span class="hljs-params">()</span> {
	<span class="hljs-keyword">return</span> password;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setPwd</span><span class="hljs-params">(String pwd)</span> {
	<span class="hljs-built_in">this</span>.password = pwd;
}

<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getDriver</span><span class="hljs-params">()</span> {
	<span class="hljs-keyword">return</span> driver;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setDriver</span><span class="hljs-params">(String driver)</span> {
	<span class="hljs-built_in">this</span>.driver = driver;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">loadDriver</span><span class="hljs-params">()</span> {
	<span class="hljs-keyword">try</span> {
		Class.forName(driver);
	} <span class="hljs-keyword">catch</span> (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 {

    <span class="hljs-type">JDBCConnectionPool</span> <span class="hljs-variable">pool</span> <span class="hljs-operator">=</span> JDBCConnectionPool.getInstance();
    pool.setDriver(<span class="hljs-string">"com.mysql.jdbc.Driver"</span>);
    pool.setDsn(<span class="hljs-string">"jdbc:mysql://192.168.2.113:3306/jhbims?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true"</span>);
    pool.setUsr(<span class="hljs-string">"jhbims"</span>);
    pool.setPwd(<span class="hljs-string">"jhbims"</span>);
    pool.loadDriver();

    <span class="hljs-comment">// Get a connection:</span>
    <span class="hljs-type">Connection</span> <span class="hljs-variable">con</span> <span class="hljs-operator">=</span> pool.checkOut();
    System.out.println(con.isValid(<span class="hljs-number">0</span>));
    
    pool.checkIn(con);
 
  }
}

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