诊断应用数据库的性能瓶颈_第1页
诊断应用数据库的性能瓶颈_第2页
诊断应用数据库的性能瓶颈_第3页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、诊断应用数据库的性能瓶颈时间:2004-07-22文章工具作者:,?Q?浏览次数: 匸厂13137本文关键字:,?,?,?,?,?J2EE的崛起J2EE作为Web应用开发的标准企业计算平台面世,其实力越来越强大,日益普及。J2EE支持遗留应用程序和接口、多种操作系统、分布式和群集式环境,以及高量关键任务应用程序,同时支持安全和管理与监控。通过提供一种开发分布式、可伸缩应用程序的框架和蓝图,J2EE使公司及其开发者能够集中注意力去编写模块化的定制应用程序代码,并且不必担心安全、资源管理和可伸缩性的细节。行业领先的应用程序服务器,例如BEA WebLogic Server ,能提供许多功能和服务。

2、多个 WebLogic服务器实例的群集和故障恢复功能提供了可靠性、可用性和可伸缩性。它们也提供诸如安全和资源管理之类的其他服务,例如执行线程池、EJB高速缓存和JDBC池。第三方所写的 Java数据库连接(Java Database Connectivity ,JDBC )驱动 程序进一步抽象和简化不同数据库管理系统(DBMS )间数据存取的编码。这就是一个强大的平台,该平台能够大大简化并且抽象开发分布式、高量企业应用程序的低层细节。J2EE性能的挑战听上去没有什么会岀问题,是吗?的确如此,除了应用程序不能达到最终用户或者服务级协定所要求的性能标准之外。一个开发项目和商业创新是否成功要视其迅速

3、检测、诊断和解决这些性能问题的能力而定。由于它们的复杂性日益增加,与早期的僵硬应用程序环境相比,在这些多层的、分布式J2EE应用程序中的性能瓶颈更难以诊断。J2EE环境包含多层相互连接的软件和硬件组件,它们相互作用,满足任何既定的最终用户请求。 性能团队的成员一一设计师、开发者、应用服务器管理员和数据库专家一一他们有自己对系统的见解,而且可能拥有他们自己的经验仓库或者设备中心”的诊断工具。但是这个团队的成员怎样一同工作将问题分离岀来呢?如果没有对J2EE系统所有组件的全面广泛的了解,如果他们不能相互交互,那么一位性能专家怎样找岀哪台服务器速度慢?哪 个组件速度慢?哪种资源不足?数据库引擎是主要

4、瓶颈,还仅仅是一个次要因素呢?这种挑战可能会使无准备的人或装备不良的人畏缩不前。这种困惑可能使团队的成员焦头烂额,或者更严重时,他们会任意指责过失。是应用程序,还是数据库?”公司里最常见的挫折就是面对表现不佳的分布式J2EE应用程序感到困惑:它是应用程序,还是数据库?我们应 该从哪里开始修理? ”通常情况下,会有人斗胆作岀一种推测,不再继续在浩繁的代码寻找错误的或者低效率的算法, 或者放弃彻底搜寻 SQL 语句和数据库表格的作法。换句话说,他们挑出应用程序或者数据库(或者在最坏情况下, 两个都选),并努力将从谜团中分离出来的片断最优化。令人遗憾的是,这种解决问题的观点经常是过度简化的,这是因为

5、应用程序、数据库、 WebLogic Server 都不是 在孤立地运转。 对这个问题的一种综合解决方法需要提高对这个相互联系的系统内所有三个部分的能见度: WebLogic 资源利用和配置、应用程序架构以及数据库查询的执行,而且包括基本的硬件基础设施性能。有了对这些子系统相互作用的了解,性能团队的成员就能有效地分离有问题的组件,并将问题交给正确的职能专 家进行处理。对相互之间关系的了解是关键在此,了解和相互关系是两个关键词。没有这两个关键词,检测和根除的要求就使诊断极其艰难。我们需要了解 WebLogic 服务器运行时 JMX 的性能度量。我们需要了解 SQL 查询的计时和结构,以及数据库引

6、 擎所运行的存储过程。而且最重要的是,我们需要了解最终用户发出的请求在跨越整个分布式系统时的端到端计时, 而且所有的组件要与 JDBC 连接池交互, DBMS 的调用要以显式的基于单个请求的方式来制定。我们不仅需要了解方法层级的应用程序计时, 而且需要了解每个组件与其他组件相互作用形成应用程序架构的方 式。大多数 J2EE 性能监视工具所提供的分离度量方法和 JDBC 计时都脱离了应用程序架构,所以几乎是没有用的。 分离的 SQL 语句执行响应次数也是如此,脱离了该语句产生的位置、被调用的次数或者与其最终用户请求的数据库 的相互作用,几乎也是没有用的。理想的工具解决方案对定制的 J2EE 应用

