前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java Getter和Setter

Java Getter和Setter

原创
作者头像
用户3906512
修改于 2019-10-08 04:15:01
修改于 2019-10-08 04:15:01
7.1K00
代码可运行
举报
文章被收录于专栏:DevelopersDevelopers
运行总次数:0
代码可运行

Java Getter和Setter

Author:杭州电子科技大学 2016级管理学院 工商管理 唐涛 16011324@hdu.edu.cn

CreateTime:2019-10-5 15:49:43

UpdateTime: 2019-10-5 21:44:29

Copyright: 唐涛 2019 © HOME

Email:tangtao2099@outlook.com

Link: 知乎 GitHub Gitee

Getter和setter在Java中被广泛使用。这看似简单,但并非每个程序员都正确理解和实现这种方法。因此,在本文中,我想深入讨论Java中的getter和setter方法.

1.什么是GetterSetter

在Java中,getter和setter是两种常规方法,用于检索和更新变量的值。

以下代码是带有私有变量和几个getter / setter方法的简单类的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public class SimpleGetterAndSetter {
     private int number;
     public int getNumber() {
         return this.number;
     }
     public void setNumber(int num) {
         this.number = num;
     }
 }

该类声明一个私有变量number。由于number是私有的,因此此类外部的代码无法直接访问该变量,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 SimpleGetterAndSetter obj = new SimpleGetterAndSetter();
 obj.number = 10;    // compile error, since number is private
 int num = obj.number; // same as above

相反,外部代码必须调用getter getNumber()和setter, setNumber()以读取或更新变量,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 SimpleGetterAndSetter obj = new SimpleGetterAndSetter();
 obj.setNumber(10);  // OK
 int num = obj.getNumber();  // fine

因此,Setter是一种更新变量值的方法。Getter是一种读取变量值的方法。Gettersetter 在Java 中也称为访问器更改器

2.为什么我们需要GetterSetter

通过使用getter和setter,程序员可以控制如何以适当的方式访问和更新其重要变量,例如在指定范围内更改变量的值。考虑以下setter方法的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void setNumber(int num) {
     if (num < 10 || num > 100) {
         throw new IllegalArgumentException();
     }
     this.number = num;
 }

这样可以确保将数字的值始终设置在10到100之间。假定可以直接更新变量号,则调用者可以为其设置任意值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 obj.number = 3;

这就违反了该变量从10到100范围内的值的约束。当然,我们不希望这种情况发生。因此,将变量号隐藏为私有,然后使用设置器即可解决。

另一方面,getter方法是外界读取变量值的唯一方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public int getNumber() {
     return this.number;
 }

下图说明了这种情况:

setter和getter方法可保护变量的值免受外界(调用方代码)的意外更改。

当变量由private修饰符隐藏 并且只能通过getter和setter进行访问时,将被封装。封装是面向对象编程(OOP)的基本原理之一,因此实现getter和setter是在程序代码中强制执行封装的方法之一。

诸如Hibernate,Spring和 Struts之类的某些框架 可以检查信息或通过getter和setter注入其实用程序代码。因此,在将代码与此类框架集成时,必须提供getter和setter方法。

3. Getter和Setter的命名约定

setter和getter的命名方案应遵循 Java Bean命名约定,getXxx()setXxx(),其中 Xxx 变量的名称。例如,使用以下变量名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private String name;

合适的setter和getter将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public void setName(String name) { }public String getName() { }

如果变量的类型为boolean,则getter的名称可以为 isXXX()getXXX(),但首选使用前者命名。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private boolean single;public String isSingle() { }

下表显示了符合命名约定的getter和setter的一些示例:

变量声明

Getter method

Setter method

int quantity

int getQuantity()

void setQuantity(int qty)

string firstName

String getFirstName()

void setFirstName(String fname)

Date birthday

Date getBirthday()

void setBirthday(Date bornDate)

boolean rich

boolean isRich() boolean getRich()

void setRich(Boolean rich)

4. 使用Getter和Setter时的常见错误

错误#1:您同时拥有setter和getter,但在限制较少的范围内声明了变量。

分析以下代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public String firstName;
 public void setFirstName(String fname) {
     this.firstName = fname;
 }
 public String getFirstName() {
     return this.firstName;
 }

将该变量 firstName 声明为public,因此可以直接使用点(.)运算符对其进行访问,从而使setter和getter无效。这种情况的解决方法是使用更多受限制的访问修饰符,例如protected和private:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private String firstName;

