iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写
  • 310
分享到

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

2023-06-25 15:06:37 310人浏览 薄情痞子
摘要

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、ShardingSphere和Shard

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

一、ShardingSphere和Sharding-JDBC概述

1.1、ShardingSphere简介

在介绍Sharding-JDBC之前,有必要先介绍下Sharding-JDBC的大家族ShardingSphere。在介绍ShardingSphere之后,相信大家会对ShardingSphere的整体架构以及Sharding-JDBC扮演的角色会有更深的了解。

ShardingSphere是后来规划的,最开始是只有 Sharding-JDBC 一款产品,基于客户端形式的分库分表。后面发展变成了现在的Apache ShardingSphere(Incubator) ,它是一套开源分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务数据库治理功能,可适用于如Java同构、异构语言、容器云原生等各种多样化的应用场景。

ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 它与NoSQL和Newsql是并存而非互斥的关系。NoSQL和NewSQL作为新技术探索的前沿,放眼未来,拥抱变化,是非常值得推荐的。反之,也可以用另一种思路看待问题,放眼未来,关注不变的东西,进而抓住事物本质。 关系型数据库当今依然占有巨大市场,是各个公司核心业务的基石,未来也难于撼动,我们目前阶段更加关注在原有基础上的增量,而非颠覆。

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

 1.2、Sharding-JDBC简介

定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

  • 适用于任何基于Java的ORM框架,如:JPA, Hibernate, mybatis, spring JDBC Template或直接使用JDBC。

  • 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

  • 支持任意实现JDBC规范的数据库。目前支持Mysqloracle,SQLServer和postgresql

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

1.3、Sharding-JDBC作用

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

1.4、ShardingSphere规划线路图

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

1.5、ShardingSphere三种产品的区别

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

二、数据库中间件

透明化读写分离所带来的影响,让使用方尽量像使用一个数据库一样使用主从数据库,是读写分离数据库中间件的主要功能。

2.1、数据库中间件简介

数据库中间件可以简化对读写分离以及分库分表的操作,并隐藏底层实现细节,可以像操作单库单表那样操作多库多表,主流的设计方案主要有两种:

  • 服务端代理:需要独立部署一个代理服务,该代理服务后面管理多个数据库实例,在应用中通过一个数据源与该代理服务器建立连接,由该代理去操作底层数据库,并返回相应结果。优点是支持多语言,对业务透明,缺点是实现复杂,实现难度大,同时代理需要确保自身高可用

  • 客户端代理:在连接池或数据库驱动上进行一层封装,内部与不同的数据库建立连接,并对SQL进行必要的操作,比如读写分离选择走主库还是从库,分库分表select后如何聚合结果。优点是实现简单,天然去中心化,缺点是支持语言较少,版本升级困难

一些常见的数据库中间件如下:

  • Cobar:阿里开源的关系型数据库分布式服务中间件,已停更

  • DRDS:脱胎于Cobar,全称分布式关系型数据库服务

  • MyCat:开源数据库中间件,目前更新了MyCat2版本

  • AtlasQihoo 360公司WEB平台部基础架构团队开发维护的一个基于mysql协议的数据中间层项目,同时还有一个NoSQL的版本,叫Pika

  • tddl:阿里巴巴自主研发的分布式数据库服务

  • Sharding-JDBCShardingShpere的一个子产品,一个轻量级Java框架

2.2、Sharding-JDBC和MyCat区别

1)mycat是一个中间件的第三方应用,sharding-jdbc是一个jar包

2)使用mycat时不需要改代码,而使用sharding-jdbc时需要修改代码

Mycat(proxy中间件层):

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

Sharding-jdbc(TDDL为代表的应用层):

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

可以看出sharding-jdbc作为一个组件集成在应用内,而mycat则作为一个独立的应用需要单独部署。从架构上看sharding-jdbc更符合分布式架构的设计,直连数据库,没有中间应用,理论性能是最高的(实际性能需要结合具体的代码实现,理论性能可以理解为上限,通过不断优化代码实现,逐渐接近理论性能)。同时缺点也很明显,由于作为组件存在,需要集成在应用内,意味着作为使用方,必须要集成到代码里,使得开发成本相对较高;另一方面,由于需要集成在应用内,使得需要针对不同语言(java、C、PHP……)有不同的实现(事实上sharding-jdbc目前只支持Java),这样组件本身的维护成本也会很高。最终将应用场景限定在由Java开发的应用这一种场景下。