7、程序与 WebLogic 服务器资源和 DBMS 相互作用的方法提供深入的洞 察,并提供对这些相互作用怎样影响每个最终用户事务的总响应时间的深入理解。这些相互作用的高级表现概述如图 1。典型的应用数据库性能瓶颈现在或许你正在想: “现在理论知识足够了,我怎样修复我的应用程序呢? ”下面的章节将讨论性能瓶颈的三个主 要类型,它们是通过测量和分析许多现实世界的 J2EE 应用程序的性能后提炼出来的,包括几个卓越的金融、电信、 以及“财富 100强”制造业公司的 J2EE 系统。这绝不意味着它是一个毫无遗漏的列表,或者是一个可以用来调优任何 应用程序的、一步一步遵循的 “调试清单 ”。由于分布式的本

8、质和错综复杂的架构,每个 J2EE 应用程序都有它自己的 独特的性能特点,但是也有一些需要避免的共同的缺陷。下面我将介绍应用数据库的三种性能,其中具体的示例是通过运行 BEA PetStore 示范应用程序收集的,并且采 用 Quest Software 的 PerformaSure 收集和分析性能数据。过量的数据库调用“客户”端数据处理和结果集的卷动到目前为止,在 J2EE 数据库应用程序中最严重的性能瓶颈来自从用户应用程序对数据库引擎的过量调用。这些 不必要的额外调用不一定是 SQL 查询的 Execute() 或 Update() ,但几乎总是跟与数据库的其他交互有关,例如ResultS

9、et 操作。一个常见的错误是指定了过于精确的查询条件,然后使用 ResultSet.Next() 详细地搜寻返回的数据, 每次一行。这种作法会使应用程序的性能由 DBMS 内的数据集来决定 对于大的表格来说,搜寻量可能是巨大的; 我曾见过客户站点的数据所执行的每个 SQL 查询都向 ResultSet.Next() 发出了超过 50,000 个调用指令。如果有些数据处理必须在应用程序代码内进行,应考虑从 DBMS 大批取得所要求的数据,避免让应用程序反复 回调数据库,从数据集里取回每一记录。例 1 :过量的结果集卷动图2显示:当PetStore 应用程序内的 “commitorder ” HT

10、TP请求执行servlet、SP和EJB代码,并最终调用DBMS 的 SQL 语句时,该请求的 PerformaSure 重建。右边彩色编码的标尺表明哪个方法执行迅速(冷蓝色),以及哪个方 法是昂贵的热点方法(火红色)。右边的工具提示提供了请求的全部计时和调用数。显然,在右边的数据库节点是一 个热点,并且需要更进一步的调查。通过放大所识别的热点, 我们能看出该事务执行的全部 JDBC 操作的详细计时和调用数, 例如打开一个 JDBC 连 接、“SELECT SQL语句的创建和执行、ResultSet.Next()卷动以及最后还有关闭连接。EJB方法“Getltem被调用了 7次(对应于 7 个

11、 commitorder HTTP 请求),快速运行的 SQL 语句被执行了 7 次,并且在 ResultSet 中移动了 672 次。与执行实际查询相比较,过度地与 DBMS 反复交互反而花费了更多的时间!这不是一种可伸缩的架构 随着DBMS 中的数据集增长,并且随着更多并发的最终用户执行事务,这类性能问题只能会恶化。两个查询而不是一个查询另一个经验法则是将 SQL 查询和更新的设计留给数据库专家, 因为他们对各种各样的表格大纲和索引非常熟悉。 编写 EJB 的开发者往往对他 (或者她)想从数据库引擎获取什么样的数据, 或者需要更新什么样的数据有自己的看法。 困难在于怎样编写执行任务所必需的

12、最少、最有效率的查询和更新。学会只选择在应用程序中真正需要的数据是至关 紧要的。这样,降低了 RDMS 必须执行的处理数量,并且将查询和网络中发送数据的数量极小化。任何基于集合的处理都以 DBMS 实现最有效,而不是通过网络获取并在 WebLogic 服务器 EJB 层的应用程序逻 辑内执行处理最有效。封装应用查询和更新数据的规则及条件的业务逻辑”保存在EJB层,而实际的实施细节最好由数据库引擎来处理。低级的查询处理逻辑,例如为临时表选择初始数据,并基于该数据进行进一步的查询,最好由 DBMS 以存储过程的形式进行处理。数据库连接池问题( JBDC )连接池泄漏当用户应用程序内的一个组件(通常

13、是一个EJB )从一个连接池请求一个连接、查询或者更新某些数据,最后释放连接失败时,就会发生连接池泄漏。虽然通过检查 WebLogic JMX 性能度量( “连接数目”和“等待数目”)以及观察 DataSource.GetConnection() 缓慢的反应时间,能够很简单地检测到一个连接池迅速达到它的最大连接数目,但是很 难在应用程序代码本身内准确指出泄漏的源头。如果存在多个最终用户请求(因此应用程序代码有多个部分),这些 请求从同一个 JDBC 连接池分配连接,这时找出连接池泄漏更加困难:到底哪个请求没有释放连接呢?为了解决这个问题,需要一个工具,它能够基于单个请求明确地映射应用程序与数据