错误2:直接在Setter中分配对象引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private int[] scores;
 public void setScores(int[] scr) {
     this.scores = scr;
 }

下面的代码演示了此问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 int[] myScores = {5, 5, 4, 3, 2, 4};
 setScores(myScores);
 displayScores();   
 myScores[1] = 1;
 displayScores();

整数数组 myScores初始化为6个值(第1行),并将该数组传递给 setScores() 方法(第2行)。该方法 displayScores() 只是从数组中打印出所有分数:

第3行将产生以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 5 5 4 3 2 4

这些都是myScores 数组的所有元素 。现在,在第4行中,我们可以 按如下所示修改数组中第二个元素 的值myScores

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 myScores[1] = 1;

由于第4行的赋值,第二个元素的值从5更改为1。为什么重要?因为这意味着可以在setter方法范围之外修改数据,这破坏了setter的封装目的。为什么会这样呢?让我们setScores() 再次看一下该 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void setScores(int[] scr) {
     this.scores = scr;
 }

成员变量分数直接分配给方法的参数变量 scr 。这意味着两个变量都引用内存中的同一对象 myScores 数组对象。因此,对scoresmyScores 变量所做的更改 实际上是在同一对象上进行的。

这种情况的一种解决方法是将元素从scr 数组复制 到 scores 数组中。setter的修改后的版本如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void setScores(int[] scr) {
     this.scores = new int[scr.length];
     System.arraycopy(scr, 0, this.scores, 0, scr.length);
 }

有什么不同?好吧,成员变量scores 不再引用变量 所引用的对象 scr 。而是将数组 scores 初始化为大小等于array大小的新数组 scr。然后,使用 方法将所有元素从数组复制 scr 到array 。scores``System.arraycopy()

再次运行以下示例,它将为我们提供以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
5  5  4  3  2  4
 5  5  4  3  2  4

现在,两次调用 displayScores() 产生相同的输出。这意味着该数组 scores 是独立的,并且与scr 传递给setter 的数组不同 ,因此我们具有以下分配:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 myScores[1] = 1;

这不会影响数组 scores

因此,经验法则是:如果将对象引用传递给setter方法,则不要将该引用直接复制到内部变量中。相反,您应该找到一些将传递的对象的值复制到内部对象的方法,例如,使用该System.arraycopy() 方法将元素从一个数组复制到另一个数组 。

错误3:直接在getter中返回对象引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private int[] scores;
 public int[] getScores() {
     return this.scores;
 }

然后看下面的代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 int[] myScores = {5, 5, 4, 3, 2, 4};
 setScores(myScores);
 displayScores();
 int[] copyScores = getScores();
 copyScores[1] = 1;
 displayScores();

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 5  5  4  3  2  4
 5  1  4  3  2  4

如您所见,该数组的第二个元素 scores 在setter的第5行中进行了修改。由于getter方法直接返回内部变量score的引用,因此外部代码可以获得该引用并更改内部对象。

这种情况的解决方法是,我们应该返回对象的副本,而不是直接在getter中返回引用。这样,外部代码只能获取副本,而不能获取内部对象。因此,我们对上述getter进行如下修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public int[] getScores() {
     int[] copy = new int[this.scores.length];
     System.arraycopy(this.scores, 0, copy, 0, copy.length);
     return copy;
 }

因此,经验法则是:不要在getter方法中返回原始对象的引用。相反,它应该返回原始对象的副本。

5.实现原始类型的获取器和设置器

随着原始类型(intfloatdoublebooleanchar...),你可以自由地直接在assign/返回值/getter,因为Java拷贝一个原始的另一个而不是复制对象引用的值。因此,可以轻松避免错误#2和#3

例如,以下代码是安全的,因为setter和getter涉及以下原始类型 float

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private float amount;
 public void setAmount(float amount) {
     this.amount = amount;
 }
 public float getAmount() {
     return this.amount;
 }

因此,对于原始类型,没有正确实现getter和setter的特殊技巧。

6.实现常见对象类型的Getter和setter

字符串对象的getter和setter:

String是一种对象类型,但是是不可变的,这意味着一旦创建了String对象,就无法更改其String文字。换句话说,对该String对象的每次更改都会导致新创建一个String对象。因此,像原始类型一样,您可以安全地为String变量实现getter和setter,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private String address;
 public void setAddress(String addr) {
     this.address = addr;
 }
 public String getAddress() {
     return this.address;
 }

