轻松学,Java 中的代理模式及动态代理

轻松学,Java 中的代理模式及动态代理

代理 代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人。 按理说,顾客可以直接从厂家购买产品,但是现实生活中,很少有这样的销售模式。一般都是厂家委托给代理商进行销售,顾客跟代理商打交道,而不直接与产品实际生产者进行关联。 所以,代理就有一种中间人的味道。 接下来,我们说说软件中的代理模式。 代理模式 代理模式是面向对象编程中比较常见的设计模式。 这是常见代理模式常见的 UML 示意图。 需要注意的有下面几点: 用户只关心接口功能,而不在乎谁提供了功能。上图中接口是 Subject。 接口真正实现者是上图的 RealSubject,但是它不与用户直接接触,而是通过代理。 代理就是上图中的 Proxy,由于它实现了 Subject 接口,所以它能够直接与用户接触。 用户调用 Proxy 的时候,Proxy 内部调用了 RealSubject。所以,Proxy 是中介者,它可以增强 RealSubject 操作。 如果难于理解的话,我用事例说明好了。值得注意的是,代理可以分为静态代理和动态代理两种。先从静态代理讲起。 静态代理 我们平常去电影院看电影的时候,在电影开始的阶段是不是经常会放广告呢? 电影是电影公司委托给影院进行播放的,但是影院可以在播放电影的时候,产生一些自己的经济收益,比如卖爆米花、可乐等,然后在影片开始结束时播放一些广告。 现在用代码来进行模拟。 首先得有一个接口,通用的接口是代理模式实现的基础。这个接口我们命名为 Movie,代表电影播放的能力。 package com.frank.test; public interface Movie { void play(); } 1 2 3 4 5 6 7 然后,我们要有一个真正的实现这个 Movie 接口的类,和一个只是实现接口的代理类。 package com.frank.test; public class RealMovie implements Movie { @Override public void play() { // TODO Auto-generated method stub System.out.println("您正在观看电影 《肖申克的救赎》"); } } 1 2 3 4 5 6 7 8 9 10 11 这个表示真正的影片。它实现了 Movie 接口,play() 方法调用时,影片就开始播放。那么 Proxy 代理呢? package com.frank.test; public class Cinema implements Movie { RealMovie movie; public Cinema(RealMovie movie) { super(); this.movie = movie; } @Override public void play() { guanggao(true); movie.play(); guanggao(false); } public void guanggao(boolean isStart){ i

【原创】面试官:谈谈你对mysql联合索引的认识?

【原创】面试官:谈谈你对mysql联合索引的认识?

引言 本文预计分为两个部分: (1)联合索引部分的基础知识 在这个部分,我们温习一下联合索引的基础 (2)联合索引部分的实战题 在这个部分,列举几个我认为算是实战中的代表题,挑出来说说。 正文 基础 讲联合索引,一定要扯最左匹配!放心,我不扯有的没的,几句话懂个大概就行! 最左匹配 所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。 假设,我们对(a,b)字段建立一个索引,也就是说,你where后条件为 a = 1 a = 1 and b = 2 是可以匹配索引的。但是要注意的是~你执行 b= 2 and a =1 也是能匹配到索引的,因为Mysql有优化器会自动调整a,b的顺序与索引顺序一致。 相反的,你执行 b = 2 就匹配不到索引了。 而你对(a,b,c,d)建立索引,where后条件为 a = 1 and b = 2 and c > 3 and d = 4 那么,a,b,c三个字段能用到索引,而d就匹配不到。因为遇到了范围查询! 最左匹配的原理? 假设,我们对(a,b)字段建立索引,那么入下图所示 如图所示他们是按照a来进行排序,在a相等的情况下,才按b来排序。 因此,我们可以看到a是有序的1,1,2,2,3,3。而b是一种全局无序,局部相对有序状态! 什么意思呢? 从全局来看,b的值为1,2,1,4,1,2,是无序的,因此直接执行b = 2这种查询条件没有办法利用索引。 从局部来看,当a的值确定的时候,b是有序的。例如a = 1时,b值为1,2是有序的状态。当a=2时候,b的值为1,4也是有序状态。 因此,你执行a = 1 and b = 2是a,b字段能用到索引的。而你执行a > 1 and b = 2时,a字段能用到索引,b字段用不到索引。因为a的值此时是一个范围,不是固定的,在这个范围内b值不是有序的,因此b字段用不上索引。 综上所示,最左匹配原则,在遇到范围查询的时候,就会停止匹配。 实战 OK,懂上面的基础,我们就可以开始扯了~我举了经典的五大题型,看完基本就懂! 题型一 如果sql为 SELECT * FROM table WHERE a = 1 and b = 2 and c = 3; 如何建立索引? 如果此题回答为对(a,b,c)建立索引,那都可以回去等通知了。 此题正确答法是,(a,b,c)或者(c,b,a)或者(b,a,c)都可以,重点要的是将区分度高的字段放在前面,区分度低的字段放后面。像性别、状态这种字段区分度就很低,我们一般放后面。 例如假设区分度由大到小为b,a,c。那么我们就对(b,a,c)建立索引。在执行sql的时候,优化

expect命令

expect命令

1.什么是expect expect是基于TCL的相对简单的一个免费的脚本编程工具语言,用来实现自动和交互式任务程序语言进行通信,无需人工干预,其作者定义为:expect is a software suite for automating interactive tools 2.expect程序的工作流程 except的工作流程可以理解为: spawn启动进程 --> expect期待关键字 --> send向进程发送字符 --> 退出结束 3.安装except yum install expect -y 4.一个小实例 #!/usr/bin/expect spawn ssh -p22 root@192.168.1.25 /usr/sbin/ifconfig -a set timeout 60 expect "*password:" {send "root1234\n"} expect eof exit 5.expect语法 expect命令的语法: 命令 [选项] 参数 5.1 spwan spwan命令是expect的初始命令,它启动一个进程,之后所有expect操作都在这个进程中进行,其使用方法如下: spwan ssh root@192.168.1.26 在spwan命令后面,直接加上要启动的进程、命令等信息,除此之外,还支持其他选项: -open 启动文件进程,具体说明请自行查阅 -ignore 忽略某些信号,具体说明请自行查阅 5.2 expect 使用方法: expect 表达式 动作 表达式 动作 ... ... expect命令用于等候一个相匹配内容的输出,一旦匹配则执行expect后面的动作命令,这个命令接收几个特有参数,用的最多的就是-re,表示使用正则表达式进行匹配,如下: spwan ssh root@192.168.1.26 expect -re ".*password" {send "root1234\r"} expect是依附与spwan命令的,当执行ssh命令后,expect就会匹配命令执行后的输出,然后执行expect后面包含在{}中的send或exp_send动作,匹配及动作可以放在下一行,就可以省略{},如下: spwan ssh root@192.168.1.26 expect -re ".*password" send "root1234\r" 5.3 exp_send和send 在上面的介绍中,我们看到了exp_send命令的使用,exp_send是expect中的动作,send和其作用一样。exp_send命令可以发送一些特殊符号: \r 回车 \n 换行 \t 制表符 send命令还有几个可选的参数: -i 指定spwan_id, 这个参数用来向不同的spwan_id的进程发送命令,是进行多进程控制的关键参数。 -s s代表slowly,也就是控制发送的速度,这个参数使用的时候要与expect中的变量send_slow向关联 5.4 exp_continue 这个命令一般用在动作中,它被使用的条件比较苛刻,例子: #!/usr/bin/expect spwan ssh -p22 root@192.168.1.26 /usr/sbin/ifconfig eth0 set timeout 60 expect { -timeout 1

decimal(numeric )、float 和 real 数据类型的区别

decimal(numeric )、float 和 real 数据类型的区别

decimal(numeric ) 同义,用于精确存储数值 float 和 real 不能精确存储数值 decimal数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。decimal数据类型存储了一个准确(精确)的数字表达法;不存储值的近似值。 定义decimal的列、变量和参数的两种特性如下: p 小数点左边和右边数字之和,不包括小数点。如 123.45,则 p=5,s=2。 指定精度或对象能够控制的数字个数。 s 指定可放到小数点右边的小数位数或数字个数。 p 和 s 必须遵守以下规则:0 <=s<=p<= 38。 numeric和decimal数据类型的默认最大精度值是 38。在 Transact-SQL 中,numeric与decimal数据类型在功能上等效。 当数据值一定要按照指定精确存储时,可以用带有小数的decimal数据类型来存储数字。 float 和 real 数据 float和real数据类型被称为近似的数据类型。在近似数字数据类型方面,float和real数据的使用遵循 IEEE 754 标准。 近似数字数据类型并不存储为多数数字指定的精确值,它们只储存这些值的最近似值。在很多应用程序中,指定值与存储值之间的微小差异并不明显。但有时这些差异也值得引起注意。由于float和real数据类型的这种近似性,当要求精确的数字状态时,比如在财务应用程序中,在那些需要舍入的操作中,或在等值核对的操作中,就不使用这些数据类型。这时就要用integer、decimal、money或smallmone数据类型。 在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用float或real列。最好限制使用float和real列做> 或 < 的比较。 IEEE 754 规格提供了四种舍入模式:舍入到最接近的值、上舍入、下舍入和舍入到零。Microsoft® SQL Server™ 使用上舍入。所有的数值必须精确到确定的精度,但会产生细小的浮点值变化。因为浮点数字的二进制表示法可以采用很多合法舍入规则中的任意一条,因此我们不可能可靠地量化一个浮点值。 转换 decimal 和 numeric 数据 对于decimal和numeric数据类型,Microsoft® SQL Server™ 将精度和小数位数的每个特定组合看作是不同的数据类型。例如,decimal(5,5) 和decimal(5,0) 被当作不同的数据类型。 在 Transact-SQL 语句中,带有小数点的常量自动转换为numeric数据值,且必然使用最小的精度和小数位数。例如,常量 12.345 被转换为numeric值,其精度为 5,小数位为 3。 从decimal或numeric向float或real转换会导致精度损失。从int、smallint、tinyint、float、real、money或smallmoney向decimal或numeric转换会导致溢

mysql删除数据后释放磁盘空间

mysql删除数据后释放磁盘空间

drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; truncate table table_name立刻释放磁盘空间 ,不管是 Innodb和MyISAM; delete from table_name 删除表的全部数据,对于MyISAM 会立刻释放磁盘空间 ,而InnoDB 不会释放磁盘空间; delete from table_name where xx 带条件的删除, 不管是innodb还是MyISAM都不会释放磁盘空间; delete操作后使用optimize table table_name 释放磁盘空间,优化表期间会锁定表,所以要在空闲时段执行optimize table ,测试十几个G数据的表执行optimize table 大概20多分钟。 注:delete删除数据的时候,mysql并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,mysql会利用这些已删除的空间再写入。即,删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。 OPTIMIZE TABLE命令优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片;该命令将会整理表数据和相关的索引数据的物理存储空间,用来减少占用的磁盘空间,并提高访问表时候的IO性能;但是具体对表产生的影响是依赖于表使用的存储引擎的。该命令对视图无效。 使用optimize table table_name出现Table does not support optimize, doing recreate + analyze instead 的解决办法: innodb的数据库不支持optimize,可以用 ALTER TABLE table.name ENGINE='InnoDB';对旧表以复制的方式新建一个新表,然后删除旧表。操作前最好备份表。 重新启动mysql ,在启动的时候指定–skip-new或者–safe-mode选项来支持optimize功能 再执行optimize table table_name >/usr/local/mysql/bin/mysqladmin -uroot -p shutdown --停止mysql >/usr/local/mysql/bin/mysqld --skip-new & --启动mysql >mysql -uroot -p --在服务器上连接mysql mysql>use db_name; 删除数据并执行了optimize table释放了磁盘空间;optimize命令优化表 不要频繁操作,另外还发现执行optimize命令 Innodb 引擎的数据库下ibtmp1 文件由原来的几个Gy优化成12M了。 但如果数据每天都大量插入,删除数据后不执行optimize table, insert 数据的时候会占用已经删除那部分数据的空间,数据文件所占用的磁盘空间短时间并不会增长,所以要减少数据文件占用磁盘空间,可以对表进行压缩。 作者:扛着煤气去救火 链接:https://www.jianshu.com/p/ebe6ac68099a 来源:简

联系我们

联系电话

4000-640-466

联系邮箱

service@f-li.cn

办公地址

上海黄浦区外滩源1号

谢谢,您的信息已成功发送。
请填写信息。