欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Sharding-JDBC自動實現(xiàn)MySQL讀寫分離的示例代碼

 更新時間:2021年11月12日 11:31:37   作者:Java后端何哥  
本文主要介紹了Sharding-JDBC自動實現(xiàn)MySQL讀寫分離,優(yōu)點在于數(shù)據(jù)源完全有Sharding-JDBC托管,寫操作自動執(zhí)行master庫,讀操作自動執(zhí)行slave庫,感興趣的可以了解一下

前言:上一篇博客我用AOP+AbstractRoutingDataSource實現(xiàn)了MySQL讀寫分離,自己寫代碼實現(xiàn)判斷該使用哪個數(shù)據(jù)源挺麻煩的。Sharding-JDBC 是 Apache 旗下的 ShardingSphere 中的一款輕量級產(chǎn)品,引入 jar 即可完成讀寫分離的需求,可以理解為增強版的 JDBC,現(xiàn)在被使用的較多。使用Sharding-JDBC配置MySQL讀寫分離,優(yōu)點在于數(shù)據(jù)源完全有Sharding-JDBC托管,寫操作自動執(zhí)行master庫,讀操作自動執(zhí)行slave庫。不需要程序員在程序中關(guān)注這個實現(xiàn),比你自己去配多數(shù)據(jù)源簡單多了。

一、ShardingSphere和Sharding-JDBC概述

1.1、ShardingSphere簡介

在介紹Sharding-JDBC之前,有必要先介紹下Sharding-JDBC的大家族ShardingSphere。在介紹ShardingSphere之后,相信大家會對ShardingSphere的整體架構(gòu)以及Sharding-JDBC扮演的角色會有更深的了解。

ShardingSphere是后來規(guī)劃的,最開始是只有 Sharding-JDBC 一款產(chǎn)品,基于客戶端形式的分庫分表。后面發(fā)展變成了現(xiàn)在的Apache ShardingSphere(Incubator) ,它是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(規(guī)劃中)這3款相互獨立,卻又能夠混合部署配合使用的產(chǎn)品組成。它們均提供標準化的數(shù)據(jù)分片、分布式事務(wù)和數(shù)據(jù)庫治理功能,可適用于如Java同構(gòu)、異構(gòu)語言、容器、云原生等各種多樣化的應(yīng)用場景。

ShardingSphere定位為關(guān)系型數(shù)據(jù)庫中間件,旨在充分合理地在分布式的場景下利用關(guān)系型數(shù)據(jù)庫的計算和存儲能力,而并非實現(xiàn)一個全新的關(guān)系型數(shù)據(jù)庫。 它與NoSQL和NewSQL是并存而非互斥的關(guān)系。NoSQL和NewSQL作為新技術(shù)探索的前沿,放眼未來,擁抱變化,是非常值得推薦的。反之,也可以用另一種思路看待問題,放眼未來,關(guān)注不變的東西,進而抓住事物本質(zhì)。 關(guān)系型數(shù)據(jù)庫當今依然占有巨大市場,是各個公司核心業(yè)務(wù)的基石,未來也難于撼動,我們目前階段更加關(guān)注在原有基礎(chǔ)上的增量,而非顛覆。

 1.2、Sharding-JDBC簡介

定位為輕量級Java框架,在Java的JDBC層提供的額外服務(wù)。 它使用客戶端直連數(shù)據(jù)庫,以jar包形式提供服務(wù),無需額外部署和依賴,可理解為增強版的JDBC驅(qū)動,完全兼容JDBC和各種ORM框架。

  • 適用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 基于任何第三方的數(shù)據(jù)庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意實現(xiàn)JDBC規(guī)范的數(shù)據(jù)庫。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

1.3、Sharding-JDBC作用

1.4、ShardingSphere規(guī)劃線路圖

1.5、ShardingSphere三種產(chǎn)品的區(qū)別

二、數(shù)據(jù)庫中間件

透明化讀寫分離所帶來的影響,讓使用方盡量像使用一個數(shù)據(jù)庫一樣使用主從數(shù)據(jù)庫,是讀寫分離數(shù)據(jù)庫中間件的主要功能。

2.1、數(shù)據(jù)庫中間件簡介

