Maxwell读取MySQL数据

文章目录

    • Maxwell 概述
      • 1.1 Maxwell 定义
      • 1.2 Maxwell工作原理
        • 1.2.1 MySQL主从复制过程
        • 1.2.2 Maxwell的工作原理
        • 1.2.3 **MySQL** **的** binlog
      • 1.3 Maxwell和Canal的对比
    • Maxwell使用
      • 2.1 Maxwell安装
        • 2.1.1 安装地址
        • 2.1.2 安装部署
        • 2.1.3 MySQL环境准备
        • 2.1.4 初始化Maxwell元数据库
        • 2.1.5 Maxwell进程启动
          • 使用命令行参数启动 Maxwell 进程
          • 修改配置文件,定制化启动 Maxwell 进程
      • 2.2 Maxwell入门案例
        • 2.2.1 监控 **Mysql** 数据并在控制台打印
        • 2.2.2 监控 Mysql 数据输出到 kafka
          • 实现步骤
          • kafka 主题数据的分区控制
        • 2.2.3 监控 Mysql 指定表数据输出控制台
        • 2.2.4 监控 Mysql 指定表全量数据输出控制台,数据初始化

Maxwell 概述

1.1 Maxwell 定义

​ Maxwell 是由美国 Zendesk 开源,用 Java 编写的 MySQL 实时抓取软件。 实时读取

MySQL 二进制日志 Binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、

RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。

官网地址:http://maxwells-daemon.io/

1.2 Maxwell工作原理

1.2.1 MySQL主从复制过程

  • Master 主库将改变记录,写到二进制日志(binary log)中

  • Slave 从库向 mysql master 发送 dump 协议,将 master 主库的 binary log events 拷贝

到它的中继日志(relay log);

  • Slave 从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。

在这里插入图片描述

1.2.2 Maxwell的工作原理

​ Maxwell 的工作原理很简单,就是把自己伪装成 MySQL 的一个 slave,然后以 slave

的身份假装从 MySQL(master)复制数据。