日期对象的获取器和设置器:

java.util.Date 类实现 clone() 从方法 Object 类。该方法 clone() 返回对象的副本,因此我们可以将其用于getter和setter,如以下示例所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private Date birthDate;
 public void setBirthDate(Date date) {
     this.birthDate = (Date) date.clone();
 }
 public Date getBirthDate() {
     return (Date) this.birthDate.clone();
 }

该 clone() 方法返回一个 Object,因此我们必须将其Date 强制转换为 Date 类型。

7.实现集合类型的gettersetter

如错误2和错误3所述,使用这样的setter和getter方法是不好的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private List<String> listTitles;
 public void setListTitles(List<String> titles) {
     this.listTitles = titles;
 }
 public List<String> getListTitles() {
     return this.listTitles;
 }

分析一下程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import java.util.*;
 public class CollectionGetterSetter {
     private List<String> listTitles;
     public void setListTitles(List<String> titles) {
 this.listTitles = titles;
     }
     public List<String> getListTitles() {
         return this.listTitles;
     }
     public static void main(String[] args) {
         CollectionGetterSetter app = new CollectionGetterSetter();
         List<String> titles1 = new ArrayList();
         titles1.add("Name");
         titles1.add("Address");
         titles1.add("Email");
         titles1.add("Job");
         app.setListTitles(titles1);
         System.out.println("Titles 1: " + titles1);
         titles1.set(2, "Habilitation");
         List<String> titles2 = app.getListTitles();
         System.out.println("Titles 2: " + titles2);
         titles2.set(0, "Full name");
         List<String> titles3 = app.getListTitles();
         System.out.println("Titles 3: " + titles3);
     }
 }

根据实现getter和setter的规则,这三个 System.out.println() 语句应产生相同的结果。但是,运行上述程序时,它将产生以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Titles 1: [Name, Address, Email, Job]
 Titles 2: [Name, Address, Habilitation, Job]
 Titles 3: [Full name, Address, Habilitation, Job]

对于字符串集合,一种解决方案是使用将另一个集合作为参数的构造函数。例如,我们可以如下更改上述getter和setter的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public void setListTitles(List<String> titles) {
     this.listTitles = new ArrayList<String>(titles);
 }public List<String> getListTitles() {
     return new ArrayList<String>(this.listTitles);   
 }

重新编译并运行 CollectionGetterSetter 程序;它将产生所需的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Titles 1: [Name, Address, Email, Job]
 Titles 2: [Name, Address, Email, Job]
 Titles 3: [Name, Address, Email, Job]

注意

上面的构造方法仅适用于字符串的集合,但不适用于Collections 对象。考虑下面的Person 对象集合示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import java.util.*; 
 public class CollectionGetterSetterObject { 
     private List<Person> listPeople; 
     public void setListPeople(List<Person> list) { 
         this.listPeople = new ArrayList<Person>(list); 
     } 
     public List<Person> getListPeople() { 
         return new ArrayList<Person>(this.listPeople); 
     } 
     public static void main(String[] args) { 
         CollectionGetterSetterObject app = new CollectionGetterSetterObject(); 
         List<Person> list1 = new ArrayList<Person>(); 
         list1.add(new Person("Peter")); 
         list1.add(new Person("Alice")); 
         list1.add(new Person("Mary")); 
         app.setListPeople(list1); 
         System.out.println("List 1: " + list1); 
         list1.get(2).setName("Maryland"); 
         List<Person> list2 = app.getListPeople(); 
         System.out.println("List 2: " + list2); 
         list1.get(0).setName("Peter Crouch"); 
         List<Person> list3 = app.getListPeople(); 
         System.out.println("List 3: " + list3); 
     } 
 } 
 class Person { 
     private String name; 
     public Person(String name) { 
         this.name = name; 
     } 
     public String getName() { 
         return this.name; 
     } 
     public void setName(String name) { 
         this.name = name; 
     } 
     public String toString() { 
         return this.name; 
     } 
 }

运行时将产生以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 List 1: [Peter, Alice, Mary]
 List 2: [Peter, Alice, Maryland]
 List 3: [Peter Crouch, Alice, Maryland]