14、源的交互。下面的例子展示了 PetStore 的 “CommitOrder”HTTP 请求分配和释放与数据源连接的过程。例 2 :连接池泄漏图 4 显示了两个 WebLogic JDBC 度量指示连接池泄漏的证据。第一个图显示连接池的连接数目迅速增加到了连 接池的最大数目 400 个连接。在连接池达到最大连接数目的同时,等待连接的请求数量(等待空闲连接的请求数 目)不断增加,这表明可能已经发生了连接泄漏。但是连接泄漏发生在源代码的哪个部分呢?图 5 显示了 “产品 ”请求,并且标识了该请求中两个单独的应用程序代码片分配和释放 JDBC 池的连接。通过对这些区 域的快速分析提供了关于连接池是如何

15、使用的详细信息。在图 5 中我们标识的第二个区域内,我们能立即找出性能问题的根源。在这一时间段内, EJB 共调用 GetProduct()804 次,从而调用 executeQuery()804 次 (工具提示不显示 )。比较 getConnection() 和 Connection.close() 的次数,可以看出:尽管请求 JDBC 连接 1,012 次,但是只释放了 756 次。那些 GetConnection() 调用的红色显示的 信息和计时信息可以明确证实这将引起性能退化。值得注意的是,尽管连接泄漏很容易用度量数据加以检测,但是如 果多个事务或者在同一事务内的多片代码都在同一个 J

16、DBC 池内分配连接, 那么这些泄漏的代码根源不是无法精确识 别,就是难以精确识别。JDBC 连接池的大小一个良好的经验法则是测量执行线程池的大小,乘以每个最终用户事务(线程)使用的并发数据库连接平均数, 再加上 10% 的峰值时期负荷。平均每个事务的连接数通常是一个,无论所需的峰值负荷缓冲区是多大, JDBC 连接池 和执行队列大小都相同。 通过使用大的 JDBC 池运行测试, 并观察在任何给定的执行队列大小前提下所用 JDBC 连接 池的平均值和峰值,可以反复调整该连接池的大小。还应该监控调用 Database.GetConnection() 的时间,以保证没有 花太长的时间来等待 JDB

17、C 资源。在生产系统里使用 JDBC 池时,应牢记的第二点是:要设置最初池大小总是等于最大连接池大小。通过这样做, 在池中创建所有连接的性能开销都将发生在WebLogic Server 启动的过程中,而不是发生在最终用户运行时中。错误组建的数据库查询组建不良的 SQL 语句或者储存过程这个常见问题与早先讨论的 “两个查询而不是一个查询 ”的性能瓶颈有关。在这种情况下,虽然每个最终用户请求 仅仅调用一个 SQL 语句或调用储存过程一次(或者适当的次数),然而仍然需要花费相当多的时间去执行。幸运的 是,很容易用先进的性能工具检测到运行时间长的语句,并且只要确认应用程序与数据库之间有效交互,就可以让

18、数 据库管理员调优不合适的 SQL 语句或者储存过程。关键是拥有一种工具, 通过拆分具有排他性计时信息和调用次数的每个语句所执行的各个JDBC 操作, 单个用户就能够排除是应用程序设计导致了问题。然后,该问题可以交给DBA ,DBA 使用其特有的 DBMS 性能工具进一步深入诊断表架构、索引和锁定。数据库操作的另一个性能问题是:在执行存储过程时或者 Rollback() 完成数据库事务发生错误时抛出的异常。在 我们遇到的几个场景中,对 DBA 而言,能非常迅速地确定这些异常 即能在比较短的时间里完成确定。问题是需 要了解正在调用应用程序代码中的哪些方法、哪些存储过程正在抛出异常,以及筛选合适的

19、信息传送给合适的专家。 例如,当应用程序需要调用 Rollback() 和 Commit() 操作时,前面示例所示的工具提示会提供异常退出信息。没有有效利用语句缓存在应用程序开发期间,当要执行的一个查询的结构已知,但是在运行时将使用不同的参数时,这时最好使用事先 准备好的语句,并在运行时将参数传递给语句。这样可以缓存事先编译好的查询,该查询可以通过 WebLogic 准备好 语句缓存来访问,而不用反复地将其传递给 DBMS 并在 DBMS 中进行反复地编译。默认值是零 在没有用户修改设置时,不缓存任何语句或者数据。为应用程序选择的缓存大小的有效性可以通过比较 WebLogic JMX 性能度量

