日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mybatis获取mysql源数据类型_spring集成mybatis实现mysql数据库读写分离

發布時間:2023/12/20 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis获取mysql源数据类型_spring集成mybatis实现mysql数据库读写分离 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在網站的用戶達到一定規模后,數據庫因為負載壓力過高而成為網站的瓶頸。幸運的是目前大部分的主流數據庫都提供主從熱備功能,通過配置兩臺數據庫主從關系,可以將一臺數據庫的數據更新同步到另一臺服務器上。網站利用數據庫的這一功能,實現數據庫讀寫分離,從而改善數據庫負載壓力。如下圖所示:

應用服務器在寫數據的時候,訪問主數據庫,主數據庫通過主從復制機制將數據更新同步到從數據庫,這樣當應用服務器讀數據的時候,就可以通過從數據庫獲得數據。為了便于應用程序訪問讀寫分離后的數據庫,通常在應用服務器使用專門的數據庫訪問模塊,使數據庫讀寫分離對應用透明。

而本博客就是來實現“專門的數據庫訪問模塊”,使數據庫讀寫分離對應用透明。另外,mysql數據庫的主從復制可以參考我的mysql5.7.18的安裝與主從復制。注意,數據庫實現了主從復制,才能做數據庫的讀寫分離,所以,沒有實現數據庫主從復制的記得先去實現數據庫的主從復制

配置讀寫數據源(主從數據庫)

mysqldb.properties

#主數據庫數據源

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=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

#從數據庫數據源

slave.jdbc.driverClassName=com.mysql.jdbc.Driver

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

slave.jdbc.username=root

slave.jdbc.password=123456

slave.jdbc.initialSize=1

slave.jdbc.minIdle=1

slave.jdbc.maxActive=20

slave.jdbc.maxWait=60000

slave.jdbc.removeAbandoned=true

slave.jdbc.removeAbandonedTimeout=180

slave.jdbc.timeBetweenEvictionRunsMillis=60000

slave.jdbc.minEvictableIdleTimeMillis=300000

slave.jdbc.validationQuery=SELECT 1

slave.jdbc.testWhileIdle=true

slave.jdbc.testOnBorrow=false

slave.jdbc.testOnReturn=false

主、從數據庫的地址記得改成自己的,賬號和密碼也需要改成自己的;其他配置項,大家可以酌情自行設置

mybatis-spring.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd">

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

AOP實現數據源的動態切換

DataSource.java

package com.yzb.util;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* RUNTIME

* 編譯器將把注釋記錄在類文件中,在運行時 VM 將保留注釋,因此可以反射性地讀取。

*

*/

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface DataSource

{

String value();

}

DataSourceAspect.java

package com.yzb.util;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.reflect.MethodSignature;

public class DataSourceAspect

{

/**

* 在dao層方法獲取datasource對象之前,在切面中指定當前線程數據源

*/

public void before(JoinPoint point)

{

Object target = point.getTarget();

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

Class>[] classz = target.getClass().getInterfaces(); // 獲取目標類的接口, 所以@DataSource需要寫在接口上

Class>[] parameterTypes = ((MethodSignature) point.getSignature())

.getMethod().getParameterTypes();

try

{

Method m = classz[0].getMethod(method, parameterTypes);

if (m != null && m.isAnnotationPresent(DataSource.class))

{

DataSource data = m.getAnnotation(DataSource.class);

System.out.println("用戶選擇數據庫庫類型:" + data.value());

HandleDataSource.putDataSource(data.value()); // 數據源放到當前線程中

}

} catch (Exception e)

{

e.printStackTrace();

}

}

}

DynamicDataSource.java

package com.yzb.util;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource

{

/**

* 獲取與數據源相關的key 此key是Map resolvedDataSources 中與數據源綁定的key值

* 在通過determineTargetDataSource獲取目標數據源時使用

*/

@Override

protected Object determineCurrentLookupKey()

{

return HandleDataSource.getDataSource();

}

}

HandleDataSource.java

package com.yzb.util;

public class HandleDataSource

{

public static final ThreadLocal holder = new ThreadLocal();

/**

* 綁定當前線程數據源

*

* @param key

*/

public static void putDataSource(String datasource)

{

holder.set(datasource);

}

/**

* 獲取當前線程的數據源

*

* @return

*/

public static String getDataSource()

{

return holder.get();

}

}

service接口上應用@DataSource實現數據源的指定

package com.yzb.service;

import java.util.List;

import com.yzb.model.Person;

import com.yzb.util.DataSource;

public interface IPersonService {

/**

* 加載全部的person

* @return

*/

List listAllPerson();

/**

* 查詢某個人的信息

* @param personId

* @return

*/

@DataSource("slave") // 指定使用從數據源

Person getPerson(int personId);

boolean updatePerson(Person person);

}

注意點

測試的時候,怎么樣知道讀取的是從數據庫了? 我們可以修改從數據庫中查詢到的那條記錄的某個字段的值,以區分主、從數據庫;

事務需要注意,盡量保證在一個數據源上進行事務;

當某個service上有多個aop時,需要注意aop織入的順序問題,利用order關鍵字控制好織入順序;

總結

以上所述是小編給大家介紹的spring集成mybatis實現mysql數據庫讀寫分離,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

總結

以上是生活随笔為你收集整理的mybatis获取mysql源数据类型_spring集成mybatis实现mysql数据库读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。