发表于: 2017-09-27 22:10:57

1 665


今天完成的事情:今天试着用了memcache给任务五的代码里加上缓存

                             本来的思路是登陆的时候验证账号密码的时候调用缓存 没有的话就存进缓存 

                             我觉得这样会和cookie冲突 凯博大佬说 缓存是不用在账号密码上的 是用在 查询数据上的

                                

public class MemcachedUtil {
//创建全局的唯一实例
   protected static MemCachedClient mcc = new MemCachedClient();

   protected static MemcachedUtil memCached = new MemcachedUtil();

   //设置与缓存服务器的连接池
   static {
//服务器列表和其权重,个人memcached地址和端口号
       String[] servers = {"127.0.0.1:11211"};
       Integer[] weights = {3};

       //获取socke连接池的实例对象
       SockIOPool pool = SockIOPool.getInstance();

       // 设置服务器信息
       pool.setServers( servers );
       pool.setWeights( weights );

       //设置初始连接数、最小和最大连接数以及最大处理时间
       pool.setInitConn(5);
       pool.setMinConn(5);
       pool.setMaxConn(250);
       pool.setMaxIdle(100*60*60*6);

       //设置主线程的睡眠时间
       pool.setMaintSleep(60);

       //设置TCP的参数,连接超时等
       pool.setNagle(false);
       pool.setSocketTO(60);
       pool.setSocketConnectTO(0);

       //初始化连接池
       pool.initialize();

       //压缩设置,超过指定大小的都压缩
//      cachedClient.setCompressEnable(true);
//      cachedClient.setCompressThreshold(1024*1024);

   }

/**
    * 保护型构造方法,不允许实例化!
    *
    */
   protected MemcachedUtil()
{

}

/**
    * 获取唯一实例.
    * @return
    */
   public static MemcachedUtil getInstance()
{
return memCached;
   }

/**
    * 添加一个指定的值到缓存中.
    * @param key
    * @param value
    * @return
    */
   public static boolean add(String key,Object value){
return mcc.add(key,value);
   }

public static boolean add(String key, Object value, Integer expity){
return mcc.add(key, value, expity);
   }


/**
    * 添加或替换一个指定的值到缓存中.
    * @param key
    * @param value
    * @return
    */
   public static boolean set(String key,Object value){return mcc.set(key, value);}

public static boolean set(String key,Object value,Integer expity){return mcc.set(key, value, expity);}

/**
    * 替换一个指定的值到缓存中.
    * @param key
    * @param value
    * @return
    */
   public static boolean replace(String key,Object value){
return mcc.replace(key, value);
   }

public static boolean replace(String key,Object value,Integer expity){
return mcc.replace(key, value, expity);
   }

/**
    * 删除一个指定的值到缓存中.
    * @param key
    * @return
    */
   public static boolean delete(String key){
return mcc.delete(key);
   }

/**
    * 根据指定的关键字获取对象.
    * @param key
    * @return
    */
   public static Object get(String key){
return mcc.get(key);
   }
}

还是这个工具类

