Java之BIO编程
I/O 模型I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。
Java 共支持 3 种网络编程模型/IO 模式:BIO、NIO、AIO
Java BIO : 同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器 端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销 【简单示意图】
Java NIO : 同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注 册到多路复用器上,多路复用器轮询到连接有 I/O 请求就进行处理 【简单示意图】
Java AIO(NIO.2) : 异步非阻塞,AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较 多且连接时间较长的应用。
适用场景分析BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序简单易理解。
NIO ...
URL网络编程
URL类URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一资源的地址。
它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate 这个资源。
通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。
URL的基本结构由5部分组成:
<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
例如: http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123
#片段名:即锚点,例如看小说,直接定位到章节
参数列表格式:参数名=参数值&参数名=参数值….
为了表示URL,java.net 中实现了类 URL。我们可以通过下面的构造器来初始化一个 URL 对象:
public URL (String spec):通过一个 ...
UDP网络编程
UDP网络通信类DatagramSocket 和DatagramPacket实现了基于 UDP 协议网络程序。
UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证 UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP 地址和端口号以及接收端的IP地址和端口号。
UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和 接收方的连接。如同发快递包裹一样。
DatagramSocket类的常用方法
public DatagramSocket(int port)创建数据报套接字并将其绑定到本地主机上的指定端口。套接字将被 绑定到通配符地址,IP 地址由内核来选择。
public DatagramSocket(int port,InetAddress laddr)创建数据报套接字,将其绑定到指定的本地地址。 本地端口必须在 0 到 65535 之间(包括两者)。如果 IP 地址为 0.0.0.0,套接字将被绑定到通配符地 址,IP 地址由内核选择。
publi ...
TCP网络编程
基于Socket的TCP编程Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模 型如图所示:
客户端Socket的工作过程包含以下四个基本的步骤:
创建Socket:根据指定服务端的 IP 地址或端口号构造 方法Socket()构造 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
打开连接到 Socket 的输入/出流: 使用getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输.
按照一定的协议对Socket 进行读/写操作:通过输入流读取服务器放入线路的信息 (但不能读取自己放入线路的信息),通过输出流将信息写入线程。
关闭 Socket:断开客户端到服务器的连接,释放线路
服务器程序的工作过程包含以下四个基本的步骤:
调用ServerSocket(int port):创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
调用accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信 套接字对象。
调用 该Socket类对象的 getOu ...
Java网络编程概述
您好, 这里需要密码.a1740b908511e1bd67328d04121dd7798fb2e04b2bd5ded41dca65011f82969d8b0d28e2b9a7fb4f9f65ff1a58db3e7ad3d1b0bf50383d8642ecf72840ae3783fdc42ee2a410381bc3a810977c2cea872b3ef7f2f9abd6c8b6fe039a8372488dd36e2086e9f1949624ada349b296eaf87cd3954336574e20d74f291145015583d1eb3dd5e8a8ad936721ac544b43659a271a49764d4f59a6989b93e39c4b9383f760866572399b1b7c040f319888a4fdafa9b89fb3ec31b7a55cab3f49b371b7b36852cd23fefde63e408a028a4bdbae76028a67e39f70444dd2faaa9257a11b2106f7bc056c3137143919368f9e2e3f610fed648 ...
MyCat分库分表
分库
把对customer的操作分给dn2数据库,其他表的操作分发给dn1数据库。
首先配置schema.xml
123456789101112131415161718192021222324252627282930313233<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 逻辑库 绑定dataNode--> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> <table name="customer" dataNod ...
MyCat读写分离
简介MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。
我们的应用只需要一台数据库服务器的时候我们并不需要Mycat,而如果你需要分库甚至分表,这时候应用要面对很多个数据库的时候,这个时候就需要对数据库层做一个抽象,来管理这些数据库,而最上面的应用只需要面对一 ...
MySQL主从复制
主从复制Redis主从复制
MySQL与Redis主从复制不同的是,MySQL是从接入点开始主从复制。
步骤:
master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events
slave将master的binary log events拷贝到它的中继日志(relay log)
slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的
基本原则:
每个slave只有一个master
每个slave只能有一个唯一的服务器ID
每个master可以有多个salve
复制的最大问题是存在延时。(需要IO读写日志)
配置搭建一主一从
注意:修改任何文件时都记得备份。否则……
这里我把虚拟机复制了一份,也就拥有两个MySQL了。不过这样会导致两个Mysql的uuid是一样的,所以我们要先修改一下其中的一个uuid。
show variables like 'datadir';查看数据目录
然后进入到数据目录,修改vim auto.cnf将其中的server-uuid进行 ...
MySQL视图
简介将一段查询sql封装为一个虚拟的表。
这个虚拟表只保存了sql逻辑,不会保存任何查询结果。
作用
封装复杂sql语句,提高复用性
逻辑放在数据库上面,更新不需要发布程序,面对频繁的需求变更更灵活
适用场景
很多地方可以共用的一组查询结果
报表
语法创建:CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
使用:
查询:select * from view_name
更新: CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
注意事项MySQL5.5:mysql的视图中不允许有from 后面的子查询,但oracle可以.
MySQL之查询截取分析
慢查询日志 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。
由他来查看哪些 SQL 超出了我们的最大忍耐时间值,比如一条 sql 执行超过 5 秒钟,我们就算慢 SQL ,希望能收集超过 5 秒的 sql ,结合之前 explain 进行全面分析。
SHOW VARIABLES LIKE '%slow_query_log%';查看是否开启。下面是日志文件。
默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,
可以通过设置slow_query_log的值来开启set global slow_query_log=1
使用set global slow_query_log=1;开启了慢查询日志 只对当前数据库生效, 如果MySQL重启后则会失 ...