數(shù)據(jù)庫中間件可以簡化對讀寫分離以及分庫分表的操作,并隱藏底層實現(xiàn)細節(jié),可以像操作單庫單表那樣操作多庫多表,主流的設(shè)計方案主要有兩種:

  • 服務(wù)端代理:需要獨立部署一個代理服務(wù),該代理服務(wù)后面管理多個數(shù)據(jù)庫實例,在應(yīng)用中通過一個數(shù)據(jù)源與該代理服務(wù)器建立連接,由該代理去操作底層數(shù)據(jù)庫,并返回相應(yīng)結(jié)果。優(yōu)點是支持多語言,對業(yè)務(wù)透明,缺點是實現(xiàn)復(fù)雜,實現(xiàn)難度大,同時代理需要確保自身高可用
  • 客戶端代理:在連接池或數(shù)據(jù)庫驅(qū)動上進行一層封裝,內(nèi)部與不同的數(shù)據(jù)庫建立連接,并對SQL進行必要的操作,比如讀寫分離選擇走主庫還是從庫,分庫分表select后如何聚合結(jié)果。優(yōu)點是實現(xiàn)簡單,天然去中心化,缺點是支持語言較少,版本升級困難

一些常見的數(shù)據(jù)庫中間件如下:

  • Cobar:阿里開源的關(guān)系型數(shù)據(jù)庫分布式服務(wù)中間件,已停更
  • DRDS:脫胎于Cobar,全稱分布式關(guān)系型數(shù)據(jù)庫服務(wù)
  • MyCat:開源數(shù)據(jù)庫中間件,目前更新了MyCat2版本
  • AtlasQihoo 360公司Web平臺部基礎(chǔ)架構(gòu)團隊開發(fā)維護的一個基于MySQL協(xié)議的數(shù)據(jù)中間層項目,同時還有一個NoSQL的版本,叫Pika
  • tddl:阿里巴巴自主研發(fā)的分布式數(shù)據(jù)庫服務(wù)
  • Sharding-JDBCShardingShpere的一個子產(chǎn)品,一個輕量級Java框架

2.2、Sharding-JDBC和MyCat區(qū)別

1)mycat是一個中間件的第三方應(yīng)用,sharding-jdbc是一個jar包

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

Mycat(proxy中間件層):

Sharding-jdbc(TDDL為代表的應(yīng)用層):

可以看出sharding-jdbc作為一個組件集成在應(yīng)用內(nèi),而mycat則作為一個獨立的應(yīng)用需要單獨部署。從架構(gòu)上看sharding-jdbc更符合分布式架構(gòu)的設(shè)計,直連數(shù)據(jù)庫,沒有中間應(yīng)用,理論性能是最高的(實際性能需要結(jié)合具體的代碼實現(xiàn),理論性能可以理解為上限,通過不斷優(yōu)化代碼實現(xiàn),逐漸接近理論性能)。同時缺點也很明顯,由于作為組件存在,需要集成在應(yīng)用內(nèi),意味著作為使用方,必須要集成到代碼里,使得開發(fā)成本相對較高;另一方面,由于需要集成在應(yīng)用內(nèi),使得需要針對不同語言(java、C、PHP……)有不同的實現(xiàn)(事實上sharding-jdbc目前只支持Java),這樣組件本身的維護成本也會很高。最終將應(yīng)用場景限定在由Java開發(fā)的應(yīng)用這一種場景下。

Sharding-JDBC較于MyCat,我認為最大的優(yōu)勢是:sharding-jdbc是輕量級的第三方工具,直連數(shù)據(jù)庫,沒有中間應(yīng)用,我們只需要在項目中引用指定的jar包即可,然后根據(jù)項目的業(yè)務(wù)需要配置分庫分表或者讀寫分離的規(guī)則和方式。

三、Sharding-JDBC+MyBatisPlus實現(xiàn)讀寫分離

3.0、項目代碼結(jié)構(gòu)和建表SQL語句

(1) 項目代碼結(jié)構(gòu)

