今天以代码实例的形式总结一下向memcached中保存Java实体需注意的问题:
memcached工具类代码:
package com.ghj.packageoftool; import java.util.Date; import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; /** * Memcached工具类 * * @author GaoHuanjie */ public class MemcachedUtils { private static MemCachedClient memCachedClient; static { /************************************配置Memcached**************************************/ SockIOPool sockIOPool = SockIOPool.getInstance(); sockIOPool.setServers(new String[]{"127.0.0.1:11211"});//设置memcached服务器地址 sockIOPool.setWeights(new Integer[]{3}); //设置每个MemCached服务器权重 sockIOPool.setFailover(true); //当一个memcached服务器失效的时候是否去连接另一个memcached服务器. sockIOPool.setInitConn(10); //初始化时对每个服务器建立的连接数目 sockIOPool.setMinConn(10); //每个服务器建立最小的连接数 sockIOPool.setMaxConn(100); //每个服务器建立最大的连接数 sockIOPool.setMaintSleep(30); //自查线程周期进行工作,其每次休眠时间 sockIOPool.setNagle(false); //Socket的参数,如果是true在写数据时不缓冲,立即发送出去。Tcp的规则是在发送一个包之前,包的发送方会等待远程接收方确认已收到上一次发送过来的包;这个方法就可以关闭套接字的缓存——包准备立即发出。 sockIOPool.setSocketTO(3000); //Socket阻塞读取数据的超时时间 sockIOPool.setAliveCheck(true); //设置是否检查memcached服务器是否失效 sockIOPool.setMaxIdle(1000*30*30); // 设置最大处理时间 sockIOPool.setSocketConnectTO(0); //连接建立时对超时的控制 sockIOPool.initialize(); // 初始化连接池 if (memCachedClient == null){ memCachedClient = new MemCachedClient(); } } private MemcachedUtils() { } /** * 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。 * * @author GaoHuanjie */ public static boolean add(String key, Object value, Date expire) { try { return memCachedClient.add(key, value, expire); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据键获取Memcached内存缓存管理系统中相应的值 * * @author GaoHuanjie */ public static Object get(String key) { try { return memCachedClient.get(key); } catch (Exception e) { e.printStackTrace(); return null; } } }
测试main方法所在类代码:
package com.ghj.packageofclient; import java.util.Date; import com.ghj.packageoftool.MemcachedUtils; import com.ghj.packageofvo.User; public class Client{ public static void main(String[] args) { MemcachedUtils.add("user", new User("liunannan", "[email protected]"), new Date(1000*60));//向Memcached中添加一个序列化的对象 User user = (User)(MemcachedUtils.get("user")); System.err.println("用户名:"+user.getUserName() + ",密码:" + user.getPassword()); } }
Java实体代码:
package com.ghj.packageofvo; /** * 用户业务bean * * @author 高焕杰 */ public class User{ private String userName; private String password; public User(String userName, String password) { super(); this.userName = userName; this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
运行main方法,你将看到如下异常:
稍有Java基础的人一看便知:之所以出现这个问题完全是由于Java实体User类没有实例化造成的,所以User类应该改成如下代码:
package com.ghj.packageofvo; import java.io.Serializable; /** * 用户业务bean * * @author 高焕杰 */ public class User implements Serializable{ private static final long serialVersionUID = -3371451210123762490L; private String userName; private String password; public User(String userName, String password) { super(); this.userName = userName; this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
【0分下载工程代码】
时间: 2024-10-25 21:29:04