Sharding-JDBC较于MyCat,我认为最大的优势是:sharding-jdbc是轻量级的第三方工具,直连数据库,没有中间应用,我们只需要在项目中引用指定的jar包即可,然后根据项目的业务需要配置分库分表或者读写分离的规则和方式。

三、Sharding-JDBC+MyBatisPlus实现读写分离

3.0、项目代码结构和建表SQL语句

(1) 项目代码结构

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

(2) 建表SQL语句

DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (  `user_id` int(11) NOT NULL AUTO_INCREMENT,  `account` varchar(45) NOT NULL,  `nickname` varchar(18) NOT NULL,  `passWord` varchar(45) NOT NULL,  `headimage_url` varchar(45) DEFAULT NULL,  `introduce` varchar(45) DEFAULT NULL,  PRIMARY KEY (`user_id`),  UNIQUE KEY `account_UNIQUE` (`account`),  UNIQUE KEY `nickname_UNIQUE` (`nickname`)) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8;

3.1、引入Maven依赖

<!--Sharding-JDBC实现读写分离-->        <dependency>            <groupId>org.apache.shardingsphere</groupId>            <artifactId>sharding-jdbc-core</artifactId>            <version>4.1.1</version>        </dependency>         <!-- mybatis-plus 依赖 -->        <dependency>            <groupId>com.baomidou</groupId>            <artifactId>mybatis-plus-boot-starter</artifactId>            <version>3.4.2</version>        </dependency>         <!-- mysql 依赖 -->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>        </dependency>                 <!--支持web开发,包括Tomcat和spring-webmvc-->        <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>         <!--LomBok使用@Data注解-->        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <version>1.18.4</version>            <scope>provided</scope>        </dependency>

3.2、yml文件配置

Spring Boot 2.x中,对数据源的选择也紧跟潮流,默认采用了目前性能最佳的HikariCP

spring:  shardingsphere:    datasource:      names: master,slave                                   # 数据源名字      master:        type: com.zaxxer.hikari.HikariDataSource        # 连接池        driver-class-name: com.mysql.cj.jdbc.Driver        jdbc-url: jdbc:mysql://xxxxxx:3306/test?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8 #主库地址        username: root        password: xxxxxx        hikari:          maximum-pool-size: 20                        #最大连接数量          minimum-idle: 10                             #最小空闲连接数          max-lifetime: 0                          #最大生命周期,0不过期。不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短          idle-timeout: 30000                          #空闲连接超时时长,默认值600000(10分钟)          connection-timeout: 60000                    #连接超时时长          data-source-properties:            prepStmtCacheSize: 250            prepStmtCacheSqlLimit: 2048            cachePrepStmts: true            useServerPrepStmts: true      slave:        type: com.zaxxer.hikari.HikariDataSource        # 连接池        driver-class-name: com.mysql.cj.jdbc.Driver        jdbc-url: jdbc:mysql://xxxxxx:3306/test?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8 #从库地址        username: root        password: xxxxxx        hikari:          maximum-pool-size: 20          minimum-idle: 10          max-lifetime: 0          idle-timeout: 30000          connection-timeout: 60000          data-source-properties:            prepStmtCacheSize: 250            prepStmtCacheSqlLimit: 2048            cachePrepStmts: true            useServerPrepStmts: true    masterslave:      load-balance-alGorithm-type: round_robin              # 负载均衡算法,用于配置从库负载均衡算法类型,可选值:ROUND_ROBIN(轮询),RANDOM(随机)      name: ms                                              # 最终的数据源名称      master-data-source-name: master                       # 主库数据源名称      slave-data-source-names: slave                        # 从库数据源名称列表,多个逗号分隔    props:      sql:        show: true                                          # 在执行SQL时,会打印SQL,并显示执行库的名称,默认false

3.3、UserEntity实体类