因为与String不同,每当复制String对象时都将为其创建新对象,所以其他 Object 类型则不会。仅引用被复制,因此这就是两个Collection不同但它们包含相同对象的原因。换句话说,这是因为我们没有提供任何复制对象的方法。

查看Collection API;我们发现 ArrayListHashMapHashSet,等实现自己的 clone() 方法。这些方法返回浅表副本,这些浅表副本不会将元素从源Collection复制到目标。根据 类clone() 方法 的Javadoc ArrayList

public Object clone()

公共对象clone()返回此ArrayList实例的浅表副本。(元素本身不会被复制)

因此,我们不能使用clone() 这些Collection类的 方法。

解决方案是clone() 为我们自己定义的对象(Person 上例中的类)实现该 方法 ,使用clone()Person 类中实现该方法, 如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public Object clone() {
     Person aClone = new Person(this.name);
     return aClone;
 }

listPeople 的Setter修改如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public void setListPeople(List<Person> list) {
     for (Person aPerson : list) {
         this.listPeople.add((Person) aPerson.clone());
     }
 }

相应的getter被修改,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public List<Person> getListPeople() {
     List<Person> listReturn = new ArrayList<Person>();
     for (Person aPerson : this.listPeople) {
         listReturn.add((Person) aPerson.clone());
     }
     return listReturn;
 }

结果是该类的新版本 CollectionGetterSetterObject, 如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import java.util.*;
 public class CollectionGetterSetterObject {
     private List<Person> listPeople = new ArrayList<Person>();
     public void setListPeople(List<Person> list) {
         for (Person aPerson : list) {
             this.listPeople.add((Person) aPerson.clone());
         }
     }
     public List<Person> getListPeople() {
         List<Person> listReturn = new ArrayList<Person>();
         for (Person aPerson : this.listPeople) {
             listReturn.add((Person) aPerson.clone());
         }
         return listReturn;
     }
     public static void main(String[] args) {
         CollectionGetterSetterObject app = new CollectionGetterSetterObject();
         List<Person> list1 = new ArrayList<Person>();
         list1.add(new Person("Peter"));
         list1.add(new Person("Alice"));
         list1.add(new Person("Mary"));
         app.setListPeople(list1);
         System.out.println("List 1: " + list1);
         list1.get(2).setName("Maryland");
         List<Person> list2 = app.getListPeople();
         System.out.println("List 2: " + list2);
         list1.get(0).setName("Peter Crouch");
         List<Person> list3 = app.getListPeople();
         System.out.println("List 3: " + list3);
     }
 }

编译并运行新版本的 CollectionGetterSetterObject;它将产生所需的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 List 1: [Peter, Alice, Mary] 
 List 2: [Peter, Alice, Mary] 
 List 3: [Peter, Alice, Mary]

因此,实现Collection类型的getter和setter的关键点是:

  • 对于String对象的Collection,由于String对象是不可变的,因此不需要任何特殊的调整。
  • 对于对象的自定义类型的集合:
    • 实现clone() 自定义类型的 方法。
    • 对于setter,将克隆的项目从源集合添加到目标集合。
    • 对于getter,创建一个新的Collection,并将其返回。将原始集合中的克隆项添加到新集合中。

8.为自己的类型实现getter和setter

如果定义对象的自定义类型,则应clone() 为自己的类型实现该 方法。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 class Person {
     private String name;
     public Person(String name) {
         this.name = name;
     }
     public String getName() {
         return this.name;
     }
     public void setName(String name) {
         this.name = name;
     }
     public String toString() {
         return this.name;
     }
     public Object clone() {
         Person aClone = new Person(this.name);
         return aClone;
     }
 }

如我们所见,该类 Person 实现其 clone() 方法以返回其自身的克隆版本。然后,setter方法应实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public void setFriend(Person person) {
     this.friend = (Person) person.clone();
 }

对于getter方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public Person getFriend() {
     return (Person) this.friend.clone();
 }

因此,为自定义对象类型实现getter和setter的规则是:

  • 实现clone() 自定义类型的 方法。
  • 从getter返回一个克隆的对象。
  • 在设置器中分配一个克隆的对象。

结论