20、中的 “准备好语句缓存的命中率和非命中率 ”来验证 通常而言,那些高速缓存尺寸 应该等于所有最终用户请求类型中通常执行的查询数目。结束语在一个承认频繁前期测试价值的组织内实行这样的经验法则,能够降低花费在无限 QA 循环上的时间,并且极大 的加快应用程序的准备就绪过程。通过把资源如实地重新组合,使资源能够在硬件架构和期望的最终用户负荷方面密 切反映生产环境的分段运输环境,就可以在引起生产问题和使顾客不满意之前检测到许多性能瓶颈,并加以诊断和解 决。通过部署有效的 J2EE 性能诊断工具,在分段运输和生产环境过程中,实际上能够消除昂贵的猜测方式和部门指 示。一件有效的工具和解决问题的方法能有效的

21、将各类问题分配给合适的专家或其独有的解决方法工具。在任何时间 减少跟踪性能问题的人数将减少解决问题时的挫折、费用和时间,因此也减少了进入市场的时间。结果使性能小组和 最终用户的满意度都提高了。工具条Quest (软件)的 PerformaSure 显示定制 J2EE 应用程序的动态图表映射,并且显示 J2EE 应用程序如何基于每 个最终用户请求使用 WebLogic Server 资源和数据库管理系统。其独特的 Tag-and-Follow 技术能将应用程序的计时 和应用服务器的资源度量联系起来,清楚地标识应用数据库的性能瓶颈,并重建那些跨越分布式 J2EE 系统的端到端 事务的执行路径。Qu

22、est PerformaSure 应用数据库性能瓶颈数据基于每个请求的定制应用程序性能图时间花费和如下调用的数目:获得和释放一个 DBMS 连接。准备 SQL 语句,传递参数。执行语句操纵返回的结果集。提交或者回调一个数据库事务。抛岀异常。WebLogic JMX 资源使用度量JDBC连接池。准备好的语句高速缓存。EJB池+高速缓存。DBMS执行和更新次数SQL语句和存储过程。? 2003 SYS-CON Media, Inc版权所有。?作者简介Peter Chapman是Quest Software的一位产品经理。Peter在软件架构设计和性能调优以及高科技产品管理方面有5年多的从业经验,他

23、主要负责识别市场需要、定义新产品需求、并且制定产品销售策略。Rini Gahir是Quest Software 的J2EE Solutions的产品销售经理。Rini在ERP、电子商务和软件应用销售方面有5年多的从业经验,他主要负责识别市场需要、定义新技术满足用户要求,并且制定产品开发策略。性能测试之协议分析文章出处:51testing作者:朴春龙发布时间:2006-01-18最近在论坛上的一些朋友问脚本方面的问题,比如用 lr的win sock协议录制的脚本遇回放过程中遇到如 下错误Action. c(20): Error : callC onn ect - Can't assig

24、n requested address. Error code : 10049.Action. c(20): Error : Timeout expired while trying to conn ect. Error code : 9017.这里的10049是udp协议错误,是脚本没有和服务器同步,这说明什么问题呢。下边我用一个协议进行分 析,来看看到底是什么问题,smtp协议分析:1.SMTP工作方式有两种情况:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器.2.SMTP是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返

25、回状态的三位数字代码3.SMTP在TCP协议25号端口监听连接请求4. 连接和发送过程:a. 建立TCP连接b. 客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令服务器端正希望以 0K作为响应,表明准备接收c. 客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行服务器端则表示是否愿意为收件人接受邮件d. 协商结束,发送邮件,用命令DATA发送e. 以.表示结束输入内容一起发送出去f. 结束此次发送,用 QUIT命令退出。5. 另外两个命令:VRFY-用于验证给定的用户邮箱是否存在,以及接收关于该用户的详细信息。EXPN-用于扩充邮件列表。6. 邮

26、件路由过程:SMTP服务器基于域名服务 DNS中计划收件人的域名来路由电子邮件。SMTP服务器基于DNS中的MX己录来路由电子邮件,MX己录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。123.4那么上边提到的错误信息,同样的道理,我们要分析一下到底是什么问题,从协议上分析,从系统环境上 分析。解决方法,动态关联1. 用同样的用户操作同样的步骤两次,然后用lr工具wdiff进行脚本对比,找出不同的地方!2. 用lr自动关联3. 手工关联,找到要替换的动态数据进行替换使用LR测试Oracle数据库的方法使用LR测试Oracle数据库的方法一个简单的连接方法,欢迎大家跟贴

