分布式应用程序开发.docx_第1页
分布式应用程序开发.docx_第2页
分布式应用程序开发.docx_第3页
分布式应用程序开发.docx_第4页
分布式应用程序开发.docx_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大型Java分布式应用纵横谈在当今应用架构里,分布式应用与服务之间的通信都是核心思想。想要从分布式应用与服务中获益,你必须牢牢记住几条基本的原则,否则你可能很容易遇到性能和扩展性问题。在开发阶段这些问题不会经常出现,但当你进行负载测试或产品化的时候,你会意识到你选择的软件架构不能满足性能和扩展性需求。在这篇文章中,我们重点关注构建分布式应用需要记住的一些关键点。分布式需要应用之间进行交互。范围包括从大规模集群架构上简单的点到点的交互,到动态的面向服务或基于服务的架构。跨系统边界的通信也是提高软件系统扩展性和可用性的关键。如今软件架构已把分布式作为一个核心的必要的概念。Java平台成为了核心角色,因为它的分布式、有很好的API和产品支持这些特点。应用场景从像SAP这样在标准软件上的系统集成,到内部或外部的服务集成。SOA提供这样的方法,使服务和应用变的灵活和可重用,可以对新的市场需求很快的做响应。另外,像使用网格计算,虚拟机和多核刀片机的趋势,导致越来越多的集群应用的出现。这主要是由于追求高可扩展性和高可用性驱动的。而且云计算的发展趋势表明,分布式平台将来会更加流行。另外,系统正变得希望能更动态的增加其灵活性。例如,在运行时添加应用节点。这些趋势也导致了系统结构变得越来越复杂。对于开发人员,则更难理解产品中服务调用是如何实现的。这种复杂性和缺乏对相应知识的了解,很容易导致资源消耗的增加(CPU,内存,网络)和性能的降低。如今,远程技术使分布式应用的实现更加简单。底层通信的细节和服务端和客户端的基础结构对开发人员是透明的。现在,如果要把一个Java类暴露为一个服务,有时只需要简单的加一个注解到这个类上。服务也可以被工具生成的代理很容易的访问。如下图所示,但是,这仅仅是冰山的一角。图1.远程协议的上层架构远程堆栈的核心块是对象的序列化和传输的格式化。通常,应用的开发者不需要知道这些。但是,这也是很多性能问题产生的原因。效率不高的序列化意味着,通过网络传输了很多不需要的数据。复杂对象的显示和大量的数据,在序列化和反序列化期间,导致CPU和内存的使用会很高。底层的基础架构和它的配置对应用的性能有很大的影响。在客户端,主要是连接的管理和底层线程模型。在分布式应用中使用连接的指导方针和数据库的连接很像。建立一个连接需要一定的时间。但这同样要看是什么协议。例如,建立一个HTTPS的连接的开销要大于一个简单的TCP/IP连接。同时连接又是系统很重要的资源。所以使用连接池很重要。正确的配置在这里也很关键,因为错误的配置文件给我们带来的坏处要多于好处。线程的模型涉及到请求如何被处理。重要的是请求是被同步还是异步处理。同步通信阻塞一个进程直到收到相应。在异步通信中,当收到响应时会调用一个回调。这就允许这个线程被其他事务使用。在服务端,可用的工作线程数量就是定义的并行处理的最大服务请求数。网络本身也是分布式应用的一个重要组件。网络是比影响性能更加限制其可扩展性的重要的瓶颈资源。这块通常在开发时会被忽视,因为没有调用实际的网络。远程调用之美在于.这有很多可以选择,Java提供了非常多的可能性和技术来实现分布式应用。远程技术的选择对应用的架构、性能和扩展性有十分重要的影响。最“老的”的但是几乎是用的最广的远程协议是RMI(如下图)。图2.RMI架构RMI是J2EE应用的一个标准协议,设计时就是为了调用远程Java虚拟主机上的对象提供的方法。对象在服务端被暴露出来,这时客户端就可以通过代理调用这个对象。同样的服务端对象被多个线程使用。线程池被RMI基础设施管理。通信通过TCP/IP被处理,并且使用JRMP或针对RMI的基于IIOP GIOP(CORBA协议)的协议。应用服务端也提供自己的属性协议来优化其性能。如服务端的引用需要管理一样,RMI基础设施也提供了垃圾回收器来管理引用。这个分布式垃圾回收器(DGC)本身也使用RMI协议来管理服务器端的对象生命周期。除了客户端和服务端很强大,RMI还有一些其他的实现。关于RMI的详细介绍及应用请参考51CTO之前的文章用RMI实现基于Java的分布式计算。RMI只支持同步通信,缺点上面已经讨论过了。另外,不能为数据驱动的服务提供低级缓存,因为它是基于2进制协议的。开发人员和系统架构能够改变基础设施的配置参数来优化性能。JMS是J2EE平台上使用的第二多的协议。如下图:图3.JMS架构图有别于RMI, JMS是一个异步协议。通信是基于队列的,以便监听器可以对消息作出反应。JMS不是一种标准的远程调用协议,但是它仍然能够满足服务与服务之间的交互。在SOA中非常重要的很多ESB的实现,就采用基于JMS的中间件来进行服务之间的信息传递。由于JMS是异步的,一些典型的同步问题就可以避免。在很多系统中,高可扩展性的关键在于能够很快的释放资源(像线程)。在很多情况下,异步处理是唯一合适的方法。JMS提供很多不同的传输格式。XML是最通用的消息格式,但二进制格式也是可能的。消息结构的设计是应用架构的一个重要部分,因为它可以直接影响到应用的性能和可扩展性。基于SOAP的WEB Service(如下图)和其他相关的WS-*也在Java 企业应用领域中变得越来越重要。图4.同步和异步SOAP架构设计SOAP是为了替换CORBA,而且一开始就得到了业界的强烈支持。因为WS-I之间的共同努力,不同平台差不多能够很容易的连接起来。SOAP是一种基于XML的RPC协议,所以很容易和浪费带宽联系到一起。越来越多的基于REST的服务开始取代SOAP。Java中的REST服务在JSR 311中有说明,是基于HTTP所支持的基本操作而设计的。但是,REST不是作为RCP协议,而是面向资源的,为了访问和操作(web)资源而设计的。这两个协议都支持同步通信。这也是底层HTTP协议所要求的。WS-地址对SOAP协议进行扩展,所以它也允许异步服务的实现。REST最大的优点是,能够很容易的通过HTTP代理实现缓存。REST依靠使用HTTP底层协议,无论如何都和用的机制。可能犯的错分布式应用的很多地方都可能出现潜在的问题,如图所示:图5 分布式应用的问题起因在客户端,主要的问题在于糟糕的交互设计-太多的服务调用,或者选择了错误的通信模式。同步事务运行时间过长很容易导致性能问题。在通信层,大量的数据和过多的服务调用所产生的高的网络负载是主要问题。在服务端,不适当的服务接口设计和不合适的序列化策略的使用导致性能和扩展性问题。我们下面仔细看下这些问题。分布式应用的问题起因通信协议的正确选择主要取决于系统的整体架构和底层的需求。如果你工作在有mainframe、Java和.NET组件相互交互的特异环境中,用SOAP是行不通的。在纯Java环境中,在JRMP上使用RMI仍是性能最优,可扩展性最好的解决方案,你能够获得开箱即用的编程支持。在很多SOA实现中,SOA和基于Web Service的实现同义而语。所以有越来越多的使用SOAP作为RPC协议的纯Java应用案例出现,尽管采用这样的方法一点有点都没有。调查显示,和RMI-JRMP相比,经常使用SOAP还是有意义的。除了描述过的标准协议,一些其他的基于XML的和二进制协议也在一些应用中使用。Hessian的性能就不错。另外,还有一些其他编程语言的实现。例如使用Spring把POJOs暴露给远程调用使不改变实现就在不同的协议间切换变得相对容易。Spring 支持RMI, HTTP, Hessian, Burlap, JAX-RPC, JAX-WS 和 JMS。反模式:饶舌的应用在搭建分布式应用时,一个核心的原则就是尽量减少远程调用。这些意味着数据序列化的开销,建立连接的开销和附件的网络负载。另外,CPU,内存和网络资源的消耗限制了可扩展性。所以,为远程应用的接口设计一种方法,来确保必要的服务交互数最小是十分重要的。尤其是那些起初是在本地搭建的,然后为了可扩展性原因遭遇了大量服务交互的应用。这些问题大多会在负载测试或产品化时出现,但当本地开发测试时一点问题都没有。可以采用适当的性能管理方法,在开发过程中分析远程行为就可以避免这些问题。下图显示的是一个通过dynaTrace分析一个应用的远程行为的例子 。基于这个分析,接口能够重新创建,应用逻辑能够重新设计来减少远程调用的次数。可能的方法是,合并几个方法的逻辑为一个,或在几个调用请求周边的对象处,使用数据容器。特定数据的位置也可以帮助减少远程调用,因为在需要的地方数据是可用的。尤其当读数据时,使用cache可以很大程度上提高性能和可扩展性。在软件设计的早期,服务的分发和可能的通信在成为需求或将成为需求时已经考虑到是很重要的。反模式:大格式消息当调用远程的服务时,这通常意味着数据会在不同的协议上传输。像XML在SOAP协议上传输或二进制数据在RMI协议上传输。大多数技术传输对象的数据或对象本身。大多数情况下,序列化的发生是在远程实现的底层。序列化的开销和所传输对象的大小相对应。在实际情况下,我们进行序列化的开销要占到98%。怎么会这样?一个鉴权服务接口需要一个用户对象来授权。这个用户对象不仅有用户名和密码,还有很多属性,关联到其他用例的数据引用。标准的SOAP序列化要创建几千字节的数据消息。这些数据要被服务解析并映射到用户对象结构上,导致大量CPU和内存的消耗。解决方案再明显不过了。接口要重构,只需要用户ID和密码。所以,除了选择正确的远程技术,消息内容的设计对构建好的性能和可扩展性的应用很重要。通常正好符合设计的很好一般对象会带来高性能的回报。反模式:分布部署分布式的Java企业级应用会导致一个应用分割成多个服务和一些部署单元部署到一些应用服务上。分布式的有一个组件新的部署包不需要重新部署到其他组件上。另一个可能性是,大量使用的服务能够部署到独立的硬件或被部署多次。有大量部署单元的复杂应用,服务的交互变得越来越难理解。这会导致2个交互频繁的服务被部署到不同的硬件上从而产生很多的远程调用情况出现。在大规模应用中,分析交互的频率和数据大小与部署结构一致是很重要的。很多时候,从分布式部署到本地可以使性能得到很大的提升而不需要损失灵活性和可扩展性。尤其对那些无状态的服务,把它们部署到不同的节点来提升其本地性。结论从这些反模式中可以看出,在应用的设计初期阶段就考虑可扩展性是很重要的。它是应用架构的一个关键驱动。在后期提高性能和可扩张性在多数或大多数情况下工作会越困难。对应用产品的详细分析来识别远程调用的频率或大体积数据,优化系统的一致性是不可或缺的。如果你遇到了相似的或不同的问题,请让我知道,我好扩充我的反模式记录。分布式系统的数据复制技术一个中型或大型公司往往由地理上分散的部门所组成,这些部门通常需要进行数据共享。针对这些共享数据,可以将其存储在某个站点上,需要的用户都从这个站点上存取。这种方案的优点是数据的一致性容易保证,但其缺点也是很突出的,那就是该站点的负载大、网络负载大,远程用户的数据响应迟缓。数据复制技术可以有效地解决这个问题,它通过将这些共享数据复制到位于不同地点的多个数据库中,从而实现数据的本地访问,减少了网络负荷,并提高了数据访问的性能,而且通过对数据库中的数据定期同步(通常是每天晚上),从而确保了所有的用户使用同样的、最新的数据。该技术适用于用户数量较大、地理分布较广、而且需要实时地访问相同数据的应用模式。 数据复制的概念及特点 1、数据复制的概念及分类 数据复制,就是将数据库中的数据拷贝到另外一个或多个不同的物理站点上,从而保持源数据库与目标数据库中指定数据的一致性。 按照数据复制的实时性,数据复制可分为同步数据复制和异步数据复制。同步数据复制是指将本地生产数据以完全同步的方式复制到异地,每一本地IO交易均需等待远程复制的完成方予以释放。异步数据复制则是指将本地的所生产的数据以后台同步的方式复制到异地,每一本地IO交易均正常释放,无需等待远程复制的完成。同步复制实时性强,远端数据与本地数据完全同步。但这种方式受带宽影响较大,数据传输距离较短。异步复制不影响本地交易,传输距离长,但其数据比本地数据略有延迟。异步复制环境中,对于所有应用最关键的就是要确保数据的一致性。 按照复制站点的类型,数据复制可分为多主控站点复制、物化视图复制及混合复制。多主控站点复制也称为对等站点复制,其中每个站点都是主控站点,都需要与其他站点进行信息交流,各站点之间是平等的。物化视图复制包含一个主控站点、一个或多个物化视图站点, 物化视图中的内容可以为目标主对象在某个时间点的全部拷贝或部分拷贝,其中目标主对象既可以是主控站点上的表也可以是物化视图站点上的主物化视图。混合复制包含多个主控站点和多个物化视图站点,是主控站点复制和物化视图复制的结合体,适合于复杂的业务情况。 2、数据复制的特点 数据复制通过在多个站点上建立备份,能够提高数据的安全性,同时也提高了数据的可用性,这是因为如果一个站点出现了问题,用户可以选择其他站点继续进行操作,应用系统还可继续运行,因此数据复制提供了容错保护机制。 数据复制最基本的功能是提高数据库的性能。它通过将远程数据库中的数据复制到本地,使得应用能够就近访问数据,从而降低网络传输负载,提高效率。而且在数据复制系统中,可以提供多个站点之间的负载平衡,让这几个用户使用这个服务器,另外几个用户可以使用其他的服务器,以避免某些站点负载过重。 物化视图还提供了按子集进行复制,这样各站点就可只复制自己需要的数据,也能减轻网络的传输量。 数据复制的实现方法 在具体的实现之前,首先要做好设计与规划。这就需要细致分析具体的业务情况,设计出一套能够满足业务需要的方案。通常在设计过程中,需要确定出要建立的数据库站点,各站点的类型,需要复制的数据对象,以及同步方式、冲突解决方案等内容。在设计完成之后,就可具体来实现数据复制,实现主要包括以下几步: (1)创建复制站点 (2)创建组对象 (3)配置冲突解决方案 下面我们举一个例子来说明各步具体需要完成的工作。在这个例子中我们采用多主控站点复制方式,设有两个主控站点和两个共享数据表。两个主控站点分别为:处理站点(cl.world)和解释站点(js.wo rld);两个数据表为测区( survey)和测线( line)。 STEP1 创建复制站点 (1)首先以SYSTEM身份登陆主站点数据库cl.worldCONNECT system/managercl.world (2)创建用户复制管理员,并为该用户授权复制管理员负责复制站点的创建和管理,每个复制站点都必须创建复制管理员: CREATE USER repadmin IDENTIFIED BY repadmin; BEGIN DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username = repadmin); END; (3)为本站点指定传播者 传播者负责将本地最新更新的数据传播到其他站点上: BEGIN DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username = repadmin); END; (4)为本站点指定接收者 接收者负责接收其他站点上的传播者传送过来的数据: BEGIN DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP ( username = repadmin, privilege_type = receiver, list_of_gnames = NULL); END; (5)确定清除时间 为了使传送过来事务队列不致过大,需要将成功加载的事务从事物队列里清除掉,这里设定每小时清除一次。 CONNECT repadmin/repadmincl.world BEGIN DBMS_DEFER_SYS.SCHEDULE_PURGE ( next_date = SYSDATE, interval = SYSDATE + 1/24, delay_seconds = 0); END; 在建立好站点cl.world后,以同样的方法创建站点js. world。 (6)创建各主控站点之间的调度链接 创建各主控站点之间的调度链接需要先在各主控站点间建立数据库链接,之后为每个数据库链接定义调度时间。 首先,在处理站点上建立与解释站点的数据库链接,这里需要先建立一个公用数据库链接,供其他私有数据库链接来使用。 CONNECT SYSTEM/MANAGERcl.world CREATE PUBLIC DATABASE LINK js.world USING js.world; CONNECT repadmin/repadmincl.world CREATE DATABASE LINK js.world CONNECT TO repadmin IDENTIFIED BY repadmin; 同样,在解释站点上建立与处理站点的数据库链接 CONNECT SYSTEM/MANAGERjs.world CREATE PUBLIC DATABASE LINK cl.world USING cl.world; CONNECT repadmin/repadminjs.world CREATE DATABASE LINK cl.world CONNECT TO repadmin IDENTIFIED BY repadmin; 调度链接确定本站点上的事务向其他站点发送的频度,下面的代码为10分钟一次: CONNECT repadmin/repadmincl.world BEGIN DBMS_DEFER_SYS.SCHEDULE_PUSH ( destination = js.world, interval = SYSDATE + (1/144), next_date = SYSDATE, parallelism = 1, execution_seconds = 1500, delay_seconds = 1200); END; 在解释站点上做相同的工作STEP2 创建主控组在复制环境中,Oracle用组来管理复制对象。通过将相关的复制对象放在一个组里,从而方便对大量数据对象的管理。 这里我们假设用户模式integr ation 在处理站点和解释站点都已存在,而且表测区(survey )和测线(line)也已经创建。 (1)创建主控组对象 CONNECT repadmin/repadmincl.world BEGIN DBMS_REPCAT.CREATE_MASTER_REPGROUP ( gname = inte_repg); END; (2)向主控组中添加数据对象,将测区表survey加入到组inte_repg中 BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname = inte_repg, type = TABLE, oname = survey, sname = integration, use_existing_object = TRUE, copy_rows = FALSE); END; 以同样的方法将测线表line 加入到组inte_repg中 (3)在主控组中添加其他参与复制的站点,数据库之间的同步方式在此指定 BEGIN DBMS_REPCAT.ADD_MASTER_DATABASE ( gname = inte_repg, master = js.world, use_existing_objects = TRUE, copy_rows = FALSE, propagation_mode = ASYNCHRONOUS); END; (4)如果可能出现冲突,则需要配置冲突解决方案。冲突解决方案将在后面介绍。 (5)为每个对象生成复制支持 BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname = integration, oname = survey, type = TABLE, min_communication = TRUE); END; 测线表line也一样 (6)重新开始复制 BEGIN DBMS_REPCAT.RESUME_MASTER_ACTIVITY ( gname = inte_repg); END; 以同样的方式设置解释站点。设置成功后,数据复制过程就宣告完毕,库中的数据就可进行复制。 数据复制中冲突的解决方案 在复制环境中,尽管在数据库和应用程序设计过程中,会尽量避免各站点间冲突的发生,但完全避免冲突的可能性还是比较小的,那么一旦冲突发生,就需要一个按照具体业务规则的冲突解决机制,来使得各站点的数据保持一致。 首先需要分析哪些对象容易出现冲突。通常来说,静态的数据变化少,冲突出现的可能性也小;而有些数据变化非常大,冲突出现的可能性也大。确定了冲突易发的对象后,需要确定怎样解决冲突,比如在各站点之间建立优先次序,在数据不一致时,以某个站点上的为准;或以某个站点上最新的修改为准。 Oracle提供了多中冲突解决方案,具体包括:针对更新冲突的方案、针对唯一性冲突的方案、针对删除冲突的方案。除了这些方案以外,用户还可以自定义冲突解决方法。每种方案都有自己的适用情况,那么我们需要根据具体的业务来选择合适的冲突解决方案。 结束语 本文详细介绍了分布式系统Oracle中的数据复制技术,在具体应用中,还有许多比较复杂的问题需要解决,比如主控组中如果包含循环依赖的表或自相关的表时如何处理;如何利用模版机制来创建物化视图站点;如何对数据复制环境进行管理与维护。这些问题需要在实际应用中逐步探索,深入研究。 基于J2EE的分布式数据库拥有地理分散的子公司的企业,地理位置的分散造成了业务数据的分散,总公司与各分公司处于不同的城市或城市中的不同地区,在业务上它们除了处理各自的数据,也需要彼此之间进行数据的交换和处理。笔者论述了使用J2EE技术构建分布式数据库系统的框架模型。 分布式多层体系结构 J2EE(Java2 platform Enterprise Edition)是Sun提出的用于开发和部署三层结构企业级应用的平台,是一整套技术、规范的总称,包括建立企业应用系统的各个方面。使用j2EE技术能够快速建立可伸缩性企业应用系统,其目标是提供一个基于Java语言的服务器应用结构,支持平台独立、可移植、多用户、安全和标准的企业级应用。 J2EE技术的基础就是核心Java或Java 2平台的标准版,J2EE不仅巩固了标准版中的许多优点,如“编写一次到处运行”的特性,方便存取数据库的JDBC API、CORBA技术,以及能够在Internet应用中保护数据的安全模式等;同时还提供了对EJB(Enterprise JavaBeans)、Java ServletsAPI、SP(Java ServerPages)以及XML技术的全面支持。J2EE体系结构如图1所示。 图1:J2EE的体系结构这种体系结构大致可以定义为客户机上的表示层、中间的业务逻辑层和后台的数据逻辑层。客户端可以先向运行在Web Server上的JavaServlet或者JSP发出请求,在JSP中嵌入Java的代码调用运行在EJB Server中的EJB,以实现商业逻辑。 EJB组件是J2EE的核心,它是基于Java RMI、HOP和JNDI技术,可以分为会话Bean、实体Bean和消息驱动Bean。 会话Bean代理客户端对服务器的请求,模拟商务过程,通过调用实体Bean获得数据,实现业务逻辑的处理流程。实体Bean用来模拟商务数据,是一种在数据存储层中的面向对象的一种内存中的视图和一种将数据持久化的功能和对象的封装性结合的机制,它对应多层应用体系结构中的数据存储层l2 J。 已存在的数据库系统映射到EJB结构可以通过BMP(Bean Managed Persistence)或CMP(ContainerManaged Persistent)完成。消息驱动Bean包含面向消息的逻辑,以及调用会话Bean的逻辑。使用EJB可以获得分布式事务管理、安全检查、资源管理和生命周期、持久性、远程访问能力和位置的透明性 。EJB与客户端及相互之间的交互如图2所示。 图2:EJB与客户及相互之间的交互分布式数据库系统,是在逻辑上属于同一系统,但在物理上分散在计算机网络连接的多个场地(节点)的一组数据集。系统强调结点的自治性而不强调系统的集中控制,且系统应保持数据的分布透明性,使应用程序编写时可完全不考虑数据的分布情况。EJB基于RMIIIOP,具有天生的分布性,EJB容器可以为数据操作提供事务支持,所以可以利用EJB实现分布式数据库系统。 下面分析2种常用设计架构存在的缺陷,提出了使用J2EE实现的分布式数据库系统的架构设计,最后给出了一个设计模型。 两种架构设计方式及其缺点 架构设计方案1 图3:架构1如图3所示,每个Web服务器除了调用本地数据库外,还调用远程的数据库,将返回来的数据汇总后返回给客户端。此时逻辑代码分散在多个站点的多个Web服务器中,每个Web服务器的调用关系均不同,且当每增加一个数据库时,所有站点的Web服务器上的代码均要改变,加入对新的数据库的调用支持,造成了代码维护困难、可扩充性差、数据库调用逻辑不清晰,实际上形成了一种网状的调用关系。 例如如果新增一个DB4,DB1到DB3上的代码都要改变,增加访问DB4的代码,以提供对DB4的访问支持。 架构设计方案2 在架构1的基础上取消本地的Web服务器,将所有业务逻辑集中到一个Web服务器上,将会消除的网状调用关系,当增加一个新数据库时只需要更改中间的逻辑,从而提高了系统的可扩充性。架构2如图4所示。 图4:架构2不同的客户端发出访问请求到同一个Web服务器,Web服务器自动区分客户端的来源,按其要求对分布于不同位置的数据源进行访问,汇总结果后返回给用户。 新增一个数据源只需要修改Web服务器上的业务逻辑,但是此时Web将各个分公司的本地数据库与远程数据库同样对待,因为客户端和存放业务逻辑的Web服务器不一定在本地。 当客户仅需要凋用本地数据时,仍然需要访问远程的Web服务器,由Web服务器访问客户的本地数据,再将其返回给本地客户。 链接 数据库技术对数据的收集、存储、处理和传播由集中式走向分布式、从封闭走向开放已在所难免。分布式数据库系统通过复制使系统具有适当的数据冗余,从而增加了系统的可靠性和可用性;提供局部自治的数据共享和场地之问的协调,从而使系统具有快速的数据处理能力。 图5图6链接 调用关系: 客户发出请求; Web服务器查询本地数据库; 本地数据库返回结果; Web服务器将结果格式化后返回给客户端。Java入门系统Java基础知识部分总结1、虽然有很多朋友可能进行了多年的java开发老手,但可能仍旧对某些点缺乏仔细探究。2、去一些公司求职面试或笔试时的技术题目中,也往往会涉及到这里的一些内容。所以,希望下边的这些总结能够对一些学习java或求职的朋友有些许帮助。1、 关于java类中的缺省的构造器如果一个java类没有显式定义没有参数的构造器,将有一个默认缺省的构造器。如果定义了一个有参数的构造器,那么原来的缺省的构造器将不在有效。 publicclassA 此时如果用newA();java编译器将使用缺省的构造器。 publicclassA publicA(inti) 如果此时用 new A(); 将产生一个编译错误,因为此时显式定义了,一个有参数的构造器。2、Java中的类名与文件名1、在一个java文件中可以有多于一个类定义(更常见于某些组件的监听器类),但只能有一个public class定义,且与文件同名。2、如果一个java源文件中没有public类,那么每个类的名字没特殊规则,即不必与文件同名。3、在编译后产生的class文件中,仍旧是多个单独分开的class文件。3、import关键字1、import语句必须定义在所有的class定义之前。2、import语句只是为编译器指明了一个路径,并不像C或C+中的#include,所以用import .*并不影响性能。4、Java中的几个特殊关键字Java中的关键字许多大家都比较熟悉,而有几个就不是很常用,如:1、goto和const是保留关键字,在java中没使用2、strictfp和volatile不常用; sizeof、zhen不是关键字。3、true,false,null不是严格意义上的关键字,而是literals。5、java方法中的传递值参在Java方法中传递参数,对于基本类型来讲传递的是值参数,相当于建立的一个参数的拷贝,不影响原来变量的值。在引用方法中可以改变传递对象的内容,但对象引用(像A5d87b2)从来不会改变。publicclasstt publicstaticvoidmain(Stringargs) Aaa=newA(); aa.num=5; ttt=newtt(); System.out.println(11aa=+aa+num=+aa.num); t.test(aa); System.out.println(22aa=+aa+num=+aa.num); voidtest(Aa) Aab=newA(); a=ab; System.out.println(33ab=+ab+num=+ab.num); classA intnum; 6、变量初始化java中的变量在使用之前必须被初始化,当创建一个对象的时候一些类的变量会自动初始化并赋予缺省值。数字类赋值0;char类型赋值u0000; boolean类型赋值false;引用对象赋值null;注意的是在方法之外的类变量的值是自动赋初始值,而方法内的局部变量必须手工初始化。 classAA intnum; voidtest() intj; j=5;/没有这一行则编译不会通过。 j=j+num; 7、switch语句这个点经常在求职笔试题目中出现。default放在最上边编译没问题;碰到符合分支的,如果没有break会一直向下运行。 publicclasstt publicstaticvoidmain(Stringargs) ttt=newtt(); t.test(2);/可改变成3运行一下看一下结果 voidtest(inti) switch(i) default: System.out.println(default); case1: System.out.println(111); break; case2: System.out.println(222); break; 8、关于java中的label使用 ?breaklabel ?continuelbele ?lable:statement;/这里的statement必须是一个loop循环 publicclasstt publicstaticvoidmain(Stringargs) ttt=newtt(); t.test(); voidtest() System.out.println(0000); lb1:for(inti=0;i10;i+) lb2:for(intj=0;j2;j+) if(i=2)continuelb1; System.out.println(i=+i+j=+j); System.out.println(111111); 9、类型转换校正 classEmployee | classManager向上校正,总是允许的,Manager直接使用父类Employee的方法。向下校正,必须用instanceof检验,才能将一个Employee转换为Manager对象。 publicvoidtest(Employeee) if(einstanceofManager) Managerm=(Mnager)e; . 10、方法重载(overloading)、方法覆盖(overriding)方法重载(overloading)一定要求名字相同,参数不同,返回类型可以相同也可以不同 classA voidtest(inti) classAAextendsA inttest(inti,intj) return5; 注:方法覆盖(overriding)要求名字,参数,返回类型全部必须相同,访问控制符可以不同,但必须大过父类的。因为如果名字和参数都已经相同了则一定要求返回类型相同,否则认为这是一个新的方法了,名字就必须不同了。 classA voidtest(inti) classAAextendsA publicvoidtest(inti)/若是换成private则编译不通过。 注:关于覆盖方法抛出异常的问题。如A是父类,B是继承A的子类。B中的方法meth()去覆盖父类A的此方法时,B中不能throws出新的异常,只能是父类抛出的异常或其子集。更甚至可以不抛出异常。11、关于类的构造器重载问题 classA publicA(inti) classAAextendsA publicAA() inti=5;/这里出错,没有父构造器 由于父类A自定义了构造器,所以缺省的构造器就丢失了,当子类的构造器自动试图调用父类没参数的构造器时却没有,所以会编译出错。12、关于static关键字总结:1、不能在static修饰的方法中引用this变量,只能引用一些静态变量或方法,或new新的对象(可以定义局部变量)。简言之,静态方法或块中,只能引用静态的方法或变量。2、类中的成员变量(static修饰)有缺省值,而类的定义的方法中的局部变量没有缺省值。3、在类的构造器中,可以引用任何的静态或非静态的变量和方法,可以在非static方法中调用static方法。4、static块中的代码在类装载中仅执行一次。5、在7-7,A static method cannot be overridden but can be hidden. 不理解。6、不能在无论非static方法中或static方法中定义static变量。13、关于final关键字1、不能继承final修饰的类,不能覆盖final修饰的方法。2、final修饰的变量,若没赋值,必须在构造器中赋初始值。 classA finalintj; publicA() j=9;/若没有此行,则编译不通过。 3、final类型的方法参数可定义,但不能改变。 classA voidm(finalinti)/这一行的声明i为一个final没问题。 i+;/但在这里面,i的值不能再被改变。 14、Interface接口关键字1、接口中的变量1、必须初始化其值。2、默认修饰符为public+static+final,其他的修饰符不允许。2、接口中的方法1、默认为public+abstract2、其它修饰符 static,private,protected,final,synchronized,native均不能有。 interfaceA voids(); classAAimplementsA voids()/编译器在这里提示由于接口中的方法s()修饰符默认是public, /而这里的s()默认是protected,小于public所以不允许。 15、abstract抽象关键字 abstractclassA privateinti; privatevoidm(); 抽象类中可以有私有的变量和私有属性,而接口就不行(原因如上),这是因为java是按实例虚拟调用的,在生成某一个具体的对象可以有私有的属性或方法的。 abstractclassA privateinti; privatevoidm(); publicabstractvoidn();/若是private则编译不通过。 抽象类中的抽象方法是让其他类继承的,如果本身都是私有的16、集合类型以有无顺序,允许不允许重复区分Collections: 一组对象,无序集合,允许重复Set:无序集合,不允许重复List:有序集合,允许重复注意:在JDK1.1中定义的集合类型,都是线程安全的,所以都是“重量级”的。像HashTable,Vector而在java2中定义的一些新的集合类型如HashMap, ArrayList不是线程安全的,是“轻量级”的,但速度快,性能好。这一点在许多公司面试试题都见过。17、布局管理器FlowLayout,BorderLayout,GridLayout,CardLayout关于Panel和Frame默认的Layout常在一些公司的面试试题中出现。1、Panel和Applet类默认的布局管理器是FlowLayout 一个一个的加上去2、Frame和window类默认的布局管理器是BorderLayout 按东南西北加入3、xyLayout是Borland公司开发的布局管理器。18、面试试题中Applet部分1、使用代码2、可以覆盖的方法init(),start(),stop(),destory(),paint(g)19、面试试题中线程部分1、基本实现方式两中,继承Thread类和实现Runnable接口2、必须实现父类或接口中的run()方法。3、有关线程方法,start()启动线程。join()指在调用这个线程的方法或进程中,必须等待此线程运行结束才能继续其他进程。4、线程中的同步synchronized,注意死锁。20、对象串行化1、仅仅对象类型的数据可以串行化。2、标记为transient的数据不可以串行化。存储一个对象到某种永久性存储叫persistence,如存储到磁盘、磁带或别的机器的内存中。java.io.Serializable接口没有定义方法要实现,仅仅是一个标记暗示实现了这个接口的类可以被考虑串行化。没有实现这个接口的对象不能保存或存储它们的状态。当一个对象被串行化的时候,仅仅数据被保留,而方法和构造器不是串行化的部分。一些对象类是不能串行化的因为他们代表的数据是经常变化的。如java.io.FileInputSream和java.langThread。如果串行化的对象包含了不可串行化的对象,整个串行化动作会失败,并抛出NotSerializableException。21、java中的网络通讯一般的TCP/IP网络数据通信主要可分2种,TCP和UDPTCP:TCP是面向连接的通信协议,就像打电话,先要拨通建立连接,传送的数据不会丢失。java提供了ServerSocket和socket类。在server端,建立一个serverSocket,并指定端口,并侦听连接。服务器端代码 ServerSocketsc=newServerSocket(1111); Socketsocket1=sc.accept(); DataInputStreams_in=newDa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论