package org.frameworkset.nosql.redis; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.frameworkset.spi.BaseApplicationContext; import org.frameworkset.spi.DefaultApplicationContext; public class RedisFactory { private static Map<String,RedisDB> dbs = new HashMap<String,RedisDB>(); private static ThreadLocal<RedisHelperHolder> currentDB = new ThreadLocal<RedisHelperHolder>(); static class RedisHelperHolder { private int count; public int increament() { count = count + 1; return count; } public int decreament() { count = count - 1; return count; } private boolean allreleased() { return count <= 0; } public void release() { if(holderdbs != null) { Iterator<Entry<String, RedisHelper>> its = holderdbs.entrySet().iterator(); while(its.hasNext()) { Entry<String, RedisHelper> entry = its.next(); try { entry.getValue().release(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } this.holderdbs = null; } public RedisHelper getRedisHelper() { return getRedisHelper("default"); } public RedisHelper getRedisHelper(String dbname) { RedisHelper RedisHelper = null; if(holderdbs == null) { holderdbs = new HashMap<String,RedisHelper>(); } else { RedisHelper = holderdbs.get(dbname); } if(RedisHelper != null) { return RedisHelper; } else { RedisDB db = init(dbname); RedisHelper = new RedisHelper(db); holderdbs.put(dbname, RedisHelper); return RedisHelper; } } private Map<String,RedisHelper> holderdbs = new HashMap<String,RedisHelper>(); } public RedisFactory() { } private static RedisDB init(String dbname) { RedisDB db = dbs.get(dbname); if(db == null) { synchronized(RedisFactory.class) { db = dbs.get(dbname); if(db == null) { BaseApplicationContext context = DefaultApplicationContext.getApplicationContext("redis.xml"); db = context.getTBeanObject(dbname, RedisDB.class); dbs.put(dbname, db); } } } return db; } public static RedisHelper getTXRedisHelper() { return getTXRedisHelper("default"); } public static RedisHelper getTXRedisHelper(String dbname) { if(dbname == null) dbname = "default"; RedisHelperHolder holder = currentDB.get(); if(holder == null) { holder = new RedisHelperHolder(); currentDB.set(holder); } holder.increament(); return holder.getRedisHelper(dbname); // RedisDB db = init(dbname); // return new RedisHelper(db); } public static RedisHelper getRedisHelper() { return getRedisHelper("default"); } public static RedisHelper getRedisHelper(String dbname) { RedisDB db = init(dbname); return new RedisHelper(db); } public static void releaseTX() { RedisHelperHolder holder = currentDB.get(); if(holder != null) { holder.decreament(); if(holder.allreleased()) { currentDB.set(null); holder.release(); } } } }