序言: 因为ssdb(一种nosql数据库) java客户端没有实现连接池,需要模仿jdbc里面的连接池的思想,实现一个简单的连接池,以下是自己的总结:
思想: 每new 一个SSDB实例 ,用完之后close,其实底层就是开了一个socket连接,又关闭了,这其实是相当的消耗资源的,所以连接池的作用就是重用。不是直接关闭而是放到一个容器中去,下次再用的时候,直接从这个容器中拿。那么要点以下几点:
package ssdb.datasource; import com.udpwork.ssdb.SSDB; import java.util.LinkedList; /** * Desc: * User: weiguili(li5220008@gmail.com) * Date: 14-1-15 * Time: 上午9:18 */ public class DataSource { private String host = "192.168.98.250"; private int port = 9966; private int timeoutMs = 5000; private int minIdle = 10;//最小空闲数 private int iniCount = 5;//初始化连接 private int maxCount = 10;//最大连接数 int currentCount = 0;//当前连接数 LinkedList<SSDB> ssdbConnectionsPool = new LinkedList<SSDB>(); public DataSource() { try { for(int i=0;i<iniCount;i++){ currentCount++; ssdbConnectionsPool.addLast(createSSDB(null)); } } catch (Exception e) { throw new ExceptionInInitializerError(e); } } public SSDB createSSDB(ThreadLocal<SSDB> cacheSSDB) throws Exception { return new MySSDB(host,port,timeoutMs,this,cacheSSDB); } public SSDB getSSDB(ThreadLocal<SSDB> cacheSSDB) throws Exception{ synchronized (ssdbConnectionsPool){ if(ssdbConnectionsPool.size()>0){ return ssdbConnectionsPool.removeFirst(); } if(currentCount<maxCount){ currentCount++; return createSSDB(cacheSSDB); } throw new Exception("没有连接了"); } } }
package ssdb.datasource; import com.udpwork.ssdb.SSDB; /** * Desc: * User: weiguili(li5220008@gmail.com) * Date: 14-1-15 * Time: 上午10:02 */ public class MySSDB extends SSDB { private DataSource dataSource; private int reusedCount = 20;//可重用次数 private int currentReusedCount = 0;//当前重用次数 private ThreadLocal<SSDB> cacheSSDB = null; MySSDB(String host,int port,int timeoutMs, DataSource dataSource,ThreadLocal<SSDB> cacheSSDB) throws Exception{ super(host,port,timeoutMs); this.dataSource = dataSource; this.cacheSSDB = cacheSSDB; } @Override public void close() { currentReusedCount++; if(currentReusedCount<reusedCount){ this.dataSource.ssdbConnectionsPool.addLast(this); }else { this.dataSource.currentCount--; if(cacheSSDB !=null && cacheSSDB.get() !=null) cacheSSDB.remove();//当连接关闭时,把缓存也干掉 super.close(); } } }
package ssdb; import com.udpwork.ssdb.SSDB; import ssdb.datasource.DataSource; /** * Desc: * User: weiguili(li5220008@gmail.com) * Date: 14-1-15 * Time: 上午10:42 */ public class SSDBUtil { private static DataSource dataSource = new DataSource(); static ThreadLocal<SSDB> cacheSSDB = new ThreadLocal<SSDB>();//包一下,线程之间隔离 public static SSDB getSSDB() throws Exception{ if(cacheSSDB.get() != null){ return cacheSSDB.get(); } SSDB ssdb = dataSource.getSSDB(cacheSSDB); cacheSSDB.set(ssdb); return ssdb; } /*public static SSDB getSSDB() throws Exception{ return dataSource.getSSDB(cacheSSDB); }*/ }
package ssdb; import com.udpwork.ssdb.*; import java.util.concurrent.Executor; import java.util.concurrent.Executors; /** * SSDB Java client SDK demo. */ public class Demo { public static void main(String[] args) throws Exception { SSDB ssdb = null; Response resp; byte[] b; ssdb = SSDBUtil.getSSDB(); /* kv */ System.out.println("---- kv -----"); //ssdb.set("a", "123"); ssdb.set("a", "122"); b = ssdb.get("a"); System.out.println(new String(b)); ssdb.del("a"); b = ssdb.get("a"); ssdb.set("a","90"); System.out.println(b); long incr = ssdb.incr("a", 10); System.out.println("-------increment the number by--------"); System.out.println(incr); resp = ssdb.scan("", "", 10); resp.print(); resp = ssdb.rscan("", "10000", 10); resp.print(); System.out.println(""); /* hashmap */ System.out.println("---- hashmap -----"); ssdb.hset("n", "a", "123"); b = ssdb.hget("n", "a"); System.out.println(new String(b)); ssdb.hdel("n", "a"); b = ssdb.hget("n", "a"); System.out.println(b); ssdb.hincr("n", "a", 10); ssdb.hset("n", "d", "124"); ssdb.hset("n", "c", "124"); ssdb.hset("n", "b", "124"); resp = ssdb.hscan("n", "a", "z", 10); //resp = ssdb.hrscan("n", "", "", 10); resp.print(); System.out.println(""); /* zset */ System.out.println("---- zset -----"); double d; ssdb.zset("hackers", "Alan Kay", 1940); ssdb.zset("hackers", "Richard Stallman", 1953); ssdb.zset("hackers", "Yukihiro Matsumoto", 1965); ssdb.zset("hackers", "Claude Shannon", 1916); ssdb.zset("hackers", "Linus Torvalds", 1999); ssdb.zset("hackers", "Alan Turing", 1912); ssdb.zset("n", "a", 1); d = ssdb.zget("n", "a"); System.out.println(d); ssdb.zdel("n", "a"); d = ssdb.zget("n", "a"); System.out.println(d); ssdb.zincr("n", "b", 10); //resp = ssdb.zscan("hackers", "", Double.valueOf(1912), Double.valueOf(1999), 10); resp = ssdb.zscan("test", "", null, Double.MAX_VALUE, 10); resp.print(); System.out.println(resp.items); System.out.println(resp.keys); System.out.println(resp.raw); System.out.println(""); /* multi */ ssdb.multi_set("a", "1b", "b", "2b"); resp = ssdb.multi_get("a", "b"); resp.print(); System.out.println(""); // ssdb.close(); concurrentTest(); } public static void concurrentTest(){ Executor pool = Executors.newFixedThreadPool(50); for(int i=0;i<1000;i++){ Runnable task = new Runnable() { @Override public void run() { synchronized (this){ System.out.println(Thread.currentThread().getName()); SSDB ssdb = null; try { ssdb = SSDBUtil.getSSDB(); System.out.println(ssdb); } catch (Exception e) { e.printStackTrace(); } finally { ssdb.close(); //ssdb.close(); } } } }; pool.execute(task); } } }
原文:http://blog.csdn.net/li5220008/article/details/18401865