Java 中的 gettersetter 看起来很简单,但是如果天真地实现,可能会变得很危险。它甚至可能是导致您的代码行为异常的问题的根源。或更糟糕的是,可以通过隐式操纵获取器和设置器的参数并从中获取对象来轻易地利用您的程序。因此,请小心并考虑实施上述最佳实践。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
使用Xenon实现MySQL高可用集群
1、Xenon 介绍2、架构环境说明3、MySQL 安装准备3.1、MySQL 主从复制搭建3.2、MySQL 半同步复制配置3.3、系统配置3.4、配置 hosts 解析3.5、各节点配置 ssh 互信3.5.1、150 配置3.5.1、151 配置3.5.1、152 配置4、xenon 配置准备4.1、配置 golang 环境4.2、安装xtrabackup4.3、安装 xenon4.4、配置xenon4.5、开启 xenon 并配置集群5、检验 xenon 环境5.1、检测 VIP 切换5.2、数据库重建5.2.1、模拟删除主库数据目录5.2.2、进行数据库重建
老叶茶馆
2020/06/24
2.6K2
使用Xenon实现MySQL高可用集群
MySQL分库分表中间件-RadonDB性能测试
了解一个产品,从性能测试下手是最好的方法,这里就是针对金融级MySQL解决方案RadonDB中的核心组件Radon进行一次性能测试。
田帅萌
2020/04/02
1.3K0
MySQL分库分表中间件-RadonDB性能测试
快速实现wordpress迁移到RadonDB上
最近发现RadonDB在特性中引入一个新特性:Single table 到分区表快速转换,另外还引进了一个优秀的特性,把现有的MySQL库直接attach到Radon下面。看到这两个特性真是太赞了。可以非常方便用户实现原来的单表,快速变成拆分表,一条命令搞定。具体的issue参考:https://github.com/radondb/radon/issues/436 而且这个特性会在1.0.8这个版本发布。下面我们一块来体验一下吧。该文档可以用于先看看整体思想上有一个认识后再行动。
田帅萌
2020/03/19
6630
MySQL数据备份与恢复(二) -- xtrabackup工具
上一篇介绍了逻辑备份工具mysqldump,本文将通过应用更为广泛的物理备份工具xtrabackup来演示数据备份及恢复的第二篇内容(本文篇幅较长,建议收藏后阅读)。
俊才
2020/04/07
1K0
Mysql5.7多实例配置
Mysql采用离线的二进制包安装方式,安装在/usr/local/mysql 两个实例配置 创建目录 > mkdir -p /usr/local/mysql/data/{3306,3307} 3306配置 > vim /etc/my3306.cnf [client] socket=/usr/local/mysql/data/3306/mysql.sock [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data/3306 socke
入门笔记
2022/06/02
8710
xtrabackup 备份+还原简记
1、安装 下载地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
星哥玩云
2022/08/18
9520
上课一不小心讲了年入百万起的项目MySQL10|#14
在乙方工作的学生,总会遇到特别稀奇古怪的问题。由于从事数据库培训及咨询服务,有时也给学生担任起二级技术支持的作用(response slow), 前几天一个学生又被甲方爸爸吊打,留堂不让回家,让出一个MySQL升级的安全patch~~~ 甲方爸爸数据库专家意见是MySQL不能升级,但可以通过打Patch来解决安全Bug。
wubx
2021/07/15
3420
上课一不小心讲了年入百万起的项目MySQL10|#14
用 Docker 搭建高可用 MySQL 集群玩玩儿!
4、创建五个数据卷(pxc无法直接存取宿组机的数据,所以创建五个docker数据卷)
dys
2021/09/09
1.7K0
RadonDB架构解析
RadonDB在DTCC大会主会场宣布开源了, 一个期待已久的产品终于走进了开源社区。 感谢青云领导层的对技术贡献的情怀。
田帅萌
2018/09/14
1.8K0
RadonDB架构解析
Xtrabackup搭建主从复制
mysqldump:逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能够接受的,如果数据库非常大,那再使用mysqldump备份就不太适合了。
AsiaYe
2019/11/06
1.7K0
Xtrabackup搭建主从复制
Mysql MHA 架构介绍及实践
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。
mikelLam
2022/10/31
1.4K0
Mysql MHA 架构介绍及实践
MySQL DBA如何利用strace/pstack/gdb来定位问题
strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用。 Strace是一个简单的跟踪系统调用执行的工具。在其最简单的形式中,它可以从开始到结束跟踪二进制的执行,并在进程的生命周期中输出一行具有系统调用名称,每个系统调用的参数和返回值的文本行。
老叶茶馆
2020/06/24
2.3K0
xtrabackup热备和恢复MySQL
热备份的方式也是直接复制数据物理文件,和冷备份一样,但是热备份可以不停机直接复制,一般用于7*24小时不间断的重要核心业务。MySQL的社区版本热备份工具InnoDB Hot Backup是付费的,只能试用30天,商业版才可以永久的使用,
星哥玩云
2022/08/16
1.3K0
高可用 | Xenon:后 MHA 时代的选择
在 MySQL(5.5 及以下)传统复制的时代,MHA(Master High Availability)在 MySQL 高可用应用中非常成熟。在 MySQL(5.6)及 GTID 时代开启以后,MHA 却没有与新的 MySQL 一起顺应时潮。
用户1278550
2021/06/16
1.2K0
高可用 | Xenon:后 MHA 时代的选择
Linux 环境搭建 MySQL8.0.28 主从同步环境
首先在介绍MySQL 主从时,我们来看看 DB-Engines 排行榜上四月数据库的变化,前三甲居然都有小幅度增长,相反增长迅猛的 PG 和 MongoDB 有所减少,一个月的增长趋势说明不了问题,下图是从 13 年开始的趋势图,Oracle 和 MySQL 渐渐趋平,学习了解 MySQL 还是很有必要的。下面开始进入正题。
JiekeXu之路
2022/05/17
1K0
Linux 环境搭建 MySQL8.0.28 主从同步环境
MySQL高可用之PXC
PXC简介 PXC(Percona XtraDB Cluster)是一个开源的MySQL高可用解决方案。他将Percona Server和XtraBackup与Galera库集成,以实现同步多主复制。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster,目前PXC架构在生产线上用的更多而且更成熟一些。PXC相比那些传统的基于主从模式的集群架构MHA和双主,Galera Cluster 最突出的特点就是解决了诟病已久的复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,它们互相的关系是对等的。本身Galera Cluster也是一种多主架构。PXC是在存储引擎层实现的同步复制,而非异步复制,所以其数据的一致性是相当高的。
小手冰凉
2020/07/06
2.7K0
MySQL高可用之MHA集群部署
很多小伙伴反映说网上的MHA教程甚至收费的课程里的MHA教程都存在坑,不少教程只是搭建完成了,是否真的能在主库宕机时自动切换不得而知,鉴于此情况,简单写了一个MHA集群的搭建步骤。由于搭建的次数较多,没踩到过多的坑(坏笑),所以没有写太多的排坑方法,如果小伙伴们在部署的过程中遇到问题可以和我沟通,文中如有问题欢迎斧正。
俊才
2020/05/26
1K0
MySQL高可用之MHA集群部署
MySQL8.1.0版本正式发布带来哪些新特性?
2023年7月18日晚,MySQL官方网站正式发布了MySQL8.1.0与8.0.34版本.
终有救赎
2023/12/14
5660
MySQL8.1.0版本正式发布带来哪些新特性?
使用Radon构建MySQL统一数据访问层
这篇也可以说是:RadonDB使用最佳建议,从原理上了解RadonDB的拆分后数据访问逻辑。Radon中整理架构如下:
田帅萌
2020/04/02
1.3K0
使用Radon构建MySQL统一数据访问层
「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)
为了让学习的知识融汇贯通,目前是把所有的集群都放在了一个虚拟机上,如果这个虚拟机宕机了怎么办?俗话说鸡蛋不要都放在一个篮子里面,把各种集群的节点拆分部署,应该把各种节点分机器部署,多个宿主机,这样部署随便挂哪个主机我们都不担心。 源码:https://github.com/limingios/netFuture/blob/master/docker-swarm/
IT架构圈
2019/03/04
6620
「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)
推荐阅读
相关推荐
使用Xenon实现MySQL高可用集群
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • Java Getter和Setter
  • 1.什么是Getter和Setter?
  • 2.为什么我们需要Getter和Setter?
  • 3. Getter和Setter的命名约定
  • 4. 使用Getter和Setter时的常见错误
    • 错误#1:您同时拥有setter和getter,但在限制较少的范围内声明了变量。
    • 错误2:直接在Setter中分配对象引用
    • 错误3:直接在getter中返回对象引用
  • 5.实现原始类型的获取器和设置器
  • 6.实现常见对象类型的Getter和setter
    • 字符串对象的getter和setter:
    • 日期对象的获取器和设置器:
  • 7.实现集合类型的getter和setter
  • 8.为自己的类型实现getter和setter
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档