继承的本质
继承的初衷是复用。即已经有一个原始的类,希望在保留原始类的所有属性和方法的前提下,进行扩展或修改,以最大限度地降低开发成本。JavaScript实现继承,也是源自这个思想,即想办法让新的引用类型能够访问别的引用类型的所有属性和函数。
左手代码,右手年华
数据库并发处理是一个非常重要的问题,其实现本质上同应用程序一级的并发控制原理是一致的,也是通过加锁解决。而事务隔离级别相当于一段独立的代码块,具有原子性、一致性、隔离性、持久性4个特征。本来想自己写一篇总结,但看到有一篇文章总结得非常好,就直接转载过来。
以下内容转载自:宋杰的站点 » 【转载】数据库事务隔离级别和锁实现机制
原文的版式我修改了一下,有些跟核心内容无关的我删去了,某一两处内容我觉得不对的在后面加了备注。
写过后台的都知道,在操作数据库之前,先要获得数据库连接,然后用数据库连接去进行数据库的增删改查等操作。建立连接和销毁连接都是一笔很大的性能开销,因此产生了连接池的技术。连接池与线程池一样,都是一种资源池,专门用于处理共享资源的。它可以维护一定数量的连接不销毁,当有连接申请时,从池中取出供客户使用;使用完毕则释放归还池中;当池中连接的数量不足时,还可以创建一部分连接。
目前有很多连接池框架,使用这些框架非常简单,最主要就是对一些参数进行配置。这些参数包括最大连接数,最小连接数等,参数取值不同,对应用的性能与稳定性会造成不同的影响。下面我就以Tomcat自带的DHCP数据库连接池为例,通过对一个微博Web系统的同一条微博进行并发的疯狂评论操作作压力测试,去看看数据库连接池的参数配置对系统会产生什么样的影响。相信通过下面的压力测试分析,读者们可以体会到上述使用连接池的优点,同时也可以结合上一讲对压力测试的介绍,加深对压力测试的理解,了解到压力测试在系统优化中起到什么样的作用。
当我们开发完一个Web系统,实现了需求中的所有功能,此时还不能马上将其上线。我们必须对这个系统进行充分的,全面的测试,最大程度地确保它不会出错。压力测试就是这些测试的一种。压力测试的目的是为系统模拟一个现实的访问场景,建立一堆线程去并发地访问系统,了解这个Web系统能支持多大的并发量,或者说支持多少用户同时在线而不会崩溃。我们通过调整并发的线程数,访问时间等参数,去了解在一定的硬件配置下,我们的系统能支持多少线程在多少时间内同时访问。在确定了这些测试数据以后,我们便对这个Web系统的性能有一个比较客观全面的了解,从而可以更好地寻求优化的方案。
JMeter是用java实现的开源的压力测试工具,功能强大,使用简单,在压力测试中占据极其重要的地位。这一讲就以JMeter对一个简单的微博系统进行压力测试的实例入手,介绍一下JMeter最基本的一些知识,看看JMeter是怎么对HTTP request进行测试的。虽然是以实例的形式去介绍,但涉及的都是JMeter最基本的内容,更深入的学习还需不断参考JMeter官方文档。
ORM,即Object Relation Mapping,对象关系映射。我们一般用数据库作数据的持久化存储,通过针对表,属性等进行各种sql的操作,来进行增删改查。但作为程序员,在面向对象思想大行其道的今天,我们更倾向于处理对象,而不是直接处理数据库里面的关系表。我们希望在程序的业务逻辑中,一切皆是对象,而不是表与表的关系,表之间的属性。于是一套从表到对象的映射技术,便应运而生。目前,很多框架都可以实现从关系型数据库到对象的映射,例如Hibernate,EclipseLink等。只需要编写一些配置文件,便可以轻松实现。
由于市面上有很多框架都可以实现ORM,我们使用不同的框架,就需要一套不一样的配置文件,一套不一样的代码。换言之,我们的工程与这些框架是紧耦合的。如果我们想更换这些框架,那么改动就非常大了。JPA就实现了一套统一的接口标准,让我们可以自由选择不同供应商的不同ORM框架,实现与这些第三方框架的解耦合。并且,JPA广泛使用注解,代码简单,开发十分方便。
前面我们提到RESTful API使用JAX-RS实现的。RESTful API与JPA没有直接的关系,但我们知道通过RESTful API我们实际上是把对对象的增删改查映射到HTTP方法上。而JPA相当于是处理下一层的工作,把对数据库表的增删改查映射到对象上。这样,经过JAX-RS到JPA再到数据库这么三层的处理,我们便可以利用RESTful API来实现我们的业务逻辑。