package com.hs.sharingjdbc.entity; import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data; @Data//定义表名:当数据库名与实体类名不一致或不符合驼峰命名时,需要在此注解指定表名@TableName(value = "user")public class UserEntity {     //指定主键自增策略:value与数据库主键列名一致,若实体类属性名与表主键列名一致可省略value    @TableId(type = IdType.AUTO)    private Integer user_id;    private String account;    private String nickname;    private String password;    private String headimage_url;    private String introduce;}

3.4、UserMapper接口

编写的接口需要继承 BaseMapper接口,该接口源码定义了一些通用的操作数据库方法,  单表大部分 CRUD 操作都能直接搞定,相比原生的MyBatis,效率提高了很多

package com.hs.sharingjdbc.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.hs.sharingjdbc.entity.UserEntity; public interface UserMapper extends BaseMapper<UserEntity> { //    int insert(T entity);////    int deleteById(Serializable id);////    int deleteByMap(@Param("cm") Map<String, Object> columnMap);////    int delete(@Param("ew") Wrapper<T> queryWrapper);////    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);////    int updateById(@Param("et") T entity);////    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);////    T selectById(Serializable id);////    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);////    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);////    T selectOne(@Param("ew") Wrapper<T> queryWrapper);////    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);////    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);////    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);////    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);////    <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);////    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper); }

主类添加@MapperScan("com.hs.sharingjdbc.mapper"),扫描所有Mapper接口

package com.hs.sharingjdbc; import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication()@MapperScan("com.hs.sharingjdbc.mapper")public class SharingJdbcApplication {     public static void main(String[] args) {        SpringApplication.run(SharingJdbcApplication.class, args);    }}

3.5、UserService类

package com.hs.sharingjdbc.service; import com.hs.sharingjdbc.entity.UserEntity;import com.hs.sharingjdbc.mapper.UserMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List; @Servicepublic class UserService {     @Autowired    UserMapper userMapper;     public List<UserEntity> findAll()    {        //selectList() 方法的参数为 mybatis-plus 内置的条件封装器 Wrapper,这里不填写表示无任何条件,全量查询        List<UserEntity> userEntities = userMapper.selectList(null);         return userEntities;    }     public int insertUser(UserEntity user)    {        int i = userMapper.insert(user);        return i;    }}

3.6、UserController类

package com.hs.sharingjdbc.controller; import com.hs.sharingjdbc.entity.UserEntity;import com.hs.sharingjdbc.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List; @RestControllerpublic class UserController{    @Autowired    UserService userService;     @RequestMapping("/listUser")    public List<UserEntity>  listUser()    {        List<UserEntity> users = userService.findAll();        return users;    }     @RequestMapping("/insertUser")    public void insertUser()    {       UserEntity userEntity = new UserEntity();       userEntity.setAccount("22222");       userEntity.setNickname("hshshs");       userEntity.setPassword("123");       userService.insertUser(userEntity);    }}

3.7、项目启动测试

Http://localhost:8080/listUser ,执行查询语句,可以看到读操作在Slave从库进行:

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

http://localhost:8090/insertUser,执行插入语句,可以看到写操作在Master主库进行:

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

这样读写分离就算是可以了。

四、HikariCP连接池使用遇到的两个Bug

4.1、SpringBoot2关于HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImp 

上面在使用springboot2.x 时遇到了一个很奇怪的问题,在程序运行起来之后,长时间的不进行数据库操作就会出现这样的错误,后面跟着这样的叙述, Connection is not available, request timed out after XXXms. Possibly consider using a shorter maxLifetime value.

为什么会存在不可用的连接呢?maxLifetime可以控制连接的生命周期,我们来以前看看maxLifetime参数。

Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

我引一下chrome上面的中文翻译

此属性控制数据库连接池中连接的最大生存期。使用中的连接永远不会停止,只有关闭连接后,连接才会被移除。在逐个连接的基础上,应用较小的负衰减以避免池中的质量消灭。 我们强烈建议设置此值,它应该比任何数据库或基础结构施加的连接时间限制短几秒钟。 值0表示没有最大寿命(无限寿命),当然要遵守该idleTimeout设置。 默认值:1800000(30分钟)

分析是HikariCP连接池对连接管理的问题,因此想方设法进行SpringBoot2.0 HikariCP连接池配置

 hikari:          maximum-pool-size: 20                        #最大连接数量          minimum-idle: 10                             #最小空闲连接数          max-lifetime: 0                          #最大生命周期,0不过期。不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短          idle-timeout: 30000                          #空闲连接超时时长,默认值600000(10分钟)          connection-timeout: 60000                    #连接超时时长          data-source-properties:            prepStmtCacheSize: 250            prepStmtCacheSqlLimit: 2048            cachePrepStmts: true            useServerPrepStmts: true
  • spring.datasource.hikari.minimum-idle: 最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size

  • spring.datasource.hikari.maximum-pool-size: 最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值

  • spring.datasource.hikari.idle-timeout: 空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。

  • spring.datasource.hikari.max-lifetime: 连接最大存活时间,不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短

  • spring.datasource.hikari.connection-timeout: 连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒

4.2、com.zaxxer.hikari.pool.HikariPool : datasource -Thread starvation or clock leap detected (housekeeper delta=4m32s295ms949&micro;s223ns).

分析:WARN警告级别,看起来不是什么错误,但是连接数据库就是连不上

英译汉:数据源-检测到线程饥饿或时钟跳动

人话:要么是检测到等待连接的时间过长,造成进饥饿;要么是检测到时钟跳动,反正最后是关闭了数据库连接。

其实,这里根本就没有报错,只是一个警告。是上游代码出了问题,长时间不调用Service层进行存储,然后Hikari数据源就关掉了自己;当有新的调用时,会启用新的数据源。

修改默认的连接池配置如下:

datasource:    type: com.zaxxer.hikari.HikariDataSource    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://${ip}:3306/${数据库}?useSSL=false&characterEncoding=UTF-8    username: ${username}    password: ${password}    hikari:      auto-commit: true      #空闲连接超时时长      idle-timeout: 60000      #连接超时时长      connection-timeout: 60000      #最大生命周期,0不过期      max-lifetime: 0      #最小空闲连接数      minimum-idle: 10      #最大连接数量      maximum-pool-size: 20

五、读写分离架构,经常出现的读延迟的问题如何解决? 

刚插入一条数据,然后马上就要去读取,这个时候有可能会读取不到?归根到底是因为主节点写入完之后数据是要复制给从节点的,读不到的原因是复制的时间比较长,也就是说数据还没复制到从节点,你就已经去从节点读取了,肯定读不到。mysql5.7 的主从复制是多线程了,意味着速度会变快,但是不一定能保证百分百马上读取到,这个问题我们可以有两种方式解决:

(1)业务层面妥协,是否操作完之后马上要进行读取

(2)对于操作完马上要读出来的,且业务上不能妥协的,我们可以对于这类的读取直接走主库

  当然Sharding-JDBC也是考虑到这个问题的存在,所以给我们提供了一个功能,可以让用户在使    用的时候指定要不要走主库进行读取。在读取前使用下面的方式进行设置就可以了: 

public List<UserInfo> findAllUser()     {        // 强制路由主库        HintManager.getInstance().setMasterRouteOnly();         return this.list();    }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写

本文链接: https://www.lsjlt.com/news/305483.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写
    Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、ShardingSphere和Shard...
    99+
    2023-06-25
  • Sharding-JDBC自动实现MySQL读写分离的示例代码
    目录一、ShardingSphere和Sharding-JDBC概述1.1、ShardingSphere简介 1.2、Sharding-JDBC简介1.3、Sharding...
    99+
    2024-04-02
  • SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例
    目录一、前言二、数据库表准备三、整合四、docker-compose部署mysql主从五、本文案例demo源码一、前言 本文将基于以下环境整合sharding-jdbc实现分库分表与...
    99+
    2024-04-02
  • SpringBoot中怎么利用Sharding-JDBC实现MySQL8读写分离
    这篇文章将为大家详细讲解有关SpringBoot中怎么利用Sharding-JDBC实现MySQL8读写分离,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一.前言这是一个基于SpringBo...
    99+
    2023-06-20
  • SpringBoot怎么整合sharding-jdbc实现分库分表与读写分离
    本篇内容主要讲解“SpringBoot怎么整合sharding-jdbc实现分库分表与读写分离”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么整合sharding-jdbc...
    99+
    2023-06-25
  • SpringBoot+MyBatis+AOP实现读写分离的示例代码
    目录一、 MySQL 读写分离1.1、如何实现 MySQL 的读写分离? 1.2、MySQL 主从复制原理?1.3、MySQL 主从同步延时问题(精华)二、SpringBo...
    99+
    2024-04-02
  • Java基于JNDI实现读写分离的示例代码
    目录一、JNDI数据源配置二、JNDI数据源使用三、web.xml配置四、spring-servlet.xml配置五、spring-db.xml配置六、log4j.propertie...
    99+
    2024-04-02
  • SpringBoot使用Sharding-JDBC实现数据分片和读写分离的方法
    目录一、Sharding-JDBC简介二、具体的实现方式 1、maven引用2、数据库准备3、Spring配置4、精准分片算法和范围分片算法的Java代码5、测试一、Sha...
    99+
    2024-04-02
  • 怎么实现mysql读写分离
    这篇文章主要介绍“怎么实现mysql读写分离”,在日常操作中,相信很多人在怎么实现mysql读写分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现mysql读写分离”...
    99+
    2024-04-02
  • 使用sharding-jdbc实现水平分表的示例代码
    目录在mysql中新建数据库sharding_db,新增两张结构一样的表student_1和student_2。添加依赖编写配置文件编写实体类编写mapper接口编写测试类执行测试在...
    99+
    2024-04-02
  • 浅析php+mysql怎么实现读写分离
    MySQL作为目前最流行的数据库之一,在应用中大量被使用。在高并发和数据量较大的情况下,由于MySQL的读写并发性能不足,为了提高MySQL的并发性能,读写分离成为了必要的方案。读写分离的原理是将读操作和写操作分别放在不同的MySQL实例上...
    99+
    2023-05-14
    读写分离 php mysql
  • 使用Django怎么实现MySQL读写分离
    本篇文章为大家展示了使用Django怎么实现MySQL读写分离,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。主从同步介绍和优点在多台数据服务器中,分为主服务器和从服...
    99+
    2024-04-02
  • 使用Mycat怎么实现MySQL读写分离
    今天就跟大家聊聊有关使用Mycat怎么实现MySQL读写分离,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。搭建环境操作系统:CentOS-6.5-x...
    99+
    2024-04-02
  • java读写ini配置文件的示例代码怎么编写
    本篇文章为大家展示了java读写ini配置文件的示例代码怎么编写,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面通过代码先看下java 读写 ini 配置文件,代码如下所示:package&nbs...
    99+
    2023-06-26
  • 使用sharding-jdbc实现水平分库+水平分表的示例代码
    前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数据存入到表1中,一部分数据存入到表2中,...
    99+
    2024-04-02
  • QT编写地图实现离线轮廓图的示例代码
    目录一、前言二、功能特点三、体验地址四、效果图五、相关代码 一、前言 离线轮廓图使用起来,就没有在线轮廓图方便了,在线的可以直接传入名称拿到,离线的只能自己绘制了,一般需要用区域轮廓...
    99+
    2024-04-02
  • SpringBoot项目中怎么实现MySQL读写分离
    这篇文章主要介绍了SpringBoot项目中怎么实现MySQL读写分离的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot项目中怎么实现MySQL读写分离文章都会有所收获,下面我们一起来看看吧。1...
    99+
    2023-07-02
  • springboot结合mysql主从来实现读写分离的方法示例
    1.实现的功能     基于springboot框架,application.yml配置多个数据源,使用AOP以及AbstractRootingDat...
    99+
    2024-04-02
  • php中怎么实现Mysql读写分离操作
    php中怎么实现Mysql读写分离操作,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。连接案例:<php require...
    99+
    2024-04-02
  • Java多线程之readwritelock读写分离的实现代码
    在多线程开发中,经常会出现一种情况,我们希望读写分离。就是对于读取这个动作来说,可以同时有多个线程同时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且同时,当有一个写线程在操作这个资源的时候,其他的读线程是不能来操作这...
    99+
    2023-05-31
    java 多线程 adw
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作