1.2.3 MySQL binlog

  1. 什么是 binlog

    ​ MySQL 的二进制日志可以说 MySQL 最重要的日志了,它记录了所有的 DDL 和 DML(除

    了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进

    制日志是事务安全型的。

    一般来说开启二进制日志大概会有 1%的性能损耗。二进制有两个最重要的使用场景:

    • 其一:MySQL Replication 在 Master 端开启 binlog,Master 把它的二进制日志传递

    给 slaves 来达到 master-slave 数据一致的目的。

    • 其二:自然就是数据恢复了,通过使用 mysqlbinlog 工具来使恢复数据。

    二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有

    的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的 DDL 和 DML(除

    了数据查询语句)语句事件。

  2. binlog 的开启

    • 找到 MySQL 配置文件的位置

    • Linux: /etc/my.cnf

      如果/etc 目录下没有,可以通过 locate my.cnf 查找位置

    • Windows: \my.ini

      在 mysql 的配置文件下,修改配置

    在[mysqld] 区块,设置/添加 log-bin=mysql-bin

    这个表示 binlog 日志的前缀是 mysql-bin,以后生成的日志文件就是 mysql-bin.000001

    的文件后面的数字按顺序生成,每次 mysql 重启或者到达单个文件大小的阈值时,新生一个

    文件,按顺序编号。

  3. binlog 的分类设置

    mysql binlog 的格式有三种,分别是 STATEMENT,MIXED,ROW。

    在配置文件中可以选择配置 binlog_format= statement|mixed|row

    • 三种格式的区别:

      • statement

        语句级,binlog 会记录每次一执行写操作的语句。

        相对 row 模式节省空间,但是可能产生不一致性,比如

        update test set create_date=now();

        如果用 binlog 日志进行恢复,由于执行时间不同可能产生的数据就不同。

        优点: 节省空间

        缺点: 有可能造成数据不一致。

      • row

        行级, binlog 会记录每次操作后每行记录的变化。

        优点:保持数据的绝对一致性。因为不管 sql 是什么,引用了什么函数,他只记录

        执行后的效果。

        缺点:占用较大空间。

      • mixed

        混合级别,statement 的升级版,一定程度上解决了 statement 模式因为一些情况

        而造成的数据不一致问题。

        默认还是 statement,在某些情况下,譬如:

        当函数中包含 UUID() 时;

        包含 AUTO_INCREMENT 字段的表被更新时;

        执行 INSERT DELAYED 语句时;

        用 UDF 时;

        会按照 ROW 的方式进行处理

        优点:节省空间,同时兼顾了一定的一致性。

        缺点:还有些极个别情况依旧会造成不一致,另外 statement 和 mixed 对于需要对

        binlog 监控的情况都不方便。

      • 综合上面对比,Maxwell 想做监控分析,选择 row 格式比较合适

1.3 Maxwell和Canal的对比

对比CanalMaxwell
语言javaJava
数据格式格式自由json
数据采集模式增量增量/全量
数据落地定制支持Kafka等多种平台
HA支持支持

Maxwell使用

2.1 Maxwell安装

2.1.1 安装地址

Maxwell 官网地址:http://maxwells-daemon.io/

文档地址:https://maxwells-daemon.io/quickstart/

2.1.2 安装部署

  1. 这里我们选择1.29.2版本进行介绍,该版本使用jdk1.8版本,之后的都是11

  2. 上传 maxwell-1.29.2.tar.gz 到/opt/software 下

  3. 解压 maxwell-1.29.2.tar.gz 的安装包到/opt/module 下

    [atguigu@hadoop102 software]$ tar -zxvf maxwell-1.29.2.tar.gz -
    C /opt/module/
    

2.1.3 MySQL环境准备

  1. 修改 mysql 的配置文件,开启 MySQL Binlog 设置

    atguigu@hadoop102 software]$ sudo vim /etc/my.cnf
    在[mysqld]模块下添加一下内容
    [mysqld]
    server_id=1
    log-bin=mysql-bin
    binlog_format=row
    #设置多个数据库监控,不能使用逗号分隔,复制多行即可
    #binlog-do-db=test_maxwell并重启 Mysql 服务
    [atguigu@hadoop102 software]$ sudo systemctl restart mysqld
    登录 mysql 并查看是否修改完成
    [atguigu@hadoop102 ~]$ mysql -uroot -p123456
    mysql> show variables like '%binlog%';
    查看下列属性
    binlog_format | ROW
    
  2. 进入/var/lib/mysql 目录,查看 MySQL 生成的 binlog 文件

    [atguigu@hadoop102 ~]$ cd /var/lib/mysql
    [atguigu@hadoop102 mysql]$ sudo ls -l
    总用量 188500
    -rw-r-----. 1 mysql mysql 154 11 月 17 16:30 mysqlbin.000001
    -rw-r-----. 1 mysql mysql 19 11 月 17 16:30 mysqlbin.index
    

    注:MySQL 生成的 binlog 文件初始大小一定是 154 字节,然后前缀是 log-bin 参数配

    置的,后缀是默认从.000001,然后依次递增。除了 binlog 文件文件以外,MySQL 还会额外

    生产一个.index 索引文件用来记录当前使用的 binlog 文件。

2.1.4 初始化Maxwell元数据库

  1. 在 MySQL 中建立一个 maxwell 库用于存储 Maxwell 的元数据

    [atguigu@hadoop102 module]$ mysql -uroot -p123456
    mysql> CREATE DATABASE maxwell;
    
  2. 设置 mysql 用户密码安全级别

    mysql> set global validate_password_length=4;
    mysql> set global validate_password_policy=0;
    
  3. 分配一个账号可以操作该数据库

    mysql> GRANT ALL ON maxwell.* TO 'maxwell'@'%' IDENTIFIED BY '123456';
    
  4. 分配这个账号可以监控其他数据库的权限

    mysql> GRANT SELECT ,REPLICATION SLAVE , REPLICATION CLIENT ON 
    *.* TO maxwell@'%';
    
  5. 刷新 mysql 表权限

    mysql> flush privileges;
    

