关于spring集成mybatis如何实现mysql数据库读写分离的实例分析

import org.aspectj.lang.JoinPoint;

本文通过实例代码给大家介绍了spring集成mybatis实现mysql数据库读写分离,需要的朋友可以参考下

retention注解_required注解作用retention注解_required注解作用


retention注解_required注解作用


14 }; //记得有“;”

前言

在网站的用户达到一定规模后,数据库因为负载压力过高而成为网站的瓶颈。幸运的是目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库的数据更新同步到另一台上。网站利用数据库的这一功能,实现数据库读写分离,从而改善数据库负载压力。如下图所示:

应用在写数据的时候,访问主数据库,主数据库通过主从机制将数据更新同步到从数据库,这样当应用读数据的时候,就可以通过从数据库获得数据。为了便于应用程序访问读写分离后的数据库,通常在应用使用专门的数据库访问模块,使数据库读写分离对应用透明。

而本博客就是来实现“专门的数据库访问模块”,使数据库读写分离对应用透明。另外,mysql数据库的主从可以参考我的mysql5.7.18的安装与主从。注意,数据库实现了主从,才能做数据库的读写分离,所以,没有实现数据库主从的记得先去实现数据库的主从

配置读写数据源(主从数据库)

mysqldb.properties #主数据库数据源

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.=jdbc:mysql://192.168.0.4:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false

jdbc.username=root

jdbc.password=123456

jdbc.initialSize=1

jdbc.minIdle=1

jdbc.maxActive=20

jdbc.maxWait=60000

jdbc.removeAbandoned=true

jdbc.removeAbandonedTimeout=180

jdbc.timeBetweenEvictionRunsMillis=60000

jdbc.minEvictableIdleTimeMillis=300000

jdbc.validationQuery=SELECT 1

jdbc.testWhileIdle=true

jdbc.testOnBorrow=false

jdbc.testOnReturn=false

#从数据库数据源

sle.jdbc.driverClassName=com.mysql.jdbc.Driver

sle.jdbc.=jdbc:mysql://192.168.0.221:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false

sle.jdbc.username=root

sle.jdbc.password=123456

sle.jdbc.initialSize=1

sle.jdbc.minIdle=1

sle.j}以下为模拟案例dbc.maxActive=20

sle.jdbc.maxWait=60000

sle.jdbc.removeAbandoned=true

sle.jdbc.removeAbandonedTimeout=180

sle.jdbc.timeBetweenEvictionRunsMillis=60000

sle.jdbc.minEvictableIdleTimeMillis=300000

sle.jdbc.validationQuery=SELECT 1

sle.jdbc.testWhileIdle=true

sle.jdbc.testOnReturn=false主、从数据库的地址记得改成自己的,账号和密码也需要改成自己的;其他配置项,大家可以酌情自行设置

mybatis-spring.xml

xmlns:xsi="" xmlns:context=""

xmlns:aop="" xmlns:tx=""

xsi:schemaLocation="

">

class="org.springframework.jdbc.datasource.DataSourceTransactionMar">

AOP实现数据源的动态切换

DataSource.ja package com.yzb.util;

import ja.lang.annotation.ElementType;

import ja.lang.annotation.RetentionPolicy;

import ja.lang.annotation.Target;

/

RUNTIME

编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

/

@Target(ElementType.METHOD)

public @intece DataSource

{String value();

}DataSourceAspect.ja package com.yzb.util;

import ja.lang.reflect.Mod;

import org.aspectj.lang.reflect.ModSignature;

public class DataSourceAspect