27、讨论更多方法详细脚本见附件选择,建立一个 Oracle(2-Tier) 协议的脚本 加入static LRD_INIT_INFO InitInfo = LRD_INIT_INFO_EYECAT; static LRD_DEFAULT_DB_VERSION DBTypeVersion = ? ? ? ? LRD_DBTYPE_NONE, LRD_DBVERSION_NONE;先定义初始化数据库的各种变量 static void FAR *? ? ? OraEnv1; static void FAR *? ? ? OraSvc1; static void FAR *? ? ? OraSrv1; s

28、tatic void FAR *? ? ? OraSes1; static void FAR *? ? ? OraStm1; unsigned long? ? ? ?rownum;初始化数据库部分 lrd_init(&InitInfo, DBTypeVersion); lrd_initialize_db(LRD_DBTYPE_ORACLE, 3, 0); lrd_env_init(LRD_DBTYPE_ORACLE, &OraEnv1, 0, 0); lrd_ora8_handle_alloc(OraEnv1, SVCCTX, &OraSvc1, 0); lrd_ora

29、8_handle_alloc(OraEnv1, SERVER, &OraSrv1, 0); lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes1, 0);连接数据库lrd_server_attach(OraSrv1, " 这里填写数据库的名称 ", -1, 0, 0); lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0);设定数据库密码lrd_ora8_attr_set(OraSes1, USERNAME, "system"

30、, -1, 0); lrd_ora8_attr_set(OraSes1, PASSWORD, " 这里填写密码 ", -1, 0);初始化连接 session lrd_ora8_attr_set_from_handle(OraSvc1, SESSION, OraSes1, 0, 0);开始连接数据库 lrd_session_begin(OraSvc1, OraSes1, 1, 0, 0); lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm1, 0);设定查询语句 lrd_ora8_stmt(OraStm1, " 这里

31、填写查询语句 ", 1, 0, 0);执行查询语句 lrd_ora8_exec(OraSvc1, OraStm1, 0, 0,&rownum, 0, 0, 0, 0, 1);释放连接数据库的各种变量 lrd_handle_free(&OraStm1, 0); lrd_session_end(OraSvc1, OraSes1, 0, 0); lrd_server_detach(OraSrv1, 0, 0);lrd_handle_free(&OraEnv1, 0);性能测试 大批量测试数据的产生我记得前段时间有论坛兄弟问我,性能测试中关于大测试数据产生的问题,因为

32、前段时间比较忙,所以也没有功 夫回答,现在不忙了,可以跟大家讨论讨论这个问题。相比之下,大批量测试数据是针对系统设计的,目前我们公司的软件架构是标准的三层,前台业务操作后,通过 CORBA ,将数据交给 DB 处理,我相信国内目前很多的软件都是这样的,或者少了 CORBA 这一层。在大批量测试数据产生的操作方面有一个逻辑,就是测试针对业务, 我感觉有些朋友在这种测试设计上偏向了硬 件方面的性能,对于业务的数据单项生称我可以举个例子:1. 某种业务,通过某种业务规则的数字输入,通过验证后,请再次输入某种认证数字,最终提交。2. 分析该业务操作顺序, 如果有 ROSE 的顺序图或者时序图那是最好了

33、, 如果没有那就只能看 CODE 了,看 CODE 最关键的是要知道前台取值、两组验证方法和最终数据插入 DB 顺序动作。3. 设计单项业务数据生成程序4. 验证生成程序的数据是否可以被业务正确操作 第一步是个业务操作的顺序,很简单,我相信大家手头都有一堆的功能测试用例,根据这个提取就可以了。 第二步两组验证方法可能是个关键设计点,这将最终影响你的后续生成数据脚本是否正确,比如第一组验证,首 先是在前台做规则验证,然后到 Table_res01 中取数据进行数据是否存在验证,第二组验证先到 Tabl e_res02 中取数据进行数据是否存在验证,然后做该数据的状态位验证,我相信任何系统对输入数

34、据的验证都 要比我举的例子复杂。第三步可以写程序或者使用数据库提供的 Script ,我门这里 ORACLE ,所以使用 ORACLE 的 PL-SQL 就很明朗 了,我提供一个通用的脚本,很简单的:procedure proc_new_createisv_number_status Table_res01.v_number_status % type;- v_status01 Table_res01.v_number_status % type;- v_status02 Table_res01.v_number_status % type;- v_status03 Table_res01.v

35、_number_status % type;- v_begin_id number;-起始位v_loop_number number;-生成序列v_loop_index number;v_region_code Table_res01.region_code % type;-begin状态位描述 01状态位描述 02状态位描述 03状态位描述 04地区标示生成 10001 个数据 地区编码前置标准码,固定v_begin_id := 0;/起始位 0 v_loop_number := 10000;/ v_region_code := '570'/ v_number_status:

36、= '#2305'/ v_loop_in dex := 0;delete from Table_res01 whereres_ number_status= v_n umber_status and regi on _code=v_regi on _code;commit;-事先删除旧数据是个好的习惯while v_loop_in dex < v_loop_n umberloopv_status01 := v_loop_ in dex + v_beg in _id;v_status02 := #| v_status01;v_status03 := # | v_status

37、02 | lpad( to_char( v_loop_i ndex ), 4, '0');in sert into Table_res01 (statusOI, status02, status03 ,n umber_status)values(v_status01, v_status02, v_status03,v_ number_status);in sert into Table_res02 (statusOI, status02, status03 ,n umber_status)values(v_status01, v_status02, v_status03,v_

38、number_status);v_loop_in dex := v_loop_in dex + 1;if mod(v_loop_i ndex, 1000) = 0 the ncommit;end if;end loop;v_loop_in dex := 0;commit;end;这种程序是很简单的,我相信很多人轻易的就可以写岀来,实际上业务数据是很复杂的,所以不断的DEBUG是必需的,值得注意的是,不要在正式的数据库中进行调试,如果必须请记录表的SEQUENCES ,便于数据的清除,当然写个配对的删除脚本也是必需的,这种脚本的编写也是巨大的,因为业务数据的受理成功后会给多个表插值,其中涉及大量

39、的数据交叉,写的时候务必小心。第四步实际上是一个业务验证,严正你写岀的脚本产生的数据能被你的业务正确的接受,正确的执行,很简单,做一遍。如果是性能测试,就要涉及性能测试工具,如果是LR就把数据到岀到TXT,然后加入LR测试数据池。如果是自写程序执行验证,可以直接到数据库取值操作,不过这样跟严整的业务没什么两样,就是多了循环次数控制和结果搜集,很少有人这么做,不过我倒是很希望大家能这样做做,呵呵。写了这么多,请大家再看后给点自己工作中大数据的生成思路和范例脚本,个人提高困难,大家提高容易!由于测试需要使用多个参数来运行脚本,所以做了一个小测试,过程如下:1、?首先从数据库中取得5000条记录,并

40、转换为文本文件。2、?在Vuser中的参数中读入,然后设置每个虚拟用户使用100个参 数。3、?在场景中运行设置了 50个虚拟用户运行脚本,按照最初的设想,正好使用完5000个参数。但是在运行时发现,只能有5个用户成功,其他的用户都提示“insufficient records for param SellerEmail' in table to provide the Vuser with un ique data'。翻译为中文大意是没有足够的参数。刚开始怀疑参数大概有 500个数量的限制。可是跟网上的一些朋友聊过之后,说 并不存在这样的问题。在对比过朋友和我的设置后,发现比

41、较有可能出现问题的是参数所在文件的路径,我的路径是“.Email.dat”,是个相对路径,而朋友那边是绝对路径。当我把路径换为绝对路径时,运行同样的虚拟脚本设置,在场景中运行100个用户,果然成功了。可是思来想去,也不觉得取参数跟相对路径有什么必然的联系,有知道的朋友请联系我。 详细的设置情况如下:?选择需要设置参数的常量,选中常量,在右键菜单中选择Replace with parameter项,就会弹出参数设置窗口,第一项是参数名,第二项是参数类型,第三项是参数值!下面对参数的类型进行说明:类型来替代。LoadRu nnerGroup Name?1 DateTime :很简单,在需要输入日期

42、/时间的地方,可以用 DateTime ?其属性设置也很简单,选择一种格式即可。当然也可以定制格式。?2 Group Name:暂时不知道何处能用到,但设置比较简单。在实际运行中,?使用该虚拟用户所在的Vuser Group来代替。但是在 VuGen 中运行时,?将会是None?3 Load Ge nerator Name:在实际运行中,LoadRu nner使用该虚拟用户所在Load?Ge nerator的机器名来代替。?4 Iterati on Number:在实际运行中,LoadRu nner使用该测试脚本当前循环的次数来?代替。?5 Ran dom Number?6 Uni que N

43、umber:随机数。很简单。在属性设置中可以设置产生随机数的范围:唯一的数。在属性设置中可以设置第一个数以及递增的数的大小。?下面重点讲一下从数据库中获取集合信息!?点击参数配置界面的properties 按钮,在选择 Data Wizard按钮,就会岀现 DB Query Wizard 窗口!选择 Specify SQL.选项!?点击下一步,上面是数据源连接字符串,重新创建或者用已创建的都行,这里就不再细说了,下面的编辑框 中,输入查询语句!Fin ish之后,就可以看到数据了!在这个界面中的By name 选项中选择需要做参数的列!?(1) Seque ntial? Ra ndom?注意&

44、quot;select next row"选项中参数的意义:按照顺序一行行的读取。每一个虚拟用户都会按照相同的顺序读取:在每次循环里随机的读取一个,但是在循环中一直保持不变?孑Same Line As某个参数(比如 Name ):和前面定义的参数Name 取同行的记录。?前3个一目了然,这里就不多做说明,最后一个是通过已有的参数作为条件进行过滤!比如。用户名和密码在同一张表中。parml 作为帐号参数,parm2作为密码参数,parml 已经确定,在选择了 Same Line As 后, 在选择参数parml ,即可匹配相对应的密码!在做负载或者压力测试时,很多人选择使用了 Load

45、ru nner测试工具。该工具的基本流程是先将用户的实际操作录制成脚本,然后产生数千个虚拟用户运行脚本(虚拟用户可以分布在局域网中不同的PC机上),最后生成相关的报告以及分析图。但是在录制脚本的过程中会遇到很多实际的问题,比如不同的用户有不同的使用数据,这就牵涉到参数的设置问题。本文就Loadru nner中参数的设置进行说明,希望对大家有所帮助。在录制程序运行的过程中,VuGen (脚本生成器)自动生成了包含录制过程中实际用到的数值的脚本。如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询、提交等等),那么你必须用参数值取代录制的数 值。这个过程称为参数化脚本。本文主要包括如下内容

