资源池模式和单例模式实现的自定义数据库连接池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<T, Long> 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><T, Long>();
unlocked = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Hashtable</span><T, Long>();
}
<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() > <span class="hljs-number">0</span>) {
Enumeration<T> e = unlocked.keys();
<span class="hljs-keyword">while</span> (e.hasMoreElements()) {
t = e.nextElement();
<span class="hljs-keyword">if</span> ((now - unlocked.get(t)) > 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&useUnicode=true&characterEncoding=UTF-8&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 发布!