MySQL 8

#创建账户
create user 'root'@'172.16.10.203' identified by  'password'#赋予权限,with grant option这个选项表示该用户可以将自己拥有的权限授权给别人
grant all privileges on *.* to 'root'@'172.16.10.203' with grant option#改密码&授权超用户,flush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里
flush privileges;-------CREATE DATABASE maxwell;
create user 'maxwell'@'%' identified by  '123456'
grant all privileges on *.* to 'maxwell'@'%' with grant option
flush privileges;

2.1.5 Maxwell进程启动

Maxwell 进程启动方式有如下两种:

使用命令行参数启动 Maxwell 进程
[atguigu@hadoop102 maxwell-1.29.2]$ bin/maxwell --
user='maxwell' --password='123456' --host='hadoop102' --
producer=stdout

–user 连接 mysql 的用户

–password 连接 mysql 的用户的密码

–host mysql 安装的主机名/IP

–producer 生产者模式(stdout:控制台 kafka:kafka 集群)

修改配置文件,定制化启动 Maxwell 进程
[atguigu@hadoop102 maxwell-1.29.2]$ cp 
config.properties.example config.properties
[atguigu@hadoop102 maxwell-1.29.2]$ vim config.properties
[atguigu@hadoop102 maxwell-1.29.2]$ bin/maxwell --
config ./config.properties

2.2 Maxwell入门案例

