首页 文章 精选 留言 我的

精选列表

搜索[高性能rpc框架],共10000篇文章
优秀的个人博客,低调大师

《Oracle高性能自动化运维》一一导读

Preface 前 言 为什么要写这本书2008年的某一天,我怀着激动的心情参加了支付宝公司的面试,这次面试让我对国内最前沿的数据库自动化运维技术有了初步的认识,对我的职业生涯影响非常大,时刻激励着我以后不管遇到什么困难或者诱惑,Oracle始终都是我追逐的爱好和目标。在接下来几年的工作中,我较为深入地研究了C语言数据结构、Linux操作系统原理以及Shell(PHP/Java)编程等知识,这些技术能够很好地支撑Oracle运维管理。同时,多年的经验告诉我,对集运维与开发于一体的Oracle运维管理体系来而言,精通一门开发语言是相当有必要的,因为只有这样才可以更为深入地了解数据库与业务程序之间的架构设计,并能够更为精确地把控Oracle管理优化,从而在面对各种疑难问题时找到解决的突破口。 目录 第1章 Linux下的Oracle 1.01.1 Linux简介1.2 Oracle简介1.3 Linux内存体系的优势1.4 Linux内存体系与Oracle内存空间1.5 小结第2章 Oracle内存体系结构 2.02.1 闩(Latch)2.2 队列锁(Enqueue Lock)2.3 Library Cache2.4 Buffer Cache2.5 小结第3章 Oracle重做日志(Redo) 3.03.1 Redo功能用途3.2 Redo组成结构3.3 Redo产生场景3.4 Redo优化3.5 小结

优秀的个人博客,低调大师

MORPHiS —— 点对点高性能分布式文件系统