{/

在dao层方法获取datasource对象之前,在切面中指定当前线程数据源

public void before(JoinPoint point)

{Object target = point.getTarget();

String mod = point.getSignature().getName();

Class<

伤寒蓄血证

package com.sy.demo.annotation;import ja.lang.annotation.Documented;import ja.lang.annotation.ElementType;import ja.lang.annotation.Retention;import ja.lang.annotation.RetentionPolicy;import ja.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @intece Table {public String value();}

目录 1 拼音 2 英文参考 3 注解 4 参考资料 附: 1 治疗伤寒蓄血证的方剂 2 古籍中的伤寒蓄血证 1 拼音 shāng hán xù xuè zhèng

这个是JDK1.5加入的新特性,annotation(泛型)

2 英文参考

abdominal mass in exogenous febrile disease [湘雅医学专业词典]

bloodretention syndrome of exogenous febrile disease [湘雅医学专业词典]

3 注解

伤寒蓄血证为病证名[1]。

参太阳府病、伤寒蓄水证:

太阳腑病为病证名[2]。亦称太阳腑证[2]。为太阳经邪热不解,内犯膀胱所致[2]。有蓄水与蓄血之分[2]。《伤寒溯源集·中风失治》:“太阳者,膀胱之经也。……太阳之经邪不解而内犯膀胱,则下焦不蒸而气液不得上腾。”《伤寒论辨证广注·太阳病》:“太阳之邪传里,膀胱腑病,水气上逆而作渴也,故宜五苓散。”《注解伤寒论》卷三:“太阳经邪热不解,随经入腑,为热结膀胱,……太阳多热,热在膀胱,必与血相搏。”《伤寒辨证》卷四:“小腹急者,邪在下焦也。黑者,瘀血渍之也。利者,血病而气不病也。”《伤寒医诀串解》卷一:“何谓太阳腑证?曰表邪不去,必入于里,膀胱为表中之里也,有蓄水、蓄血之辨。太阳证,其人口渴,烦躁,不得眠,脉浮,不利,水入即吐,为膀胱蓄水证,宜五苓散。太阳证,其人如狂,小腹硬满,自利,脉沉,为膀胱蓄血证,宜桃仁承气汤。”亦有以蓄血为瘀血蓄于下焦,不在膀胱,为伤寒兼证[2]。《医学心悟》卷二:“伤寒兼症者,非传经六经之正病,……蓄血者,瘀血蓄于下焦也。”

Ja代码中前面带@是什么意思

注解 ,从这个注解看,应该是p@MyAnnotation(value = "test")public class MyClass { @MyAnnotationackage testAnnotation;spring的@serv(创建对象)@Autowired(自动装配)

关于ja注解方法isAnnotationPresent

TestC@Inheritedlass t = new TestClass();

isAnnotationPresent(Class)这句话的意思应该是说方法里的参数必须

是Annotation的子类,你让你的Tx类继承下Annotation应该就可以了。

JAVA-Spring注解实现AOP权限拦截,如何取得方法上自定义Annotation的值呢?

import ja.lang.annotation.RetentionPolicy;

import ja.lang.reflect.InvocationTargetException;

import ja.lang.reflect.Mod;

@intece GetView {

String Mod();

String Value();

}public class Temp {

@GetView(Mod = "aa", Value = "bb")

public void test() {

System.out.println("In test mod.");

}public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchModException {

Temp temp = new Temp();

Mod mod = temp.getClass().getMod("test");

System.out.println(mod.isAnnotationPresent(GetView.class));

mod.invoke(temp);

GetView view = mod.getAnnotation(G

etView.class);

System.out.println(view.Mod());

System.out.println(view.Value());

你应该可以获取到 Mod 对象,这个代表你拦截到的 方法 mod.getAnnotation(getView.class); 你就可以获取到 对应的注解对象,然后通过注解对象,获取注解里面对应的属性值。

ja注解是怎么实现的

/

注解的使用一般是与ja的反射一起使用,下面是一个例子

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,jac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。

自定义注解及其应用

1)、定义一个简单的注解

public @intece MyAnnotation {

//......

}2)、把注解加在某个类上:

@MyAnnotation

public class AnnotationTest{

//......

自定义注解@MyAnnotation

1 package com.ljq.test;

23 import ja.lang.annotation.ElementType;

4 import ja.lang.annotation.Retention;

5 import ja.lang.annotation.RetentionPolicy;

78 /

9 定义一个注解

10

11

12 @author jiqinlin

13

14 /

15 //Ja中提供了四种元注解,专门负责注解其他的注解,分别如下

17 //@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:

18 //RetentionPolicy.SOURCE: 停留在ja源文件,编译器被丢掉

19 //RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)

20 //RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息

21

22 //@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括

23 //ElementType.CONSTRUCTOR: 构造器声明

24 //ElementType.FIELD: 成员变量、对象、属性(包括enum实例)

25 //ElementType.LOCAL_VARIABLE: 局部变量声明

26 //ElementType.METHOD: 方法声明

27 //ElementType.PACKAGE: 包声明

28 //ElementType.PARAMETER: 参数声明

29 //ElementType.TYPE: 类、接口(包括注解类型)或enum声明

30

31 //@Documented将注解包含在JaDoc中

32

33 //@Inheried允许子类继承父类中的注解

34

35

36 @Retention(RetentionPolicy.RUNTIME)

37 @Target({ElementType.METHOD, ElementType.TYPE})

38 public @intece MyAnnotation {

39 //为注解添加属性

40 String color();

41 String value() default "我是林计钦"; //为属性提供默认值

42 int[] array() default {1, 2, 3};

43 Gender gender() default Gender.MAN; //添加一个枚举

44 MetaAnnotation metaAnnotation() default @MetaAnnotation(birthday="我的出身日期为1988-2-18");

45 //添加枚举属性

46

47 }

注解测试类AnnotationTest

1 package com.ljq.test;

23 /

5

6

7 @author jiqinlin

8

9 /

10 //调用注解并赋值

11 @MyAnnotation(metaAnnotation=@MetaAnnotation(birthday = "我的出身日期为1988-2-18"),color="red", array={23, 26})

1public @intece MyAnnotation4Class {2 public class AnnotationTest {

13

14 public static void main(String[定义注解:使用 @intece 关键字定义注解。注解声明中可以定义元素,元素类型可以是基本类型、String、Class、枚举类型或其它注解类型。] args) {

15 //检查类AnnotationTest是否含有@MyAnnotation注解

16 if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){

17 //若存在就获取注解

18 MyAnnotation annotation=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);

19 System.out.println(annotation);

20 //获取注解属性

21 System.out.println(annotation.color());

22 System.out.println(annotation.value());

23 //数组

24 int[] arrs=annotation.array();

25 for(int arr:arrs){

26 System.out.println(arr);

27 }

28 //枚举

29 Gender gender=annotation.gender();

31 //获取注解属性

32 MetaAnnotation meta=annotation.metaAnnotation();

33 System.out.println(meta.birthday());

34 }

35 }

36 }

枚举类Gender,模拟注解中添加枚举属性

1 package com.ljq.test;

2 /

3 枚举,模拟注解中添加枚举属性

4

5 @author jiqinlin

6

7 /

8 public enum Gender {

9 MAN{

10 public String getName(){return "男";}

11 },

12 WOMEN{

13 public String getName(){return "女";}

15 public abstract String getName();

16 }

注解类MetaAnnotation,模拟注解中添加注解属性

1 package com.ljq.test;

23 /

4 定义一个注解,模拟注解中添加注解属性

5

6 @author jiqinlin

7

8 /

9 public @intece MetaAnnotation {

10 String birthday();

11 }

Ja 单元测试中Resource的问题

}}

一、

4 注解测试类

@Resource这是使用到了ja注解的一个机制。首先得明白ja注解的机制是什么、原理以及有什么好处。

System.out.println(c.getName());

我这里只是简单介绍了JAVA中的注解的含义,具体使用方法和原理网上可以搜索到很详细的文章。

JAVA中的注解:

ja.lang.annotation.Retention可以在您定义Annotation型态时,指示编译器如何对待您的自定义 Annotation,预设上编译器会将Annotation资讯留在class档案中,但不被虚拟机器读取,而仅用于编译器或工具程式运行时提供资讯。

二、对ja注解有所认识之后,现在就来聊聊@Resource的用处了。

@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。

三、通常我们在使用ja依赖注入时,比较喜欢选择Spring的框架来达到我们的目的,而Spring框架在2.5版本后开始引入了ja注解机制,如:@Resource。当然还可以通过看Spring框架的注解机制的使用来帮助学习对ja注解的了解。

JAVA的注解@Api和@ApiOperation的作用是什么,怎么跳转页面的

6 import ja.lang.annotation.Target;

1、构造方法上加注解和普通方法加注解是一样的在构造方法定义前加 @注解类型就像行了。

public class Car {

@Deprecated

public Car() {

2、ja语义规定注解类不能定义构造方法。可以使用default 关键字规定默认值,规定了默认值在使用时就可以省略属性赋值。

@Target(ElementType.METHOD)

@Docum @author leizhimin 2009-12-18 15:23:12ented

public @intece Auth {

/

是否验证登陆 true=验证 ,false =String name(); 不验证

public boolean verifyLogin() default true;

/

是否验证URL true=验证 ,false = 不验证

public boolean verifyURL() default true;

}

springboot注解、工厂特性创建对象

16

此注解的作用:用来标识这是一个springboot入口类,这个标识只能出现一次。

@SpringBootApplication 是一个派生注解|组合注解 等价以下三个:

1.通过main函数这种方式启动内部内嵌tomcat服务。

通过标注ja入口方式为头给SpringApplication,并告知当前springboot主应用类是谁,从而启动springboot中tomcat容器。

2.SpringApplication.run(Application.class,args);

参数1:入口类类对象 目的让@EnableAutoConfiguration 自动配置spring时将@ComponentScan扫描到注解创建对象一并放入工厂。

我们application.yml中写的的参数是内部参数如:

server:

port: 8989

servlet:

context-path: /nono

外部虚拟机参数如果有多个位置选择可以这么写:如下:

@RestController == @Controller + @ResponseBody

修饰范围: 用在类上,用在所有上

作用: 用来实例当前对象为一个对象,将控制中所有方法的返回值转换为json并响应到前端。

@ResponseBody(将当前方法返回值转为json,响应给浏览器)

我们现在的开发方式都是前后端分离的:

@RequestMapping

作用:用来加入访问路径。

修饰范围:类(加入命名空间) 方法上(指定具体路径)

@GetMapping

作用:限定请求方式只能是GET,并指定路径。

修饰范围:方法上。

同样的还有:@PostMapping,@DeleteMapping,@PutMapping

Springboot = Spring 项目管理工厂特性 + springmvc

1、创建单个自定义对象

注解方式:@Component 通用组件对象的创建注解

@Serv标识业务层组件创建 @Controller对象创建 @Reitory用来创建DAO组件注解

(不是三层架构里的类,创建对象用@Component)

2、一次性创建多个组件对象包含复杂对象

复杂对象如Calendar 日历对象

@Configuration 配置注解|派生注解 修饰范围:用在类上 作用:相当于曾经spring.xml配置文件

@Configuration是派生注解:

@Target(ElementType.TYPE)

@Documented

@Component

@Bean 注解 修饰范围:方法上 作用:相当于spring.xml bean标签作用 }else{ 用来创建这个对象在工厂的一个实例

@Component和@Configuration的效果一样,只是@Configuration在springboot中有表明是配置对象的意思

总结:日后在使用Springboot的过程中创建单个对象用@Component注解,创建多个对象使用@Configuration注解。

staters启动器:

spring-boot-starter-web 是一组方便依赖关系的描述符。