package net.b2bcenter.framework.modules.objectpool;import java.security.NoSuchAlgorithmException;import java.util.Date;import java.util.Map;import net.b2bcenter.entity15.base.IdEntity;import net.b2bcenter.framework.modules.utils.EncodeUtils;import org.apache.log4j.BasicConfigurator;import com.danga.MemCached.MemCachedClient;import com.danga.MemCached.SockIOPool;public class ObjectPool { private boolean enable; private ObjectPoolLogger logger = new ObjectPoolLogger(); public final static int ONE_MINUTE = 60; // 1m public final static int ONE_HOUR = 60 * 60; // 1h public final static int ONE_DAY = 60 * 60 * 24; // 1day public final static int DEFAULT_LIFE = 60 * 60; // 1h private PoolConfig config = new PoolConfig(); private MemCachedClient mcc = null; private String[] servers = {"localhost:11211"}; private synchronized MemCachedClient _init() { return _init(servers); } private synchronized static MemCachedClient _init(String[] servers) { // memcached should be running on port 11211 but NOT on 11212 BasicConfigurator.configure(); SockIOPool pool = SockIOPool.getInstance(); pool.setServers( servers ); pool.setFailover( true ); pool.setInitConn( 10 ); pool.setMinConn( 5 ); pool.setMaxConn( 250 ); pool.setMaxIdle( 1000 * 60 * 60 * 6 ); // set the sleep for the maint thread // it will wake up every x seconds and // maintain the pool size pool.setMaintSleep( 30 ); // Tcp的规则就是在发送一个包之前,本地机器会等待远程主机 // 对上一次发送的包的确认信息到来;这个方法就可以关闭套接字的缓存, // 以至这个包准备好了就发; pool.setNagle( false ); //连接建立后对超时的控制 pool.setSocketTO( 3000 ); //连接建立时对超时的控制 pool.setSocketConnectTO( 0 ); pool.setAliveCheck( true ); pool.initialize(); MemCachedClient mcc = new MemCachedClient(); // turn off most memcached client logging: //Logger.getLogger( MemCachedClient.class.getName() ).setLevel( com.schooner.MemCached.Logger. ); return mcc; } public void setLogFile(String logFile) { this.logger.setLogFile(logFile); } public void setEnable(boolean enable) { this.enable = enable; } public boolean isEnable() { return enable; } public void setLogEnable(boolean logEnable) { this.logger.setEnable(logEnable); } public void setServers(String servers) { this.servers = servers.split(","); } public void init() { mcc = _init(); } public void init(String[] servers) { mcc = _init(servers); } /** * @return true if success */ public boolean set(IdEntity obj) { return set(KeyGenerator.getKey(obj), obj); } /** * @return true if success */ public boolean set(String key, Object value) { if (!enable) { return true; } if (mcc == null) { mcc = _init(); } // value = convert(value); return mcc.set(encodeKey(key), value); } private boolean _set(String key, Object value) { if (!enable) { return true; } if (mcc == null) { mcc = _init(); } return mcc.set(encodeKey(key), value); } /* * @return true if success */ public boolean set(IdEntity obj, int lifeSeconds) { return set(KeyGenerator.getKey(obj), obj, lifeSeconds); } /** * @param lifeSeconds the data will be discard after the given seconds. * @return true if success */ public boolean set(String key, Object value, int lifeSeconds) { if (!enable) { return true; } if (mcc == null) { mcc = _init(); }// value = convert(value); return mcc.set(encodeKey(key), value, new Date(lifeSeconds * 1000)); } public IdEntity get(Class model, Long id) { return (IdEntity)get(KeyGenerator.getKey(model, id)); } public IdEntity[] get(Class model, String[] ids) { String[] keys = new String[ids.length]; for (int i = 0 ; i < ids.length ; i++) { keys[i] = KeyGenerator.getKey(model, new Long(ids[i])); } Object[] values = get(keys); IdEntity[] ret = new IdEntity[values.length]; for (int i = 0 ; i < values.length ; i++) { ret[i] = (IdEntity)values[i]; } return ret; } public Object[] get(String[] keys) { if (!enable) { return null; } if (mcc == null) { mcc = _init(); } for (int i = 0 ; i < keys.length ; i++) { keys[i] = encodeKey(keys[i]); } Map<String, Object> values = mcc.getMulti(keys); Object[] ret = new Object[keys.length]; for (int i = 0 ; i < keys.length ; i++) { ret[i] = values.get(keys[i]); if (ret[i] != null) {// ret[i] = convert(ret[i]); } } return ret; } public Object get(String key) { if (!enable) { return null; } if (mcc == null) { mcc = _init(); } Object value = mcc.get(encodeKey(key)); if (value != null) {// value = convert(value); logger.writeHitLog(key);// System.out.println("Object pool hit: " + key); } else { logger.writeMissedLog(key);// System.out.println("Object pool missed: " + key); } return value; } public void remove(IdEntity obj) { remove(KeyGenerator.getKey(obj), false); } public void remove(IdEntity obj, boolean force) { remove(KeyGenerator.getKey(obj), force); } public void remove(Class model, String id) { remove(model, id, false); } public void remove(Class model, String id, boolean force) { remove(KeyGenerator.getKey(model, new Long(id)), force); } public void remove(String key) { remove(key, false); } public void remove(String key, boolean force) { if (!enable) { return; } if (mcc == null) { mcc = _init(); } String encodedKey = encodeKey(key); Object o = mcc.get(encodedKey); if (o != null) { if (force) { mcc.delete(encodedKey); } else { // 在数据发生改变后,会删掉cache里的值。但这时事务还没提交,数据库里的值还没变,如果有人这时读数据,发现cache里 // 没值就会去数据库读,这样就会产生脏数据。为了避免这种现象,这里延迟1s再删数据以等待事务提交完成,可以降低产生 // 脏数据的可能 mcc.set(encodedKey, o, new Date(1 * 1000)); } } } public boolean isCachable(Class cls) { if (cls.getName().contains("$$")) { cls = cls.getSuperclass(); } return config.isCachable(cls); } public int getLife(Class cls) { return config.getLife(cls); } // key maybe include some char invalid for memcache, so we need to encode it private String encodeKey(String key) { try { java.security.MessageDigest md5 = java.security.MessageDigest.getInstance( "MD5" ); md5.update(key.getBytes()); byte tmp[] = md5.digest(); key = EncodeUtils.base64Encode(tmp); return key; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return key; } } public static void main(String[] args) { long t1 = new Date().getTime(); ObjectPool pool = new ObjectPool(); pool.setEnable(true); pool.set("kkk", "OOOO"); Object o = pool.get("kkk"); System.out.println("o:"+o);// for (int i = 0 ; i < 1000000 ; i++) {// pool.set(""+i, ""+i);// }// // long t2 = new Date().getTime();// // System.out.println("set time:"+(t2-t1));// // for (int i = 0 ; i < 1000000 ; i++) {// pool.get(""+i);// }// long t3 = new Date().getTime();// // System.out.println("set time:"+(t3-t2)); }}
详细解决方案
java Memcached-一
热度:1092 发布时间:2016-04-17 21:16:52.0
相关解决方案
- java 乱码 汉字是 ? 如何转换成汉字
- java web 登录次数限制,该如何解决
- java 工商银行网银支付 B2B的 都亟需什么,需要注意什么
- Java Applet程序从JDK6升级到7时遇到的有关问题
- java web 视频相干
- 请教一个关于链接后缀的有关问题(java web 应用)
- java 系统单点登录解决方案
- java.lang.NumberFormatException: For input string: "id"该如何处理
- java.lang.NoSuchMethodException: setId([Ljava.lang.String;)解决方法
- java 获取客户端IP解决办法
- JAVA 后台怎么获得前台页面FCKedit编辑器中的内容以及内容的样式
- java 正则化匹配有关问题
- java web 受阻
- java.lang.IllegalStateException: No output folder,该怎么解决
- java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccess,该如何解决
- java 乱码有关问题 急求大神
- java EE错误如何解决阿,都是过了,没有能解决的!
- java 工程打包有关问题 多谢各位大神!多谢
- JAVA WEB导航条,该怎么处理
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password,该如何处理
- java 中Node 有关问题
- 关于 java 引述传递和值传递,你的知否
- 吐了,java Timer 终止不了。
- Java Web 学习中有关问题,请高手指教
- java web中的url地址小疑点。
- java web开发解决办法
- java.lang.NullPointerException解决方法
- 关于 java cast 有关问题,你明白不
- java ftp 下传和上载乱码有关问题
- java web项目上的一些文件