46、:理解参数的局限性、建立参数、定义参数的属性、理解参数的类型、为局部数据类型设 置参数的属性、为数据文件设置参数的属性、从已经存在的数据库中引入数据。除了 GUI,以下的内容适合于各种类型的用户脚本。、关于参数的定义函数中参数的值就是在录制过程中输该声明搜索名称为“UNIX'的图书的数“UNIX'。那么,你就可以用参数来取代在你录制程序运行的过程中,脚本生成器自动生成由函数组成的用户脚本。 入的实际值。例如,你录制了一个 Web应用程序的脚本。 脚本生成器生成了一个声明, 据库。当你用多个虚拟用户和迭代回放脚本时,也许你不想重复使用相同的值 这个常量。结果就是你可以用指定的数据

47、源的数值来取代参数值。数据源可以是一个文件,也可以是内部产生的变量。用参数表示用户的脚本有两个优点:可以使脚本的长度变短。 可以使用不同的数值来测试你的脚本。例如,如果你企图搜索不同名称的图书,你仅仅需要写提交函数一次。 在回放的过程中,你可以使用不同的参数值,而不只搜索一个特定名称的值。参数化包含以下两项任务: 在脚本中用参数取代常量值。 设置参数的属性以及数据源。参数化仅可以用于一个函数中的参量。你不能用参数表示非函数参数的字符串。另外,不是所有的函数都可以参数化的。二、参数的创建可以指定名称和类型来创建参数。不存在对脚本中参数个数的限制。在Web程序的用户脚本中,你可以使用如下过程在基于

