# Basic **Repository Path**: zhongyu9/Basic ## Basic Information - **Project Name**: Basic - **Description**: 基础项目 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-07-05 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #Basic 1. ```@Service```用于标注业务层组件 2. ```@Controller```用于标注控制层组件(如struts中的action) 3. ```@Repository```用于标注数据访问组件,即DAO组件 4. ```@Component```泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 #Spring 事物 ```@Transactional``` ### 隔离级别: 隔离级别是指若干个并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读取、重复读、幻读。 枚举类(org.springframework.transaction.annotation.Isolation)中定义了5个表示隔离级别的值: 1. ```DEFAULT``` :这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是:READ_COMMITTED。 2. ```READ_UNCOMMITTED``` :该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。 3. ```READ_COMMITTED``` :该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。 4. ```REPEATABLE_READ``` :该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别可以防止脏读和不可重复读。 5. ```SERIALIZABLE``` :所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 ### 传播行为 传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。 枚举类( org.springframework.transaction.annotation.Propagation)中定义了6个表示传播行为的值: 1. ```REQUIRED``` :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 1. ```SUPPORTS``` :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 1. ```MANDATORY``` :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 1. ```REQUIRES_NEW``` :创建一个新的事务,如果当前存在事务,则把当前事务挂起。 1. ```NOT_SUPPORTED``` :以非事务方式运行,如果当前存在事务,则把当前事务挂起。 1. ```NEVER``` :以非事务方式运行,如果当前存在事务,则抛出异常。 1. ```NESTED``` :如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于REQUIRED。 #Spring AOP 1. 使用 ```@Aspect``` 注解将一个java类定义为切面类 2. 使用 ```@Pointcut```定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。 - 根据需要在切入点不同位置的切入内容 - 使用```@Before```在切入点开始处切入内容 - 使用```@After```在切入点结尾处切入内容 - 使用```@AfterReturning```在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理) - 使用```@Around```在切入点前后切入内容,并自己控制何时执行切入点自身的内容 - 使用```@AfterThrowing```用来处理当切入内容部分抛出异常之后的处理逻辑 - 可以引入```ThreadLocal```对象解决同步问题 - 定义每个切面的优先级: 使用```@Order(i)```注解来标识切面的优先级。i的值越小,优先级越高。 > - 在切入点前的操作,按order的值由小到大执行 > - 在切入点后的操作,按order的值由大到小执行 #定时任务 - 在Spring Boot的主类中加入```@EnableScheduling```注解,启用定时任务的配置。 ```@Scheduled(fixedRate = 5000)``` :上一次开始执行时间点之后5秒再执行, ```@Scheduled(fixedDelay = 5000)``` :上一次执行完毕时间点之后5秒再执行, ```@Scheduled(initialDelay=1000, fixedRate=5000)``` :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次, ```@Scheduled(cron="*/5 * * * * *")``` :通过cron表达式定义规则。 **配置文件相关:http://www.jianshu.com/p/80621291373b** **数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)** http://blog.csdn.net/qq_31125793/article/details/51241943 - NOTE: 测试均是MySQL库 - **测试结论** - 性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。 - druid功能最为全面,sql拦截等功能,统计数据较为全面,具有良好的扩展性。 - 综合性能,扩展性等方面,可考虑使用druid或者hikariCP连接池。 - 可开启prepareStatement缓存,对性能会有大概20%的提升。 - **功能测试** ![表格图片](http://git.oschina.net/uploads/images/2017/0307/114125_b77aaee8_486416.png "在这里输入图片标题") ```-Dfile.encoding=UTF-8``` ```java -jar xxxxx.jar --spring.profiles.active=test``` 表示加载测试环境的配置 ```java -jar xxxxx.jar --spring.profiles.active=pro``` 表示加载生产环境的配置 ``` CPU:4核 内存:16G 硬盘:3块(系统,应用,备份) 带宽:8M 操作系统 :linux centos 6.5 ``` ```@WebServlet```, ```@WebFilter``` 和 ```@ServletComponentScan``` 配合使用自定义 servlet 和 filter 或者如下方式也可以自定义 servlet ``` @Bean public ServletRegistrationBean servletRegistrationBean() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); BootDruidServlet bootDruidStatViewServlet = new BootDruidServlet(); servletRegistrationBean.setServlet(bootDruidStatViewServlet); return servletRegistrationBean; } ``` 缓存:http://www.jianshu.com/p/64f684bd0ce9 ``` //@EnableConfigurationProperties({BootApp.class /*, BootDruid.class*/}) // 配置文件 @Configuration @ConfigurationProperties(prefix = "app") @EnableConfigurationProperties OR @Configuration + @ConfigurationProperties : 完成配置文件映射 ``` ```@MapperScan``` 可指定 Mapper 接口包 或者 在 Mapper 接口上使用 ```@Mapper``` 注解 解决 src/main/java 下面的资源文件不打包 ``` processResources { from('src/main/java') { // include '**/*' // 将所有文件包括 *.java 文件 include '**/*.xml' } } ```