2.2.1 监控 Mysql 数据并在控制台打印

  1. 运行 maxwell 来监控 mysql 数据更新

    [atguigu@hadoop102 maxwell-1.29.2]$ bin/maxwell --
    user='maxwell' --password='123456' --host='hadoop102' --
    producer=stdout
    
  2. 向 mysql 的 test_maxwell 库的 test 表插入一条数据,查看 maxwell 的控制台输出

    mysql> insert into test values(1,'aaa');
    {"database": "test_maxwell", --库名"table": "test", --表名"type": "insert", --数据更新类型"ts": 1637244821, --操作时间"xid": 8714, --操作 id"commit": true, --提交成功"data": { --数据"id": 1,"name": "aaa"} 
    }
    
  3. 向 mysql 的 test_maxwell 库的 test 表同时插入 3 条数据,控制台出现了 3 条 json

    日志,说明 maxwell 是以数据行为单位进行日志的采集的。

    mysql> INSERT INTO test VALUES(2,'bbb'),(3,'ccc'),(4,'ddd');
    {"database":"test_maxwell","table":"test","type":"insert","ts"
    :1637245127,"xid":9129,"xoffset":0,"data":{"id":2,"name":"bbb"
    }}
    {"database":"test_maxwell","table":"test","type":"insert","ts"
    :1637245127,"xid":9129,"xoffset":1,"data":{"id":3,"name":"ccc"
    }}
    {"database":"test_maxwell","table":"test","type":"insert","ts"
    :1637245127,"xid":9129,"commit":true,"data":{"id":4,"name":"dd
    d"}}
    mysql> update test set name='zaijian' where id =1;
    {"database":"test_maxwell","table":"test","type":"update","ts"
    :1631618614,"xid":535,"commit":true,"data":{"id":1,"name":"zai
    jian"},"old":{"name":"nihao"}}
    
  4. 修改 test_maxwell 库的 test 表的一条数据,查看 maxwell 的控制台输出

    mysql> update test set name='abc' where id =1;
    {"database": "test_maxwell","table": "test","type": "update","ts": 1637245338,"xid": 9418,"commit": true,"data": { --修改后的数据"id": 1,"name": "abc"},"old": { --修改前的数据"name": "aaa"} 
    }
    
  5. 删除 test_maxwell 库的 test 表的一条数据,查看 maxwell 的控制台输出

    mysql> DELETE FROM test WHERE id =1;
    {"database": "test_maxwell","table": "test","type": "delete","ts": 1637245630,"xid": 9816,"commit": true,"data": {"id": 1,"name": "abc"} 
    }
    

2.2.2 监控 Mysql 数据输出到 kafka

实现步骤
  1. 启动 zookeeper 和 kafka

    [atguigu@hadoop102 bin]$ jpsall
    =============== hadoop102 ===============
    3511 QuorumPeerMain
    4127 Kafka
    =============== hadoop103 ===============
    1885 Kafka
    1342 QuorumPeerMain
    =============== hadoop104 ===============
    1345 QuorumPeerMain
    1886 Kafka
    
  2. 启动 Maxwell 监控 binlog

    atguigu@hadoop102 maxwell-1.29.2]$ bin/maxwell --user='maxwell' 
    --password='123456' --host='hadoop102' --producer=kafka --
    kafka.bootstrap.servers=hadoop102:9092 --kafka_topic=maxwell
    
  3. 打开 kafka 的控制台的消费者消费 maxwell 主题

    [atguigu@hadoop102 ~]$ kafka-console-consumer.sh --bootstrapserver hadoop102:9092 --topic maxwell
    (4)向 test_maxwell 库的 test 表再次插入一条数据
    
  4. 向 test_maxwell 库的 test 表再次插入一条数据

    mysql> insert into test values (5,'eee');
    
  5. 通过 kafka 消费者来查看到了数据,说明数据成功传入 kafka

    {"database":"test_maxwell","table":"test","type":"insert","ts"
    :1637245889,"xid":10155,"commit":true,"data":{"id":5,"name":"e
    ee"}}
    
kafka 主题数据的分区控制

​ 在公司生产环境中,我们一般都会用 maxwell 监控多个 mysql 库的数据,然后将这

些数据发往 kafka 的一个主题 Topic,并且这个主题也肯定是多分区的,为了提高并发度。

那么如何控制这些数据的分区问题,就变得至关重要,实现步骤如下:

  1. 修改 maxwell 的配置文件,定制化启动 maxwell 进程

    [atguigu@hadoop102 maxwell-1.29.2]$ vim config.properties
    # tl;dr config
    log_level=info
    producer=kafka
    kafka.bootstrap.servers=hadoop102:9092
    # mysql login info
    host=hadoop102
    user=maxwell
    password=123456
    # *** kafka ***
    # list of kafka brokers
    #kafka.bootstrap.servers=hosta:9092,hostb:9092
    # kafka topic to write to
    # this can be static, e.g. 'maxwell', or dynamic, e.g. 
    namespace_%{database}_%{table}
    # in the latter case 'database' and 'table' will be replaced 
    with the values for the row being processed
    kafka_topic=maxwell3
    # *** partitioning ***
    # What part of the data do we partition by?
    #producer_partition_by=database # [database, table, 
    primary_key, transaction_id, column]
    producer_partition_by=database
    控制数据分区模式,可选模式有 库名,表名,主键,列名
    # specify what fields to partition by when using 
    producer_partition_by=column
    # column separated list.
    #producer_partition_columns=name
    # when using producer_partition_by=column, partition by this 
    when
    # the specified column(s) don't exist.
    #producer_partition_by_fallback=database
    
  2. 手动创建一个 3 个分区的 topic,名字就叫做 maxwell3

    [atguigu@hadoop102 maxwell-1.29.2]$ kafka-topics.sh --zookeeper 
    hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka --create --
    replication-factor 2 --partitions 3 --topic maxwell3
    
  3. 利用配置文件启动 Maxwell 进程

    [atguigu@hadoop102 maxwell-1.29.2]$ bin/maxwell --
    config ./config.properties
    
  4. 向 test_maxwell 库的 test 表再次插入一条数据

    mysql> insert into test_maxwell.test values (6,'fff');
    
  5. 通过 kafka tool 工具查看,此条数据进入了 maxwell3 主题的 1 号分区

在这里插入图片描述

  1. 向 test 库的 aaa 表插入一条数据

    mysql> insert into test_maxwell2.test values (23,'dd');
    
  2. 通过 kafka tool 工具查看,此条数据进入了 maxwell3 主题的 0 号分区,说明库名

    会对数据进入的分区造成影响。

在这里插入图片描述

2.2.3 监控 Mysql 指定表数据输出控制台

  1. 运行 maxwell 来监控 mysql 指定表数据更新

    [atguigu@hadoop102 maxwell-1.29.2]$ bin/maxwell --
    user='maxwell' --password='123456' --host='hadoop102' --filter 
    'exclude: *.*, include:test_maxwell.test' --producer=stdout
    
  2. 向 test_maxwell.test 表插入一条数据,查看 maxwell 的监控

    mysql> insert into test_maxwell.test values(7,'ggg');
    {"database":"test_maxwell","table":"test","type":"insert","ts"
    :1637247760,"xid":11818,"commit":true,"data":{"id":7,"name":"g
    gg"}}
    
  3. 向 test_maxwell.test2 表插入一条数据,查看 maxwell 的监控

    mysql> insert into test1 values(1,'nihao');
    本次没有收到任何信息
    说明 include 参数生效,只能监控指定的 mysql 表的信息
    

    注:还可以设置 include:test_maxwell.*,通过此种方式来监控 mysql 某个库的所有

    表,也就是说过滤整个库。读者可以自行测试。

2.2.4 监控 Mysql 指定表全量数据输出控制台,数据初始化

​ Maxwell 进程默认只能监控 mysql 的 binlog 日志的新增及变化的数据,但是Maxwell 是支持数据初始化的,可以通过修改 Maxwell 的元数据,来对 MySQL 的某张表进行数据初始化,也就是我们常说的全量同步。具体操作步骤如下:

需求:将 test_maxwell 库下的 test2 表的四条数据,全量导入到 maxwell 控制台进行打印。

在这里插入图片描述

  1. 修改 Maxwell 的元数据,触发数据初始化机制,在 mysql 的 maxwell 库中 bootstrap表中插入一条数据,写明需要全量数据的库名和表名。

    mysql> insert into maxwell.bootstrap(database_name,table_name) 
    values('test_maxwell','test2');
    

在这里插入图片描述

  1. 启动 maxwell 进程,此时初始化程序会直接打印 test2 表的所有数据

    [atguigu@hadoop102 maxwell-1.29.2]$ bin/maxwell --
    user='maxwell' --password='123456' --host='hadoop102' --
    producer=stdout
    Using kafka version: 1.0.0
    23:15:38,841 WARN MaxwellMetrics - Metrics will not be 
    exposed: metricsReportingType not configured.
    23:15:39,110 INFO Maxwell - Maxwell v1.22.0 is booting 
    (StdoutProducer), starting at Position[BinlogPosition[mysqlbin.000004:611096], lastHeartbeat=1637248429242]
    23:15:39,194 INFO MysqlSavedSchema - Restoring schema id 6 
    (last modified at Position[BinlogPosition[mysqlbin.000004:517625], lastHeartbeat=1637246435111])
    23:15:39,299 INFO MysqlSavedSchema - Restoring schema id 1 
    (last modified at Position[BinlogPosition[mysqlbin.000004:158612], lastHeartbeat=0])
    23:15:39,342 INFO MysqlSavedSchema - beginning to play 
    deltas...
    23:15:39,343 INFO MysqlSavedSchema - played 5 deltas in 1ms
    {"database":"test_maxwell","table":"test2","type":"bootstrapstart","ts":1637248539,"data":{}}
    23:15:39,367 INFO SynchronousBootstrapper - bootstrapping 
    started for test_maxwell.test2
    23:15:39,369 INFO BinlogConnectorReplicator - Setting initial 
    binlog pos to: mysql-bin.000004:611096
    {"database":"test_maxwell","table":"test2","type":"bootstrapinsert","ts":1637248539,"data":{"id":1,"name":"aa"}}
    {"database":"test_maxwell","table":"test2","type":"bootstrapinsert","ts":1637248539,"data":{"id":2,"name":"bb"}}
    {"database":"test_maxwell","table":"test2","type":"bootstrapinsert","ts":1637248539,"data":{"id":3,"name":"cc"}}
    {"database":"test_maxwell","table":"test2","type":"bootstrapinsert","ts":1637248539,"data":{"id":4,"name":"dd"}}
    {"database":"test_maxwell","table":"test2","type":"bootstrapcomplete","ts":1637248539,"data":{}}
    23:15:39,387 INFO SynchronousBootstrapper - bootstrapping 
    ended for #8 test_maxwell.test2
    23:15:39,465 INFO BinaryLogClient - Connected to 
    hadoop102:3306 at mysql-bin.000004/611096 (sid:6379, cid:108)
    23:15:39,465 INFO BinlogConnectorLifecycleListener - Binlog 
    connected.
    
  2. 当数据全部初始化完成以后,Maxwell 的元数据会变化

    is_complete 字段从 0 变为 1

    start_at 字段从 null 变为具体时间(数据同步开始时间)

    complete_at 字段从 null 变为具体时间(数据同步结束时间)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-(C/C++)动态链接库生成以及使用(libxxx.so)

Linux中so文件为共享库,与windows下dll类似,不过实现要简单。 so可以供多个进程使用,不同进程调用同一个so文件,所使用so文件不同。 so文件源程序不需要main函数,有也不会被执行。 下面通过一个简单例子,来…

IO之打印流

打印流,打印数据的,打印流只能是输出流: PrintStream: 字节打印流 PrintWriter: 字符打印流 -对于PrintWriter来说,当启用字段刷新之后, 调用println或者printf或者format方法,便会立马刷新操作. 如果没有开启自动刷新,则需要手动刷新或者当缓冲区满的时候,再自动刷新. 使…

IO之 Properties类加载文件

配置文件:资源文件(以.properties作为拓展名的文件)/属性文件: 做项目开发,为何使用配置文件? 把所有的数据存储在代码中,写死了,”硬编码”. 比如:在Java中需要连接数据库,必须拥有数据的账号和密码. 此时我们就得在Java代码中编写,类似的代码: String username”root”…

IO之数据流

数据流,提供了可以读/写任意数据类型的方法: DataOutputStream: 提供了 writeXxx(xxx value)方法. DataInputStream: 提供了 readXxx()方法. 注意: writeXxx和readXxx必须要对应起来, writeByte写出的数据,此时只能使用readByte读取回来.

可视化的状态机(FSM)

状态机这个概念已经在网上的博客和论坛中都已经说烂了,随便一搜都有一大堆。相关的废话就不多说了,在这里主要是分享一下如何可视化的设计状态机,如何增强项目的灵活性。这里通过一个生活中的电梯来了解一下状态机。 电梯逻辑如下图&#xf…

IO之 随机访问文件(RandomAccessFile)

随机访问文件(RandomAccessFile): 表示可以在该文件的任何位置写出和读取数据. API中文解释: 此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针&…

IO之 管道流

管道流: 实现两个线程之间的数据交互. PipedInputStream PipedOutputStream PipedReder PipedWriter 中文API解释: PipedInputStream public class PipedInputStreamextends InputStream管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的…

AOE网上的关键路径

题目描述 一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图。 AOE(Activity On Edge)网:顾名思义,用边表示活动的网,当然它也是DAG。与AOV不同,活动都表示在了边上&#xff…

IO之NIO

NIO:New IO: 从JDK1.4开始提出的,新的IO,可以把一块磁盘文件映射到内存中,我们再去读取内存中的数据. 存放在java.nio包中. Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API 现在主要运用于服务器中…

IO流总结

四大基流: InputStream—- OutputStream Reader —- Writer IO流的总结和梳理: 文件流: FileInputStream FileOutputStream FileReader FileWriter 缓冲流: BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter 转换流(把字节转换为字符): …

C++异常处理类与自定义异常处理类

转自&#xff1a;http://blog.csdn.net/makenothing/article/details/43273137 例1&#xff1a;自定义一个继承自excepton的异常类myException C标准中&#xff0c;定义在<stdexcept>中的任何异常类都派生自exception Class&#xff0c;本例也只是简单地由exception继承&…

网络编程概念总结

计算机网路: 计算机网络&#xff0c;是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 从逻辑…

数据结构实验之图论八:欧拉回路

题目描述 在哥尼斯堡的一个公园里&#xff0c;有七座桥将普雷格尔河中两个岛及岛与河岸连接起来。 能否走过这样的七座桥&#xff0c;并且每桥只走一次&#xff1f;瑞士数学家欧拉最终解决了这个问题并由此创立了拓扑学。欧拉通过对七桥问题的研究&#xff0c;不仅圆满地回答…

socket阻塞与非阻塞,同步与异步

转自&#xff1a;http://blog.csdn.net/hguisu/article/details/7453390 socket阻塞与非阻塞&#xff0c;同步与异步 作者&#xff1a;huangguisu 1. 概念理解 在进行网络编程时&#xff0c;我们常常见到同步(Sync)/异步(Async)&#xff0c;阻塞(Block)/非阻塞(Unblock)四种调…

多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用

线程通信-wait和notify方法介绍: java.lang.Object类提供类两类用于操作线程通信的方法. wait():执行该方法的线程对象释放同步锁,JVM把该线程存放到等待池中,等待其他的线程唤醒该线程. notify:执行该方法的线程唤醒在等待池中等待的任意一个线程,把线程转到锁池中等待. notif…

CRT

当C Runtime函数库于20世纪70年代产生出来时&#xff0c;PC的内存容量还很小,多任务是个新奇观念&#xff0c;更别提什么多线程了。因此以当时产品为基础所演化的C Runtime函数库在多线程&#xff08;multithreaded&#xff09;的表现上有严重问题&#xff0c;无法被多线程程序…

java多线程笔记补充之线程的生命周期

多线程通信的时候很容易造成死锁,死锁无法解决,只能避免: 当A线程等待由B线程持有的锁,而B线程正在等待A线程持有的锁时,发生死锁现象,JVM不检测也不试图避免这种情况,所以程序员必须保证不导致死锁. 避免死锁法则: 当多个线程都要访问共享的资源A,B,C时,保证每一个线程都按照…

java多线程笔记补充之 线程控制操作

线程休眠:让执行的线程暂停一段时间&#xff0c;进入计时等待状态。 方法:staticvoid sleep(long millis) 调用sleep后&#xff0c;当前线程放弃CPU,在指定时间段之内&#xff0c;sleep所在线程不会获得执行的机会。 此状态下的线程不会释放同步锁/同步监听器. 该方法更多的用…

java5新特性静态引用、foreach、自动装箱和泛型枚举以及可变参数的总结

静态引用 导入(import)表示去找哪一个类&#xff0c;去哪一个包下去找哪些被使用到的类。 在java中有一个语言核心包&#xff1a;java.lang. 使用java.lang包中的API&#xff0c;不需要引用&#xff0c;直接能找到&#xff0c;但是&#xff0c;如果我们使用到的API不呼吁java.l…