public List<User> selectAll (String username){
List<User> userall= loginDAO.selectAll(username);
   if (MemcachedUtil.get("username")==null){
List users=userMapper.userAll();
       MemcachedUtil.set("username",username);
       System.out.println("数据库");
       return users;
   }else {
System.out.println("缓存");
       return (List)MemcachedUtil.get("username");
//       return userall;
   }

在查询所有的时候 实现类里面添加调用缓存

运行的时候日志文件有问题 这个一直没研究 顺便决定讲log4j的小课堂 研究一番

  Log4j一般由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。

一、定义配置文件
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法:
1.配置根Logger,其语法为:
  log4j.rootLogger = [ level ] , appenderName, appenderName, …
  其中,level是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。
2.配置日志信息输出目的地Appender,其语法为:
  log4j.appender.appenderName = fully.qualified.name.of.appender.class
  log4j.appender.appenderName.option1 = value1
  其中,Log4j提供的appender有以下几种:
  org.apache.log4j.ConsoleAppender(控制台),
  org.apache.log4j.FileAppender(文件),
  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
  org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3.配置日志信息的格式(布局),其语法为
  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
  log4j.appender.appenderName.layout.option1 = value1

  其中,Log4j提供的layout有以e几种:
  org.apache.log4j.HTMLLayout(以HTML表格形式布局),
  org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息
  %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL%-5p表示占5个字符,不足时右边补空格。
  %r 输出自应用启动到输出该log信息耗费的毫秒数
  %c 输出所属的类目,通常就是所在类的全名,或者在log4j.properties中定义的logger的名称。
  %t 输出产生该日志事件的线程名
  %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

这个百度一下都一样 但我开始还是有一点不理解 先把我的代码放上去

### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File =logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

开始定义日志级别为 debug 然后stdout D E 这三个是随意的名字 用来输出到这三个

然后就是根据这三个来配置 就是log4j.appender.这三个分别

log4j.appender.stdout org.apache.log4j.ConsoleAppender

= 后面是他的常用配置 就是上介绍的那几个  这里第一个就是输出到控制台 他有几个单独的配置 (有的是公共使用的)

Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
Target=System.err:默认值是System.out。

后面两个就是布局 上面提过了 

第二个是输出到文件 多了一个定义文件的名字 位置后面得也一样就不贴出来了


 二、在代码中使用Log4j
1.得到记录器
  使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:
  public static Logger getLogger( String name)
  通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:  static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

我这里使用的是

 private static Logger logger = Logger.getLogger(UserController.class);

 2.读取配置文件
  当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:
  BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
  PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
  DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
但是我们一般是没用这一步的 我理解是pom文件里加入了依赖 他自动配置环境了
3.插入记录信息(格式化日志信息)

  当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:

  Logger.debug ( Object message ) ;
  Logger.info ( Object message ) ;
  Logger.warn ( Object message ) ;
  Logger.error ( Object message ) 

明天计划的事情:继续写缓存 测试缓存
遇到的问题:缓存运行起来有问题 因为与我原来写的逻辑不契合  

      打印出来的日志有问题 
收获:

还有几点在使用中要注意的 首先 定义logger

 private static Logger logger = Logger.getLogger(UserController.class);

获得Logger的时候是通过名字来获得的。在配置文件中你可以写log4j.logger.包名,那么该包下的所有类会被匹配到该logger;
你也可以写log4j.logger.类名,比如我们上面使用的,那么只有该类会被匹配到该logger;不管有没有其它匹配的,任何类都将记录在rootLogger中。对于RollingFileAppender,如果指定log4j.appender.L2.maxBackupIndex = 5,那么当超过一个文件时,会自动产生原来日志文件名,原来日志文件名.1,原来日志文件名.2,原来日志文件名.3这样的日志,如infoL1.log,infoL1.log.1,infoL1.log.2等,其中原来日志文件名中的日志是最新的,其次是原来日志文件名.1,依次下去。每个文件中时间最新的在文件底部。log4j.logger.freemarker=ERROR这种配置会将freemarker中的错误记录在rootLogger中,

关于log4j的启动

Log4J提供了一个默认初始化流程。这个默认的流程作为静态代码块注册在LogManager类中。下面结合LogManager的源代码,来看看Log4J提供的初始化流程:
 Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));
    repositorySelector = new DefaultRepositorySelector(h);
创建一个日志体系对象,并新建一个RootLogger作为这个日志体系的rootLogger,并将rootLogger的日志级别设置为DEBUG;
 String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY, null);
DEFAULT_INIT_OVERRIDE_KEY的值为log4j.defaultInitOverride,这句代码代表,在系统环境中找名字为log4j.defaultInitOverride的系统变量;
if(override == null || "false".equalsIgnoreCase(override)) {
如果这个系统变量没有设置值,如果有值且设置为false,则按照Log4J的默认初始化流程进行,否则就跳过初始化配置流程;
String configurationOptionStr = OptionConverter.getSystemProperty(   DEFAULT_CONFIGURATION_KEY, null);
String configuratorClassName = OptionConverter.getSystemProperty(                                        CONFIGURATOR_CLASS_KEY, null);
URL url = null;
DEFAULT_CONFIGURATION_KEY=log4j.configuration
CONFIGURATOR_CLASS_KEY=log4j.configuratorClass
得到系统log4j.configuration和log4j.configuratorClass两个系统变量;
if (configurationOptionStr == null) {
    url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
    if (url == null) {
        url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
    }
}
DEFAULT_XML_CONFIGURATION_FILE=log4j.xml
DEFAULT_CONFIGURATION_FILE=log4j.properties
如果没有设置log4j.configuration变量,则先尝试使用ClassPath下的log4j.xml文件,如果没有log4j.xml文件,则使用ClassPath下的log4j.properties文件。
else {
    try {
       url = new URL(configurationOptionStr);
    } catch (MalformedURLException ex) {
  // so, resource is not a URL:
  // attempt to get the resource from the class path
       url = Loader.getResource(configurationOptionStr); 
    }
}
如果设置了log4j.configuration环境变量,则直接使用log4j.configuration环境变量指定的配置文件来加载配置。
if(url != null) {
LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");
    try {
        OptionConverter.selectAndConfigure(url, configuratorClassName,     LogManager.getLoggerRepository());
    } catch (NoClassDefFoundError e) {
        LogLog.warn("Error during default initialization", e);
    }
    } else {
    LogLog.debug("Could not find resource: ["+configurationOptionStr+"].");

任务开始时间:9.23

         预计完成时间:9.29

         是否有延期风险:暂无

禅道链接:http://task.ptteng.com/zentao/my-task.htm




返回列表 返回列表
评论

    分享到