(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實現(xiàn)讀寫分離-->
        <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開發(fā),包括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中,對數(shù)據(jù)源的選擇也緊跟潮流,默認采用了目前性能最佳的HikariCP

spring:
  shardingsphere:
    datasource:
      names: master,slave                                   # 數(shù)據(jù)源名字
      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                        #最大連接數(shù)量
          minimum-idle: 10                             #最小空閑連接數(shù)
          max-lifetime: 0                          #最大生命周期,0不過期。不等于0且小于30秒,會被重置為默認值30分鐘.設(shè)置應(yīng)該比mysql設(shè)置的超時時間短
          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                                              # 最終的數(shù)據(jù)源名稱
      master-data-source-name: master                       # 主庫數(shù)據(jù)源名稱
      slave-data-source-names: slave                        # 從庫數(shù)據(jù)源名稱列表,多個逗號分隔
    props:
      sql:
        show: true                                          # 在執(zhí)行SQL時,會打印SQL,并顯示執(zhí)行庫的名稱,默認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
//定義表名:當數(shù)據(jù)庫名與實體類名不一致或不符合駝峰命名時,需要在此注解指定表名
@TableName(value = "user")
public class UserEntity {
 
    //指定主鍵自增策略:value與數(shù)據(jù)庫主鍵列名一致,若實體類屬性名與表主鍵列名一致可省略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接口,該接口源碼定義了一些通用的操作數(shù)據(jù)庫方法,  單表大部分 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;
 
@Service
public class UserService {
 
    @Autowired
    UserMapper userMapper;
 
    public List<UserEntity> findAll()
    {
        //selectList() 方法的參數(shù)為 mybatis-plus 內(nèi)置的條件封裝器 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;
 
@RestController
public 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 ,執(zhí)行查詢語句,可以看到讀操作在Slave從庫進行:

http://localhost:8090/insertUser,執(zhí)行插入語句,可以看到寫操作在Master主庫進行:

這樣讀寫分離就算是可以了。

四、HikariCP連接池使用遇到的兩個Bug

4.1、SpringBoot2關(guān)于HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImp 

上面在使用springboot2.x 時遇到了一個很奇怪的問題,在程序運行起來之后,長時間的不進行數(shù)據(jù)庫操作就會出現(xiàn)這樣的錯誤,后面跟著這樣的敘述, Connection is not available, request timed out after XXXms. Possibly consider using a shorter maxLifetime value.

為什么會存在不可用的連接呢?maxLifetime可以控制連接的生命周期,我們來以前看看maxLifetime參數(shù)。

在這里插入圖片描述

我引一下chrome上面的中文翻譯:

此屬性控制數(shù)據(jù)庫連接池中連接的最大生存期。使用中的連接永遠不會停止,只有關(guān)閉連接后,連接才會被移除。在逐個連接的基礎(chǔ)上,應(yīng)用較小的負衰減以避免池中的質(zhì)量消滅。 我們強烈建議設(shè)置此值,它應(yīng)該比任何數(shù)據(jù)庫或基礎(chǔ)結(jié)構(gòu)施加的連接時間限制短幾秒鐘。 值0表示沒有最大壽命(無限壽命),當然要遵守該idleTimeout設(shè)置。 默認值:1800000(30分鐘)

分析是HikariCP連接池對連接管理的問題,因此想方設(shè)法進行SpringBoot2.0 HikariCP連接池配置

     hikari:
          maximum-pool-size: 20                        #最大連接數(shù)量
          minimum-idle: 10                             #最小空閑連接數(shù)
          max-lifetime: 0                          #最大生命周期,0不過期。不等于0且小于30秒,會被重置為默認值30分鐘.設(shè)置應(yīng)該比mysql設(shè)置的超時時間短
          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: 最大連接數(shù),小于等于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分鐘.設(shè)置應(yīng)該比mysql設(shè)置的超時時間短
  • spring.datasource.hikari.connection-timeout: 連接超時時間:毫秒,小于250毫秒,否則被重置為默認值30秒

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

分析:WARN警告級別,看起來不是什么錯誤,但是連接數(shù)據(jù)庫就是連不上

英譯漢:數(shù)據(jù)源-檢測到線程饑餓或時鐘跳動

人話:要么是檢測到等待連接的時間過長,造成進饑餓;要么是檢測到時鐘跳動,反正最后是關(guān)閉了數(shù)據(jù)庫連接。

其實,這里根本就沒有報錯,只是一個警告。是上游代碼出了問題,長時間不調(diào)用Service層進行存儲,然后Hikari數(shù)據(jù)源就關(guān)掉了自己;當有新的調(diào)用時,會啟用新的數(shù)據(jù)源。

修改默認的連接池配置如下:

datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://${ip}:3306/${數(shù)據(jù)庫}?useSSL=false&characterEncoding=UTF-8
    username: ${username}
    password: ${password}
    hikari:
      auto-commit: true
      #空閑連接超時時長
      idle-timeout: 60000
      #連接超時時長
      connection-timeout: 60000
      #最大生命周期,0不過期
      max-lifetime: 0
      #最小空閑連接數(shù)
      minimum-idle: 10
      #最大連接數(shù)量
      maximum-pool-size: 20

五、讀寫分離架構(gòu),經(jīng)常出現(xiàn)的讀延遲的問題如何解決? 

剛插入一條數(shù)據(jù),然后馬上就要去讀取,這個時候有可能會讀取不到?歸根到底是因為主節(jié)點寫入完之后數(shù)據(jù)是要復(fù)制給從節(jié)點的,讀不到的原因是復(fù)制的時間比較長,也就是說數(shù)據(jù)還沒復(fù)制到從節(jié)點,你就已經(jīng)去從節(jié)點讀取了,肯定讀不到。mysql5.7 的主從復(fù)制是多線程了,意味著速度會變快,但是不一定能保證百分百馬上讀取到,這個問題我們可以有兩種方式解決:

(1)業(yè)務(wù)層面妥協(xié),是否操作完之后馬上要進行讀取

(2)對于操作完馬上要讀出來的,且業(yè)務(wù)上不能妥協(xié)的,我們可以對于這類的讀取直接走主庫

  當然Sharding-JDBC也是考慮到這個問題的存在,所以給我們提供了一個功能,可以讓用戶在使    用的時候指定要不要走主庫進行讀取。在讀取前使用下面的方式進行設(shè)置就可以了: 

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

參考鏈接:

Spring Boot demo系列(十二):ShardingSphere + MyBatisPlus讀寫分離 + 主從復(fù)制 

Sharding-JDBC 簡介

mycat和sharding-jdbc哪個比較好?各有什么優(yōu)缺點?

Spring Boot 2.x基礎(chǔ)教程:默認數(shù)據(jù)源Hikari的配置詳解

解決springboot2.x遇到的一段時間內(nèi)不使用,redis連接和HikariPool連接池超時的問題

Thread starvation or clock leap detected (housekeeper delta=4m32s295ms949µs223ns).

到此這篇關(guān)于Sharding-JDBC自動實現(xiàn)MySQL讀寫分離的文章就介紹到這了,更多相關(guān)Sharding-JDBC MySQL讀寫分離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中將String類型依照某個字符分割成數(shù)組的方法

    Java中將String類型依照某個字符分割成數(shù)組的方法

    下面小編就為大家分享一篇Java中將String類型依照某個字符分割成數(shù)組的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • 最好的Java 反編譯工具的使用對比分析

    最好的Java 反編譯工具的使用對比分析

    恰好最近工作中也需要用到 Java 反編譯,所以這篇文章介紹目前常見的的幾種 Java 反編譯工具的使用,在文章的最后也會通過編譯速度、語法支持以及代碼可讀性三個維度,對它們進行測試,分析幾款工具的優(yōu)缺點,感興趣的朋友一起看看吧
    2021-05-05
  • Java隱藏特性之雙括號初始化詳解

    Java隱藏特性之雙括號初始化詳解

    Java?語言擁有許多隱藏而強大的特性,其中之一是雙括號初始化,這篇文章將詳細介紹雙括號初始化的概念、用法和示例代碼,希望對大家有所幫助
    2023-12-12
  • Java中內(nèi)部類使用方法實戰(zhàn)案例分析

    Java中內(nèi)部類使用方法實戰(zhàn)案例分析

    這篇文章主要介紹了Java中內(nèi)部類使用方法,結(jié)合具體案例形式分析了Java內(nèi)部類原理、調(diào)用方法及相關(guān)使用注意事項,需要的朋友可以參考下
    2019-09-09
  • Java實現(xiàn)FTP批量大文件上傳下載篇2

    Java實現(xiàn)FTP批量大文件上傳下載篇2

    這篇文章主要為大家詳細介紹了Java實現(xiàn)FTP批量大文件上傳下載的強化篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • SpringBoot中JPA更新時部分字段無效

    SpringBoot中JPA更新時部分字段無效

    本文主要介紹了SpringBoot中JPA更新時部分字段無效,在通過注解自動更新時,部分字段在調(diào)試時可以找到,卻沒有被自動更新到數(shù)據(jù)庫中,下面就介紹一下解決方法
    2023-04-04
  • 貨拉拉大數(shù)據(jù)對BitMap的探索實踐詳解

    貨拉拉大數(shù)據(jù)對BitMap的探索實踐詳解

    這篇文章主要為大家介紹了貨拉拉大數(shù)據(jù)對BitMap的探索實踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • SpringBoot實現(xiàn)讀取YML,yaml,properties文件

    SpringBoot實現(xiàn)讀取YML,yaml,properties文件

    yml,yaml,properties三種文件都是用來存放配置的文件,一些靜態(tài)數(shù)據(jù),配置的數(shù)據(jù)都會存放到里邊。本文主要為大家整理了SpringBoot實現(xiàn)讀取YML,yaml,properties文件的方法,需要的可以參考一下
    2023-04-04
  • Java由淺入深全面講解方法的使用

    Java由淺入深全面講解方法的使用

    方法,也稱函數(shù),如果想要重復(fù)一段或者多段代碼塊的使用,可以將這些代碼封裝成一個方法,方法具體表現(xiàn)為某種行為,使用方法可以提高代碼的復(fù)用性
    2022-04-04
  • Java編程之內(nèi)置觀察者模式實例詳解

    Java編程之內(nèi)置觀察者模式實例詳解

    這篇文章主要介紹了Java編程之內(nèi)置觀察者模式,結(jié)合實例形式較為詳細的分析了java內(nèi)置觀察者模式的原理、實現(xiàn)方法及相關(guān)注意事項,需要的朋友可以參考下
    2017-08-08

最新評論