陈晓锋的学习笔记

记录一些日常接触到的专业知识


  • Home

  • Categories

  • Archives

log4j2不使用配置文件,动态生成logger对象

Posted on 2018-08-06 | Edited on 2018-08-26 | In Utils | Comments: | Views:

https://www.cnblogs.com/0201zcr/p/5726072.html

Log4j的组成:

Log4j的三个重要组成:

  1. 日志记录器(Loggers)
  2. 输出端(Appenders)
  3. 日志格式化器(Layout)
1
2
3
org.apache.logging.log4j.core.Layout负责格式
org.apache.logging.log4j.core.Appender就是配置文件里的Appender,我们使用FileAppender,也可以使用RollingFileAppender,
org.apache.logging.log4j.core.config.Configuration和org.apache.logging.log4j.core.LoggerContext是负责Log4j的配置的。

LoggerContext

在日志系统中,LoggerContext有重要的作用,根据实际情况,一个应用可能存在多个有效的LoggerContext。

Configuration

每一个LoggerContext都有一个有效的Configuration。在重新配置期间,两个Configuration会同时存在;一旦日志器被重新赋予新的Configuration,旧的Configuration就会停止工作并丢弃。

The LoggerContext is the anchor for the logging system. It maintains a list of all the loggers requested by applications and a reference to the Configuration. The Configuration will contain the configured loggers, appenders, filters, etc and will be atomically updated whenever a reconfigure occurs.

介绍MyBatis

Posted on 2018-06-16 | Edited on 2018-08-26 | In 数据库 | Comments: | Views:

什么是MyBatis

MyBatis是一个Java持久化框架

它通过XML描述符或注解把对象与存储过程或SQL语句关联起来。

特点:与其他的ORM框架不同,MyBatis并没有将Java对象与数据库关联起来,而是将Java方法与SQL语句关联。

MyBatis允许用户充分利用数据库的各种功能,例如储存过程、视图、各种复杂的查询以及某数据库专有特性。

MyBatis支持声明式数据缓存。当一条SQL语句被标记为“可缓存”后,首次执行它时从数据库获取的所有数据会被存储在一段高速缓存中,今后执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。

用法

SQL语句存储在XML文件或Java注解中

如:

1
2
3
4
5
6
7
8
9
package org.mybatis.example

public interface BlogMapper{

@Select("select * from Blog where id = #{id}")

Blog selectBlog(int id);

}

执行的示例:

1
2
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

SQL语句和映射也可以外化到一个XML文件中:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>

执行也可以使用MyBatis API 执行语句:

1
Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

MyBatis Generator

MyBatis Generator是一个可以用来生成MyBatis dao,entity,mapper文件的一个工具。

JPA与MyBatis

JPA是一套规范,它的出现是为了结束Hibernate、TopLink、JDO等ORM框架的各自为营的局面。主流的ORM框架都实现了JPA标准。

MyBatis没有实现JPA。可以说,MyBatis是SQL Mapping框架。
MyBatis和ORM都是持久化框架。

MyBatis主要构件及其相互关系

从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个:

  • SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
  • Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
  • ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所需要的参数,
  • ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
  • TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换
  • MappedStatement MappedStatement维护了一条<select|update|delete|insert>节点的封装
  • SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql 表示动态生成的SQL语句以及相应的参数信息
  • Configuration MyBatis所有的配置信息都维持在Configuration对象之中。

image.png

收集自

  • WIKI
  • 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

Java并发编程实战

Posted on 2018-03-14 | Edited on 2018-08-26 | In Java , 并发编程 | Comments: | Views:

目录

第一章 简介

第一部分 基础知识

重点章节:基础构建模块

包括:

同步容器:Vector和HashTable

并发容器:ConcurrentHashMap和CopyOnWriteArrayList等

阻塞队列与 生产者消费者模式

阻塞方法和中断方法

同步工具类:闭锁,FutureTask,信号量,栅栏

第二部分 结构化并发应用程序

介绍Task Executor 和 ThreadPoolExecutor。

Executor框架将任务的提交与任务的执行策略 解耦。

介绍了 任务的取消与JVM关闭

第三部分 活跃性、性能与测试

介绍死锁(锁顺序死锁、协作对象之间的死锁)、死锁避免与诊断、饥饿、活锁等。

Amdahl(阿姆达尔定律):描述的是,在增加计算资源的情况下,程序在理论上能够被实现最高加速比,取决于程序中可并行组件与串行组件所占比重。

所以,需要减少锁的竞争(缩小锁的范围(集中代码块)、减小锁的粒度(多个锁保护、锁分段))

第四部分 高级主题(本书重点)

显式锁 : Lock / ReentrantLock 结合Java源码,了解AQS/SYNC/CAS语义等。

15章原子变量与非阻塞同步机制,讲述如何运用CAS,在不阻塞的情形下,完成同步。厘清CAS与阻塞同步之间的关系,适用的场景。

了解,CAS在非激烈竞争情况下的性能优势(不会引起上下文切换的开销)

16章内存模型(JMM),需要了解Happens-before与重排序的关系,认识到:

Happens-before中的程序操作规则:“如果程序中操作A在操作B之前,那么在线程中A操作将在B操作之前执行”。

“Each action in a thread happens-before every action in that thread that comes later in the program order” is trying to say is, “In a single thread, your program will runas ifit was executed in the exact order you wrote it. We might change the ordering behind the scene but we make sure that none of that would change the output.

重点在于单线程中,所见的结果不会有差别。

掌握延长初始化占位类模式,如下

publicclassResourceFactory{

privatestaticResourceHolder {

publicstaticResource resource =newResource();

}

publicstaticResourcegetResource(){

returnResourceHolder.resource;

}

}

了解Java提供的同步工具的灵活性与简便性

Object.wait()/notify()/notifyAll()

Condition.await()/signal()

synchronized

Lock

123

陈晓锋

没有什么干货啦

23 posts
13 categories
20 tags
© 2018 陈晓锋
Powered by Hexo v3.7.1
|
Theme – NexT.Mist v6.4.0