发表于: 2017-07-09 14:10:52

1 1169


今天完成的:

重写了Task5

收获:

补上昨天的问题

1.怎么查找资料

做任务的话,首先看师兄的日报,理解任务要求和流程,查找资料主要靠百度,暂时不需要google。

2.怎么定位问题

代码异常首先看日志,找到异常,百度,难以解决的打断点调试。逻辑上有问题直接打断点调试。

3.怎么解决问题

主要靠百度和以前积累的经验,不行就一步一步调试

4.怎么重构代码

比如Task5,功能可以实现,逻辑也没有问题,但拦截器和控制器结构设计有问题,有时间重构一下。

5.怎么选择框架

根据业务场景考虑,比如mybatis和hibernate,mybatis轻量级,灵活性可配置程度高,而hiberenate更重量级,灵活性差,写稍微复杂的查询过程很麻烦。

6.怎么测试

单元测试。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);
  1. 打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


返回列表 返回列表
评论

    分享到