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

歡迎訪問 生活随笔!

生活随笔

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

数据库

java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置

發布時間:2024/9/27 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java相關:mysql+spring+mybatis實現數據庫讀寫分離的代碼配置

發布于 2020-4-4|

復制鏈接

分享一篇關于關于mysql+spring+mybatis實現數據庫讀寫分離的代碼配置,小妖覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小妖來看看吧

場景:一個讀數據源一個讀寫數據源。原理:借助spring的【org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource】這個抽象類實現,看名字可以了解到是一個路由數據源的東西,這個類中有一個方法

```java

/**

* Determine the current lookup key. This will typically be

* implemented to check a thread-bound transaction context.

* Allows for arbitrary keys. The returned key needs

* to match the stored lookup key type, as resolved by the

* {@link #resolveSpecifiedLookupKey} method.

*/

protected abstract Object determineCurrentLookupKey();

```

每次去連數據庫的時候,spring會調用這個方法去找對應的數據源。返回值即對應的數據源的LookUpKey.那么這個LookUpKey在哪定義的呢?看下面的dataBase.xml的配置

```xml

user=${jdbc.username},password=${jdbc.password}

user=${jdbc.r.username},password=${jdbc.r.password}

```

動態數據源dynamicDataSource中的dataSourceKeyRW、dataSourceKeyR就是

```java

protected abstract Object determineCurrentLookupKey();

```

這個方法要返回的值。那么如何設置,讓這個方法的返回值是根據我們的需要返回dataSourceKeyRW、dataSourceKeyR呢?由于這個方法沒有入參,并且是spring自動調用的,因此考慮使用靜態變量存儲dataSource的key,在調用sql語句前設置靜態變量的值,然后在這個方法中得到靜態變量的值,返回。又考慮到多線程,同時可能會有很多請求,為避免線程之間相互干擾,考慮使用threadLocal。先看存儲dataSourceKey的容器類。

```java

public class DBContextHolder {

/**

* 線程threadlocal

*/

private static ThreadLocal contextHolder = new ThreadLocal();

private String DB_TYPE_RW = "dataSourceKeyRW";

private String DB_TYPE_R = "dataSourceKeyR";

public String getDbType() {

String db = contextHolder.get();

if (db == null) {

db = DB_TYPE_RW;// 默認是讀寫庫

}

return db;

}

/**

* 設置本線程的dbtype

* @param str

* @see [相關類/方法](可選)

* @since [產品/模塊版本](可選)

*/

public void setDbType(String str) {

contextHolder.set(str);

}

/**

* clearDBType

* @Title: clearDBType

* @Description: 清理連接類型

*/

public static void clearDBType() {

contextHolder.remove();

}

}

```

動態數據源的實現類。

```java

public class DynamicDataSource extends AbstractRoutingDataSource {

/*

* (non-Javadoc)

* @see javax.sql.CommonDataSource#getParentLogger()

*/

@Override

public Logger getParentLogger() throws SQLFeatureNotSupportedException {

// TODO Auto-generated method stub

return null;

}

/**

* override determineCurrentLookupKey

*

* Title: determineCurrentLookupKey

*

*

* Description: 自動查找datasource

*

* @return

*/

@Override

protected Object determineCurrentLookupKey() {

return DBContextHolder.getDbType();

}

}

```

在DAO層中設置數據庫類型。

```java

/**

* 添加郵件

* @param sms

* @return

*/

public boolean insertEmail(Email email) {

//根據具體需要設置不同的數據庫

DBContextHolder.setDbType(DBContextHolder.DB_TYPE_RW);

//DBContextHolder.setDbType(DBContextHolder.DB_TYPE_R);

int result = this.getSqlSession().insert(STATEMENT + ".addEntity",

email);

return result == 1;

}

```

總結

以上是生活随笔為你收集整理的java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置的全部內容,希望文章能夠幫你解決所遇到的問題。

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