48、文本的脚本视图中创建参数。或者,也可以在基于图标 的树形视图中创建参数。要创建一个参数:1、将光标定位在要参数化的字符上,点击右键。打开弹出菜单。2、 在弹岀菜单中,选择 “ Replace with a Parameter。选择或者创建参数的对话框弹岀。3、 在“ Parameter name中输入参数的名称,或者选择一个在参数列表中已经存在的参数。4、 在“ Parameter type下拉列表中选择参数类型。5、 点击“0K”关闭该对话框。脚本生成器便会用参数中的值来取代脚本中被参数化的字符,参数用一对“' 括住。注意:在参数化CORBA或者General-Java用户脚本的时候

49、,必须参数化整个字符串,而不是其中的部分。另外注意:除了 Web或者WAP,缺省的参数括号对于任何脚本都是“ 拉你可以在“General Options ”对话框中的 “ Parameterization拉标签(Tools>General Options)中定义参数括号种类。6、 用同样的参数替换字符的其余情况,选中参数,点击右键,弹岀菜单。从弹岀的菜单中,选择“ Replace MoreOccurrences 拉搜索和替换对话框弹岀。“ Find What 中显示了你企图替换的值。“ Replace With 中显示了括号中参数的名称。选择适当的检验框来匹配整个字符或者大小写。如果要搜

50、索规则的表达式(.,!,?等等),选中 “RegularExpression检验框,然后点击“ Replace 或者 “ Replace All。拉注意:小心使用“Replace All拉尤其替换数字字符串的时候。脚本生成器将会替换字符岀现的所有情况。7、 如果想用以前定义过的参数来替换常量字符串的话,选中该字符串,点击右键,然后选择“ Ue Existing Parameter 拉 子菜单 “ Use Existing Parameters 弹岀。从子菜单 “ Use Exist ing Parameters ” 选择参数,或者用 “ Select from Parameter List ”

