数据库读写分离的坑,你已经在坑了

本文探讨了在实现数据库读写分离时遇到的问题及解决方案。在执行过程中,由于注解使用不当,导致读写操作错误地指向了默认数据源。通过分析,提出在涉及多次查询的方法上添加事务注解以确保正确数据源的选择。同时,文章提醒读者不仅要关注问题表面,还要深入理解内部运行机制,避免遗留问题。
摘要由CSDN通过智能技术生成

目录

  • 背景
  • 知识储备
  • 问题现象
  • 解决方案
  • 问题总结

背景

Springboot集成mybatis使用HikariCP连接MySQL,进行读写分离。

知识储备

在上篇文章中,我们实现了数据源的读写分离,也实现了我们想要的效果. 但是存在一个小小的瑕疵。接下来,我需要介绍一下稍微深入的知识。

在我们配置动态数据源的时候,继承了一个类 AbstractRoutingDataSource,我们先看一下这个类有什么作用。

package com.fxb.doraemon.human;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.datasource.AbstractDataSource;
import org.springframework.jdbc.datasource.lookup.DataSourceLookup;
import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;


/**
 * DataSource的实现:根据一个指定的key,调用各种的目标的数据源。 之后,通常根据一些线程的事务上下文来指定数据源。
 */
public abstract class AbstractRoutingDataSourceTest extends AbstractDataSource implements InitializingBean {

    /**
     * 目标数据源
     */
    @Nullable
    private Map<Object, Object> targetDataSources;

    /**
     * 默认的数据源
     */
    @Nullable
    private Object defaultTargetDataSource;

    /**
     * ??
     */
    private boolean lenientFallback = true;

    /**
     * 数据源查找??
     */
    private DataSourceLookup dataSourceLookup = new JndiDataSourceLookup();

    @Nullable
    private Map<Object, DataSource> resolvedDataSources;

    /**
     * 被处理之后的数据源??
     */
    @Nullable
    private DataSource resolvedDefaultDataSource;


    /**
     * 根据指定查找的key获取目标数据源的映射,
     * 映射的值可以是一个DataSource的实例,也可以是String。如果是String的话,会通过setDataSourceLookup方法进行解析。
     * 指定的key可以是任意类型,这个类仅仅实现了通用的查找过程,具体的key标识将由resolveSpecifiedLookupKey(Object)方法和
     * determineCurrentLookupKey()进行解析。
     * 也就是说:
     * #1.如果我们自己定义了Map中的value是字符串的话,就需要重写setDataSourceLookup这个方法进行返回正确的数据源。
     * #2.如果我们自己定义了Map中的key的话,我们就需要重写resolveSpecifiedLookupKey方法和determineCurrentLookupKey()。
     */
    public void set
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值