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实现数据库读写分离的代码配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 已抵扣进项税开红字如何记账
- 下一篇: 信而富是什么 一家贷款金融公司