发表于: 2017-07-09 14:10:52
1 1169
今天完成的:
重写了Task5
收获:
补上昨天的问题
1.怎么查找资料
做任务的话,首先看师兄的日报,理解任务要求和流程,查找资料主要靠百度,暂时不需要google。
2.怎么定位问题
代码异常首先看日志,找到异常,百度,难以解决的打断点调试。逻辑上有问题直接打断点调试。
3.怎么解决问题
主要靠百度和以前积累的经验,不行就一步一步调试
4.怎么重构代码
比如Task5,功能可以实现,逻辑也没有问题,但拦截器和控制器结构设计有问题,有时间重构一下。
5.怎么选择框架
根据业务场景考虑,比如mybatis和hibernate,mybatis轻量级,灵活性可配置程度高,而hiberenate更重量级,灵活性差,写稍微复杂的查询过程很麻烦。
单元测试。main方法测试。
在重写Task5的过程中踩了很多坑
1.工作过程:body1发出request,被body2的拦截器拦截,1.判断表单数据是否为空,若不为空拦截器直接返回true。2.遍历本地cookie,查看是否存在该用户的cookie,若存在,则进行DES解密后与DB中的登录时间和uid字段比对,若相同,拦截器返回true,不同则返回false。拦截器返回true时进入controller,controller先判断表单数据是否为空,若不为空,则对密码进行MD5加盐后与DB密码字段比对,若相同,则继续执行,不同则返回fail页面。接着controller继续判断用户是否勾选记住密码复选框,若未勾选,则遍历本地cookie,取出之前与该用户匹配的cookie(若存在)并清除,同时保留其他用户cookie,若勾选了记住密码,则将登录时间和uid进行DES加密后存入cookie。最后返回一个包裹参数的modelAndView。
modelAndView其中一个参数是body2.page,tiles的配置文件通过*.page匹配请求后,通过tiles的视图解析器组合页面并输出。
2.打log的重要性和打断点调试的好处, 写了十多条System.out.println(),后来全部换成了logger.debug()。但这种需要在每个页面写一条logger的初始化。
private static Logger logger = Logger.getLogger(LoginServiceImpl.class);
- 打log的地点:
1. 异常分支或错误
2. 重大操作时一定要打log
3.有风险的方法头部和尾部
3.基本数据类型的比较,比如long为基本数据类型,Long为其包装类。比较时一定注意equals和==的区别。对于基本数据类型,==和equals是相同的,对于引用数据类型,==比较内存地址,equals比较内存地址中存放的数据。而对于String,String类重写了equals方法,为避免歧义,一般可以直接使用equals比较字符串,但当string可能为空的时候要特殊考虑,比如下面的非空验证,这里是调用“”的equals方法。
if (userName != null && !"".equals(userName.trim()) && password != null && !"".equals(password.trim())) {}
4.跨域访问cookie
// tokenCookie.setDomain(".Task5/login");跨域访问
// tokenCookie.setPath("/");设置跨域访问path
5.Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
1. 查询数据(select),首先通过指定的Key查询(get)Memcache中间缓存层数据,如果存在相对应数据,则直接获取出数据结果,查询过程完全不需要查询数据库。如果不存在,则查询MySQL数据库,并以key对应value的形式将查询结果存储在Memcache缓存数据中,然后将结果返回给查询语句。
2. 更新数据(update),首先更新数据,然后删除相关的memcache数据(delete)。
3. 增加数据(add),首先删除相关缓存数据,然后增加数据。
4. 删除数据(delete),删除数据,并删除Memcache数据。
1、解压下载的安装包到指定目录。
2、在 1.4.5 版本以前 memcached 可以作为一个服务安装,使用管理员权限运行以下命令:
c:\memcached\memcached.exe -d install
注意:你需要使用真实的路径替代 c:\memcached\memcached.exe。
3、然后我们可以使用以下命令来启动和关闭 memcached 服务:
c:\memcached\memcached.exe -d start
c:\memcached\memcached.exe -d stop
memcache工具类
public class CacheManager {
private static MemCachedClient mcc = null;
static {
//String[] servers ={"127.0.0.1:11211"};
String[] servers ={"139.199.105.238:11211"};
//负载权重
Integer[] weights = {100};
//创建一个实例对象SockIOPool,设置mcc参数
SockIOPool pool = SockIOPool.getInstance();
pool.setServers( servers );
pool.setWeights( weights );
//设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn( 100 );
pool.setMinConn( 100 );
pool.setMaxConn( 500 );
pool.setMaxIdle( 1000 * 60 * 60 * 6 ); //6小时
//设置主线程的睡眠时间
pool.setMaintSleep( 30 );
pool.setNagle( false );
pool.setSocketTO( 3000 );
pool.setSocketConnectTO( 0 );
pool.initialize();
//!!!注意:如果是我们自己的对象存放,最好重写序列化方法,不用使用默认。
mcc = new MemCachedClient();
//压缩设置,超过指定大小(单位为K)的数据都会被压缩
// mcc.setCompressEnable(true);
// mcc.setCompressThreshold(64*1024);
//使用代码
// String key="id00001";
// boolean r = mcc.set(key,"succe2ss", new Date(10 * 60 * 1000));//10分钟
// System.out.println("SET "+ r);
//
// System.out.println(mcc.get(key));
// System.out.println(mcc.get(key));
}
public CacheManager(){
}
public static MemCachedClient getMemCachedClient(){
return mcc;
}
public boolean set(String key,Object obj){
return mcc.set(key, obj);
}
public boolean set(String key,Object obj,Date date){
return mcc.set(key, obj,date);
}
public Object get(String key){
return mcc.get(key);
}
public boolean add(String key,Object obj){
return mcc.add(key, obj);
}
public static void main(String[] args) {
User user=new User();
user.setId(1);
user.setUserName("ss");
user.setPassword("dsfaf");
List list = new ArrayList<User>();
list.add(user);
CacheManager.getMemCachedClient().set("11", list);
System.out.println(CacheManager.getMemCachedClient().get("11"));
}
service使用memcache
public class DeveloperServiceImpl implements DeveloperService{
List<Developer> developers;
private static final Logger logger = Logger.getLogger(DeveloperServiceImpl.class);
@Autowired
private DeveloperDAO DeveloperDAO;
public List<Developer> queryDeveloper() {
List<Developer> list= (List<Developer>) CacheManager.getMemCachedClient().get("queryDeveloper");
if(list!=null){
logger.debug("从缓存中读取开发者列表---------------------");
return list;
}else{
List<Developer> developer=DeveloperDAO.queryDeveloper("%");
Boolean boo=CacheManager.getMemCachedClient().add("queryDeveloper",developer);
logger.debug(boo+"将数据库查询添加到缓存中----------------------");
return developer;
}
}
6.听了简单的集合类数据结构
7.集合类
遇到的问题:
本地压力测试使用memcache的项目90%line反而比没用memcache的响应慢,正在找原因,可能是sql查询太简单了,加了逻辑判断变慢了
明天的计划:
Task6,看看有没有时间改Task5
评论