MORPHiS 现在是早期阶段,主要目标是成为一个全局加密分布式存储,为了替代云存储。MORPHiS 现在包含一个 DMAIL(分布式邮件),内置垃圾邮件拦截,内置加密,免费发送信息。 MORPHiS 的使用非常简单:下载,双击,在 Web 浏览器打开一个窗口查看原始 MORPHiS UI 页面,就可以使用浏览和上传功能。 文章转载自 开源中国社区 [http://www.oschina.net]

优秀的个人博客,低调大师

优化SQL查询:如何写出高性能SQL语句

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 1、 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式。 可见,执行计划并不是固定的,它是“个性化的”。产生一个正确的“执行计划”有两点很重要: (1) SQL语句是否清晰地告诉查询优化器它想干什么? (2) 查询优化器得到的数据库统计信息是否是***的、正确的? 2、 统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。 select*from dual select*From dual 其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行! 3、 不要把SQL语句写得太复杂 我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。我拿着这2页长的SQL语句去请教原作者,结果他说时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的SQL语句,数据库也一样会看糊涂。 一般,将一个Select语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句还是比较常见的,但是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划。因为它被绕晕了。像这种类似人工智能的东西,终究比人的分辨力要差些,如果人都看晕了,我可以保证数据库也会晕的。 另外,执行计划是可以被重用的,越简单的SQL语句被重用的可能性越高。而复杂的SQL语句只要有一个字符发生变化就必须重新解析,然后再把这一大堆垃圾塞在内存里。可想而知,数据库的效率会何等低下。 4、 使用“临时表”暂存中间结果 简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。 5、 OLTP系统SQL语句必须采用绑定变量 select*from orderheader where changetime >'2010-10-20 00:00:01' select*from orderheader where changetime >'2010-09-22 00:00:01' 以上两句语句,查询优化器认为是不同的SQL语句,需要解析两次。如果采用绑定变量 select*from orderheader where changetime >@chgtime @chgtime变量可以传入任何值,这样大量的类似查询可以重用该执行计划了,这可以大大降低数据库解析SQL语句的负担。一次解析,多次重用,是提高数据库效率的原则。 6、 绑定变量窥测 事物都存在两面性,绑定变量对大多数OLTP处理是适用的,但是也有例外。比如在where条件中的字段是“倾斜字段”的时候。 “倾斜字段”指该列中的绝大多数的值都是相同的,比如一张人口调查表,其中“民族”这列,90%以上都是汉族。那么如果一个SQL语句要查询30岁的汉族人口有多少,那“民族”这列必然要被放在where条件中。这个时候如果采用绑定变量@nation会存在很大问题。 试想如果@nation传入的***个值是“汉族”,那整个执行计划必然会选择表扫描。然后,第二个值传入的是“布依族”,按理说“布依族”占的比例可能只有万分之一,应该采用索引查找。但是,由于重用了***次解析的“汉族”的那个执行计划,那么第二次也将采用表扫描方式。这个问题就是著名的“绑定变量窥测”,建议对于“倾斜字段”不要采用绑定变量。 7、 只在必要的情况下才使用begin tran SQL Server中一句SQL语句默认就是一个事务,在该语句执行完成后也是默认commit的。其实,这就是begin tran的一个最小化的形式,好比在每句语句开头隐含了一个begin tran,结束时隐含了一个commit。 有些情况下,我们需要显式声明begin tran,比如做“插、删、改”操作需要同时修改几个表,要求要么几个表都修改成功,要么都不成功。begin tran 可以起到这样的作用,它可以把若干SQL语句套在一起执行,***再一起commit。好处是保证了数据的一致性,但任何事情都不是***无缺的。Begin tran付出的代价是在提交之前,所有SQL语句锁住的资源都不能释放,直到commit掉。 可见,如果Begin tran套住的SQL语句太多,那数据库的性能就糟糕了。在该大事务提交之前,必然会阻塞别的语句,造成block很多。 Begin tran使用的原则是,在保证数据一致性的前提下,begin tran 套住的SQL语句越少越好!有些情况下可以采用触发器同步数据,不一定要用begin tran。 8、 一些SQL查询语句应加上nolock 在SQL语句中加nolock是提高SQL Server并发性能的重要手段,在oracle中并不需要这样做,因为oracle的结构更为合理,有undo表空间保存“数据前影”,该数据如果在修改中还未commit,那么你读到的是它修改之前的副本,该副本放在undo表空间中。这样,oracle的读、写可以做到互不影响,这也是oracle 广受称赞的地方。SQL Server 的读、写是会相互阻塞的,为了提高并发性能,对于一些查询,可以加上nolock,这样读的时候可以允许写,但缺点是可能读到未提交的脏数据。使用 nolock有3条原则。 (1) 查询的结果用于“插、删、改”的不能加nolock ! (2) 查询的表属于频繁发生页分裂的,慎用nolock ! (3) 使用临时表一样可以保存“数据前影”,起到类似oracle的undo表空间的功能, 能采用临时表提高并发性能的,不要用nolock 。 9、 聚集索引没有建在表的顺序字段上,该表容易发生页分裂 比如订单表,有订单编号orderid,也有客户编号contactid,那么聚集索引应该加在哪个字段上呢?对于该表,订单编号是顺序添加的,如果在orderid上加聚集索引,新增的行都是添加在末尾,这样不容易经常产生页分裂。然而,由于大多数查询都是根据客户编号来查的,因此,将聚集索引加在contactid上才有意义。而contactid对于订单表而言,并非顺序字段。 比如“张三”的“contactid”是001,那么“张三”的订单信息必须都放在这张表的***个数据页上,如果今天“张三”新下了一个订单,那该订单信息不能放在表的***一页,而是***页!如果***页放满了呢?很抱歉,该表所有数据都要往后移动为这条记录腾地方。 SQL Server的索引和Oracle的索引是不同的,SQL Server的聚集索引实际上是对表按照聚集索引字段的顺序进行了排序,相当于oracle的索引组织表。SQL Server的聚集索引就是表本身的一种组织形式,所以它的效率是非常高的。也正因为此,插入一条记录,它的位置不是随便放的,而是要按照顺序放在该放的数据页,如果那个数据页没有空间了,就引起了页分裂。所以很显然,聚集索引没有建在表的顺序字段上,该表容易发生页分裂。 曾经碰到过一个情况,一位哥们的某张表重建索引后,插入的效率大幅下降了。估计情况大概是这样的。该表的聚集索引可能没有建在表的顺序字段上,该表经常被归档,所以该表的数据是以一种稀疏状态存在的。比如张三下过20张订单,而最近3个月的订单只有5张,归档策略是保留3个月数据,那么张三过去的 15张订单已经被归档,留下15个空位,可以在insert发生时重新被利用。在这种情况下由于有空位可以利用,就不会发生页分裂。但是查询性能会比较低,因为查询时必须扫描那些没有数据的空位。 重建聚集索引后情况改变了,因为重建聚集索引就是把表中的数据重新排列一遍,原来的空位没有了,而页的填充率又很高,插入数据经常要发生页分裂,所以性能大幅下降。 对于聚集索引没有建在顺序字段上的表,是否要给与比较低的页填充率?是否要避免重建聚集索引?是一个值得考虑的问题! 10、加nolock后查询经常发生页分裂的表,容易产生跳读或重复读 加nolock后可以在“插、删、改”的同时进行查询,但是由于同时发生“插、删、改”,在某些情况下,一旦该数据页满了,那么页分裂不可避免,而此时nolock的查询正在发生,比如在第100页已经读过的记录,可能会因为页分裂而分到第101页,这有可能使得nolock查询在读101页时重复读到该条数据,产生“重复读”。同理,如果在100页上的数据还没被读到就分到99页去了,那nolock查询有可能会漏过该记录,产生“跳读”。 上面提到的哥们,在加了nolock后一些操作出现报错,估计有可能因为nolock查询产生了重复读,2条相同的记录去插入别的表,当然会发生主键冲突。 11、使用like进行模糊查询时应注意 有的时候会需要进行一些模糊查询比如 select*from contact where username like ‘%yue%’ 关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%, 12、数据类型的隐式转换对查询效率的影响 sql server2000的数据库,我们的程序在提交sql语句的时候,没有使用强类型提交这个字段的值,由sql server 2000自动转换数据类型,会导致传入的参数与主键字段类型不一致,这个时候sql server 2000可能就会使用全表扫描。Sql2005上没有发现这种问题,但是还是应该注意一下。 13、SQL Server 表连接的三种方式 (1) Merge Join (2) Nested Loop Join (3) Hash Join SQL Server 2000只有一种join方式——Nested Loop Join,如果A结果集较小,那就默认作为外表,A中每条记录都要去B中扫描一遍,实际扫过的行数相当于A结果集行数x B结果集行数。所以如果两个结果集都很大,那Join的结果很糟糕。 SQL Server 2005新增了Merge Join,如果A表和B表的连接字段正好是聚集索引所在字段,那么表的顺序已经排好,只要两边拼上去就行了,这种join的开销相当于A表的结果集行数加上B表的结果集行数,一个是加,一个是乘,可见merge join 的效果要比Nested Loop Join好多了。 如果连接的字段上没有索引,那SQL2000的效率是相当低的,而SQL2005提供了Hash join,相当于临时给A,B表的结果集加上索引,因此SQL2005的效率比SQL2000有很大提高,我认为,这是一个重要的原因。 总结一下,在表连接时要注意以下几点: (1) 连接字段尽量选择聚集索引所在的字段 (2) 仔细考虑where条件,尽量减小A、B表的结果集 (3) 如果很多join的连接字段都缺少索引,而你还在用SQL Server 2000,赶紧升级吧。 【责任编辑: seeker TEL:(010)68476606】

优秀的个人博客,低调大师

【框架】121:spring框架之IOC容器

今天是刘小爱自学Java的第121天。 感谢你的观看,谢谢你。 在spring核心配置文件中,有一个bean标签,我们以前创建一个对象都是直接new。 而在spring中可以将对象交给spring管理,再通过spring工厂直接获取。 所以我们也称之为spring容器。 今天的学习内容就是关于bean标签: Bean的作用域:单例与多例说明。 Bean属性依赖注入的两种方式,以及p名称空间、seEL表达式的引入。 补充说明一个IDEA插件。 一、bean的作用域 作用域也就是指:由spring创建的bean对象在什么情况下有效?主要有单例和多例两种。 在spring核心配置文件中可以配置对象是单例还是多例,通过scope属性设定: 值为singleton即为单例,默认值,可省略。 值为prototype即为多例。 1单例测试 多次获取单例对象,并打印输出。 我们会发现:如果是单例的话,构造方法只运行一次,多次获取的是同一个对象。 在spring IOC容器中仅存在一个bean实例,bean以单例方式存在。 注意:这边我大致提下,昨天忘记说明了,通过spring工厂获取对象时,参数可以是id,也可以是bean的类型,也就是对应接口/类的Class对象。 使用id获取最稳妥,如果根据类型获取,配置了多个类型的话,会抛出异常。 2多例测试 多次获取单例对象,并打印输出。 我们会发现:多例构造方法会运行多次,多次获取的都是不同的对象。 每次从容器中调用bean时,都会返回一个新的实例,即每次调用getBean()的时候,相当于new了一次bean对象。 二、bean属性的依赖注入 什么是Bean属性的依赖注入? 就可以理解成对一个对象的属性赋值,这个我们昨天就接触过,其有两种注入方式: 1构造器参数注入 constructor-arg ①创建Car类,定义构造方法 既然是通过构造器参数注入,那肯定需要有参构造方法,其中为了方便测试时观看,还在该类中重写一个toString方法。 ②spring配置构造器参数 constructor-arg:该标签相当于在告诉spring容器,要调用有参构造方法了,不再调用默认的构造方法了。 所以必须要有有参构造方法,不然会报错。 index:根据索引定位属性,0表示首位。 name:根据属性参数名称定位属性。 type:根据属性数据类型定位属性。 value:简单的值,字符串。 ref:复杂的值,就是通过该属性可以引用由spring容器创建的其它bean对象。 一般都是使用name属性赋值,这样最合理,也一目了然,name和type这两种都不靠谱。 配置完成,做一个测试 根据运行结果我们能发现,通过spring的配置,可以给对象初始化赋值。 也就相当于new Car(1,"长安",20000)。 通过spring就不需要我们自己new了。 2setXXX方法属性注入 和上述构造器参数注入的效果是差不多的,只不过setXXX方法更具有选择性。 构造器参数注入有几个参数都得设置,少一个都不行,而该方法想设置哪个就设置哪个。 ①创建Person类,定义setXXX方法 使用Lombok插件可以快速创建一个Javabean,这个插件文章最后有说明。 ②spring配置setXXX方法参数 property标签:spring中专门进行setXXX属性注入的标签 。 name:setXXX方法的属性名字,例如setXXX()那么name的属性值为XXX。 value:简单的值。 ref:复杂的值,引用由spring容器创建的其它bean对象的名字。 配置完成,做一个测试 根据运行结果我们能发现,通过spring的setXXX方法属性注入,也可以给对象赋值。 该方法也就相当于通过对象调用方法setId(1),setName(“刘小爱”)… 三、p名称空间和spEL表达式 为简化XML文件的配置,Spring2.5版本开始引入了一个新的p名称空间。 准确地说,它的作用是为了简化setXXX方法属性依赖注入配置的,使用方式如下图: 在配置文件表头,引入p名称空间。 可以将property标签直接作为属性使用。 如果是引用简单对象,直接用属性名说明即可,比如p:id,p:name。 如果是引用复杂对象,需要用ref来补充说明,比如p:car-ref。 通过上图,我们能发现p名称空间能进一步地简化了代码的编写。 2spEL表达式 spEL全称Spring Expression Language,一种表达式语言,和前面学的EL表达式很像。 语法:#{…} ,通过该表达式可以引用属性、另一个Bean、甚至运算,方法都可以。 spEL表达式的使用功能比较多,Bean操作相关的通常有: #{bean的Id} 引用Bean,比如#{car}。 #{bean的Id.属性} 引用Bean的属性,比如#{person1.name}。 #{bean的Id.方法(参数)} 调用Bean的方法 附:补充一个Lombok插件 在idea开发工具中,选择File-settings,找到Plugins,在搜索框中搜索lombok。 如果以前没使用过该插件,右侧下载即可。 插件下载好后,还需要导入依赖才能使用。 在maven网站中找到lombok,随便选择一个版本,将依赖复制到我们项目对应的pom文件中即可。 依赖导入完毕,就可以使用该插件了。 它有什么用呢? 我们以前创建一个标准的JavaBean,有构造方法,有getset方法,有toString方法,一下子要写很多方法。 但是现在有了lombok插件后,只需要在类上加一个注释@Data,这些方法就都不用写了。 最后 谢谢你的观看。 如果可以的话,麻烦帮忙点个赞,谢谢你。 本文分享自微信公众号 - 刘小爱(liuxiaoai946)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册