51、 来打开参数列表对话 框。注意:如果用以前定义过的参数来替换常量字符串的话,那么,使用“Parameter List ”非常方便。同时,还可以查看和修改该参数的属性。8、 对于已经用参数替换过的地方,如果想取回原来的值,那么,就在参数上点击右键,然后选择“ RestoreOr iginal Value 。拉在Web用户脚本的树形视图中创建参数在Web用户脚本的树形视图中创建一个参数的步骤1、将光标定位在企图参数化的地方,点击右键,从弹岀的菜单中选择“ Properties。则相关的属性对话框打开。2、 点击在要参数化的参量的旁边的“ ABC形状的图标。 “ Select or Create P

52、arameter对话框打开。3、 在“ Parameter name中输入参数的名称,或者从列表中选择一个已经存在的参数。4、 在“ Parameter type中输入参数的类型。5、点击“ 0K关闭该对话框。用户脚本生成器会用参数来替换最初的字符串常量,并用一个表格形状的图标替换“ ABC形状的图标。6、 要恢复参数化以前的值,点击图标,然后从弹岀的菜单中选择“ Undo Parameter ,"则以前的值便会重现。三、定义参数的属性创建参数完成后,就可以定义其属性了。参数的属性定义就是定义在脚本执行过程中,参数使用的数据源。Web数属性。下面的过程将教你如何在基于本文的脚本视图中

53、定义参数属性 定义参数属性步骤:1、在参数上点击右键,有菜单弹出。2、 在弹岀的菜单中,选择 “ Parameter Properties。参数属性对话框打开,显示和当前参数类型相关的属性。3、输入参数的属性值。4、点击“ Close关闭参数属性对话框。在Web用户脚本的树形视图中定义参数的属性1、 将关标定位在参数上,然后点击右键,选择“ Properties 。属性对话框打开。2、 点击要定义属性的参数旁边的表格形状按钮,点击右键,选择“ Parameter Properties。参数属性对话框打开,和参数类型相关的属性显示出来。3、输入参数的属性。4、点击“ Close关闭参数属性对话框

54、。使用参数列表使用参数列表可以在任意时刻查看所有的参数,创建新的参数、删除参数,或者修改已经存在参数的属性。要使用参数列表:1、点击参数列表按钮或者用2、要创建新的参数,点击 重新命名,然后回车。注意:不要将一个参数命名为Vuser>Parameter List。参数列表对话框打开。“ New'按钮。新的参数则被添加在参数树中,该参数有一个临时的名字,你可以给它un ique ",因为这个名称是用户脚本生成器本身的。设置参数的类型和属性,点击“OK,关闭参数列表对话框。注意:用户脚本生成器创建新的参数,但是不会自动用该参数在脚本中替换任意选中的字符串。“ Delete,

55、"然后确认你的行为即可。要删除已有的参数,那么,要先从参数树中选择该参数,点击要修改已有参数,那么,要先从参数树中选择该参数,然后编辑参数的类型和属性。四、理解参数的类型,要指定参数值的数据源。你可以指定下列数据源类型的任何一种:In ter nal Data虚拟用户内部产生的数据。Data Files存在于文件中的数据。可能是已存在的文件或者是用脚本生成器新创建的。User-Defined Functions调用外部DLL函数生成的数据In ter nal Data包括以下几种:1. Date/TimeDate/Time用当前的日期/时间替换参数。要指定一个Date/Time格式,

56、你可以从菜单列表中选择格式,或者指定你自己的格式。这个格式应该和你脚本中录制的Date/Time格式保持一致。2. Group NameGroup Name用虚拟用户组名称替换参数。在创建sce nario 的时候,你可以指定虚拟用户组的名称。当从用户脚本生成器运行脚本的时候,虚拟用户组名称总是None。3. Load Gen erator NameLoad Gen erator Name用脚本负载生成器的名称替换参数。负载生成器是虚拟用户在运行的计算机。4. Iterati on NumberIteration Number用当前的迭代数目替换参数。5. Ran dom NumberRan

57、dom Number用一个随机数替换参数。通过指定最大值和最小值来设置随机数的范围。6. Uni que NumberUnique Number用一个唯一的数字来替换参数。你可以指定一个起始数字和一个块的大小。7. Vuser IDVuser ID 用分配给虚拟用户的ID替换参数,ID是由Loadrunner 的控制器在seenario 运行时生成的。如果你从脚本生成器运行脚本的话,虚拟用户的ID总是-1。五、数据文件数据文件包含着脚本执行过程中虚拟用户访问的数据。局部和全局文件中都可以存储数据。可以指定现有的ASCII文件、用脚本生成器创建一个新的文件或者引入一个数据库。在参数有很多已知值的时候数据文件非常有用。数据文件中的数据

温馨提示

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

评论

0/150

提交评论