数据访问层性能优化策略-提高班
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
收益.
.E N T提供了很好的结构化异常处理机制,在引发异常之 前, 托管异常的开销非常小. 引发异常时, 需要使用堆栈遍历为 已引发的异常找到相应的异常处理程序. 堆栈遍历是一种开销 较大的操作.不要依赖引发异常来实现流程控制, 即应该预先 考虑到程序运行的结果, 异常控制仅仅用于意想不到的情况.
2 . 3尽量少抛出异常
2 下 规代码优化 .E 常 N
用不同的代码实现相同的功能, 其性能可能相去甚远.不 同的代码有不同的性能, 有些代码性能相差可达数十至数百 倍. 所以对代码进行一点小的更改, 会获得更快的响应时间, 占 用更少的内存和拥有更大的吞吐量. 优化某个代码可能只会节 省儿毫秒的请求时间和节省少许的内存占用, 但是对于We b 站点, 每天有成千上万个请求, 则会产生巨大的性能改善. 在开 发工作中, 注意采用高性能的代码能够在性能方面取得很高的
3 O 下 A NE 代码性能编程 D
.E 下开发 A 解决方案都是从 A ON T而来, D L NT D .E 因为
.E F m w r eo 提供的Si Bie类改进了字符串操 N T r a k t gud r n lr 作.t gud 实例字符串 Si Bie r n lr 操作使用相同的 字符串 缓冲区, 减 少了分配内存和解除分配内存的开销.测试表明, 对于大字符 串操作,rgudr Si Bie可以获得低于十分之一的响应时间和高 t n l 于十倍的请求连接, 总体性能提高十倍以上. 在实例化Si Bie t gud 类时, r n lr 应当设置其初始大小, 使初 始大小足于放置字符串的长度, 便获得 以 最佳性能. 如:
有许多文章讨论过使用存储过程代替 S L字符串的好 Q 处, 其中的一个好处是存储过程可以改善数据访问性能.数据 库能够编译和优化存储过程, 并能缓存该存储过程以供重用. 此外, 存储过程避免了从客户端发送 S L Q 语句, 可以减少网络
流量.
用户存储过程不要使用 " _ 作为名称前缀,1- 专门 s' p, 1 , s , p 用于命名系统存储过程.S L r r Q S v 始终从 Mae数据库开 ee sr t 始查找以s 开头的存储过程, p _ 这会降低数据访问的性能.
.3 8
C m ue Ea . 05 o pt r N 8 0 r o 2
数据访问层性能优化策略
郑 华
( 厦门大学 机系, 计算 福建 厦门 31 5 60 ) 0
摘 要:对于以数据为中心的体系结构, 大量的工作是编写和测试数据访问层.高性能的数据访问层对应用程序整体性 能至关重要.本文从.E N T常用代码,D .E 及性能测试三个方面分析, A ON T 介绍实现高性能.E N T数据访问层的优化策略
过于 微软大力推荐的 企业级开发套餐D wms和Pt o. u ai h e hp在 S
实现 D L方面,u a i 使用 D t e A D w ms h a St Pt o 则使用 a ;而 e hp S
计算机时代 20 年 第 8 05 期
.3 . 9
在连接池中没有任何连接时才设置新连接.当连接关闭时, 它 Dt e e由此看出, aRa . a d 即使在微软的开发团队中, 也没有能够在 会返回连接池, 供下一个连接重用. DL A 这个问题上达成一致. 总的说来, laRae可提供最 S Dt e r g a d 要以最优化的方式使用连接池, 需要遵守一些规则.首先 佳性能;a St Dt e可提供较多的功能和灵活性, a 因为创建 Dt e a St a 默认是打开的) .其次必须提高连接 对象的同 可导致多 对象( 时, 个子 包括Dt ae aRw aTb , t o 和 是不要关闭连接池功能( a lD a 尽量减少每个连接的时间, 做到尽晚打开连接, Dt o m 对象)以及用作这些子对象的容器的集合对象的 池的使用效率, aC l n a u 尽早关闭连接.最后是选择合适的连接池 创建. 但是, 应用程序负载 当 增加到一定水 平之后,aS 的 执行完数据操作后, Dt e at 大小, 太大的连接池将过多消耗服务器资源, 最佳大小取决于 性能又会超过 Dt e e的性能, aRa r a d 因为Dt edr a Rae过长时间与 a 数据库连接会影响性能. 最终使用哪一种数据提供方 式应依据 S L r r Q S v 硬件以及负载情况, ee 可由性能测试确定. 还有要注 意的是, 只有使用完全相同的连接字符串( 大小写和空格都要 实际的负载水平和使用性能测试来确定, 一般规律是检索单行 一样)才会获得连接池池化机制带来的性能好处. , 或单项使用Dt e e, aRa r a d 大量数据 操作时 使用Dt e aSt a o
指标, 性能瓶颈, 找出 指导改善程序的性能. N T 对. 组件测试 E 首 选 Vs l d . T 自带 的 A pci Cnr s ia S iN u toE u plao et T t itn e e (C ) 这意味着要编写一个测试 A T. 层对数据访问层进行调用才 果Dt r 页 为3条 录, 过 据层 aGi 长 0 记 通 数 返回1 0 记录, 能进行测试. ad 0 条 0 有二种方法产生测试层: 一种是实现A P E S. T N WE B应用程序( B层) WE 产生对 D L A 调用; 另一种方法是编 那么针对每个请求会放弃9% 7 数据量. 这种情况应使用存储过
及 方法.
关键词: 性能; 数据访问层; 性能测试; 性能优化
,引言
基于数据库应用程序体系结构中的一个核心组件是数据 访问层( a Ac s e, )其目 D t c s Lyr A , 的是高效地实现对数 a e a D L 据库中数据创建, 更新和删除(R D操作, 读, ( U ) 所以, C 高性能数 据访问层是实现高性能应用程序的前提和保证. 对于分布式应 用程序而言, 性能包括响应时间, 占用内存大小, 吞吐量, 最大 稳定连接数等多个方面, 这些指标同样适用于评价数据访问 层.影响数据访问层性能的因素很多, 本人根据编写数据访问
21使用 Srg udr . t B ie 进行字符串操作 i l n
由.E F m w r a eo 提供的SsmSi 数据类型是一个 N T r k ye .rg t t n 长度不可改变的字符串.每当字符串长度更改时, 内存中字符 串将被破坏, 并创建一个新字符串, 导致分配内存和解除分配 内 存的操作.这一过程导致公共语言运行库(L ) ( R中内存管理 C 和垃圾回收开销增加, 当字符串变大并且大块的内存被连续快 速地分配和解除分配时, 此问题尤为突出, 可能会导致数据层
5结束语 对硬件投资或对代码优化都可以改善应用程序的性能, 以
代码优化获得的收益最大.如果程序代码效率低下, 会占用大 量的系统资源, 要额外支付昂贵硬件费用才能获得相同的性 能. 本文提出的编程方法和原则, 为指导编写高性能的数据访 问层提供了一条切实可行的途径, 并在实践中证明行之有效.
3 . 2使用存储过程可以改善性能
4性能测试
对于一个企业级应用, 需要考虑的因素很多, 如安全性, 伸 缩性, 易配置性和代码可维护性等.性能是各方面因素权衡的 结果.数据库连接字符串的存储方法就是一个很好的例子: 把 连接串硬编码到程序中可以获得最佳的性能, 但We 应用通 b 常把数据库连接字符串存储于We.ng b of 配置文件中, c i 此时首 先考虑的是配置简易性, 然后才是性能. 此外, 即使采用所有性 能优化措施, 也难于预知数据访问层性能达到什么样的水平, 或者其瓶颈会出现在什么地方, 最终硬件环境, 压力水平甚至 最终用户的使用习惯都会影响到程序的性能. 使用性能测试指 导数据访问组件开发是确保应用程序能够达到性能设计要求 的惟一方法. 数据访问层性能测试就是测试数据访问层组件对数据库 CU R D操作的性能. 测试的目 的是评价组件是否达到性能设计
程在数据库服务器上执行数据分页, 避免通过网络传递不需要 的数据. 应当注意的是, 这种方法增加了服务器的负担, 有可能 从另一方面影响应用程序的可伸缩性和性能. 这种情况应该在 应用环境中运行性能测试, 以便找到适合于特定应用程序方案 的最佳方法. 3 . 4减少与数据库的往返次数 写一个调用 D L的类, ltH ne接口, A 实现 H p adr 这可省去A P S. N T页面请求涉及到的处理,更真实地反映数据访问层的性 E 能.A T C 压力测试应在程序的开发阶段进行, 以便在源头隔离 和修复程序的缺陷, 提高开发效率, 降低测试成本.
3 . 3从数据库中只取回所需要的数据
典型的S L 语句是"ec *fm d "把Od 表所 Q Slt r O e , r r e o rr e
有数据从数据库服务器取到客户端, 在客户端进行分析, 然后 丢弃无用的数据. .d 表有很多记录, 如果 r r e 可以想象这将造成 巨大网络负担和内存开销.从数据库中只取回 所需数据, 是高 性能数据访问的一条准则. 在使用D a i t r 控件的分页功能时候, aG d 数据层需要返回所 有数据, aGi只是基于当前页筛选显示出所要记录.如 而Dt r a d
Dm yt来自百度文库a e S i B ie 10 ) M Srg nw rg udr 00 i i s t n n l (
.T N 框架数据库访问技术全部归集于A ON T 在运用A E D. . E -
D . T 行 据 编 时,发 员 往 因 不 意 些 O E进 数 库 程 开 人 往 会 为 注 纂 N
2 限制晚期绑定 . 4
Vs l iN T c E 支持晚 iaB . u a s 期绑定调用. 所谓晚期绑定是使
用变量前不必声明, 运行时 C R使用反射将该对象转换为正 L 确的类型.晚期绑定调用比直接调用要慢几个数量级, 所以应 尽可能不要使用晚期绑定. 限制使用晚期绑定的方法是在源文
参考文献:
每次对数据库请求连接并获得数据都会降低应用程序可 以提供的每秒请求数.尽可能减少与数据库的往返次数, 如通 过存储过程嵌套调用, 在一个数据库请求中 返回多个结果集 ( 返回多个Dt ae aS ) 这样可以节省与数据库进 aTb 的Dt e , a l a t 行通信所需的总时间长度, 并减少数据库服务器管理请求工作 量, 使系统伸缩性更强.
层的实践, 总结出一些数据访问层性能开发方法.
2 . 2尽可能使用 F r x而不使用 F r h o. et . . N o Ec a
.E F m wr eo 提供的Fr h N T r a k o Ec 循环语句允许遍历集合 a ( 如数组,rys Ar l 及所有的 Im 集合) ai t ts e 中的所有元素, 而这 些元素可以是任意类型.Fr h o Ec 增强了程序的可读性, a 但是 当循环元素是 C a,b c或其它开销大的类型时,程序的响 hr j t Oe 应时间显著增加.从 性能的角度出发, 此时应该尽量使用Fr o. . Nx替代Fr h et o Ec 以改善性能. a
性能和可缩放性问题.
件的顶部包含O tn liO 和O tn i O , 便通 po Epc n po S c n以 i xi t i t t r 知编译器强制变量先声明后使用, 不允许变量类型隐式转换.
除上述介绍的之外, 装箱与拆箱, 反射和对象之间的消息 传递都具有很高的开销.尽量避免装箱与拆箱操作和反射操 作, 对象之间的消息传递要做到一次尽可能多地传递数据, 而 不是多次传递数据, 以减少对象访问的开销.
细节问题而影响应用程序的性能. 3 S l t ed r D t e性能之争 . g a R ae 与 a S t 1 D a a
Sla R dr a St ae与D t e的性能之争从 A O T g te Da a D NE 诞生之 日 开始就一直没有停止.这方面有很多好的例子, 最经典的莫
.E N T提供了很好的结构化异常处理机制,在引发异常之 前, 托管异常的开销非常小. 引发异常时, 需要使用堆栈遍历为 已引发的异常找到相应的异常处理程序. 堆栈遍历是一种开销 较大的操作.不要依赖引发异常来实现流程控制, 即应该预先 考虑到程序运行的结果, 异常控制仅仅用于意想不到的情况.
2 . 3尽量少抛出异常
2 下 规代码优化 .E 常 N
用不同的代码实现相同的功能, 其性能可能相去甚远.不 同的代码有不同的性能, 有些代码性能相差可达数十至数百 倍. 所以对代码进行一点小的更改, 会获得更快的响应时间, 占 用更少的内存和拥有更大的吞吐量. 优化某个代码可能只会节 省儿毫秒的请求时间和节省少许的内存占用, 但是对于We b 站点, 每天有成千上万个请求, 则会产生巨大的性能改善. 在开 发工作中, 注意采用高性能的代码能够在性能方面取得很高的
3 O 下 A NE 代码性能编程 D
.E 下开发 A 解决方案都是从 A ON T而来, D L NT D .E 因为
.E F m w r eo 提供的Si Bie类改进了字符串操 N T r a k t gud r n lr 作.t gud 实例字符串 Si Bie r n lr 操作使用相同的 字符串 缓冲区, 减 少了分配内存和解除分配内存的开销.测试表明, 对于大字符 串操作,rgudr Si Bie可以获得低于十分之一的响应时间和高 t n l 于十倍的请求连接, 总体性能提高十倍以上. 在实例化Si Bie t gud 类时, r n lr 应当设置其初始大小, 使初 始大小足于放置字符串的长度, 便获得 以 最佳性能. 如:
有许多文章讨论过使用存储过程代替 S L字符串的好 Q 处, 其中的一个好处是存储过程可以改善数据访问性能.数据 库能够编译和优化存储过程, 并能缓存该存储过程以供重用. 此外, 存储过程避免了从客户端发送 S L Q 语句, 可以减少网络
流量.
用户存储过程不要使用 " _ 作为名称前缀,1- 专门 s' p, 1 , s , p 用于命名系统存储过程.S L r r Q S v 始终从 Mae数据库开 ee sr t 始查找以s 开头的存储过程, p _ 这会降低数据访问的性能.
.3 8
C m ue Ea . 05 o pt r N 8 0 r o 2
数据访问层性能优化策略
郑 华
( 厦门大学 机系, 计算 福建 厦门 31 5 60 ) 0
摘 要:对于以数据为中心的体系结构, 大量的工作是编写和测试数据访问层.高性能的数据访问层对应用程序整体性 能至关重要.本文从.E N T常用代码,D .E 及性能测试三个方面分析, A ON T 介绍实现高性能.E N T数据访问层的优化策略
过于 微软大力推荐的 企业级开发套餐D wms和Pt o. u ai h e hp在 S
实现 D L方面,u a i 使用 D t e A D w ms h a St Pt o 则使用 a ;而 e hp S
计算机时代 20 年 第 8 05 期
.3 . 9
在连接池中没有任何连接时才设置新连接.当连接关闭时, 它 Dt e e由此看出, aRa . a d 即使在微软的开发团队中, 也没有能够在 会返回连接池, 供下一个连接重用. DL A 这个问题上达成一致. 总的说来, laRae可提供最 S Dt e r g a d 要以最优化的方式使用连接池, 需要遵守一些规则.首先 佳性能;a St Dt e可提供较多的功能和灵活性, a 因为创建 Dt e a St a 默认是打开的) .其次必须提高连接 对象的同 可导致多 对象( 时, 个子 包括Dt ae aRw aTb , t o 和 是不要关闭连接池功能( a lD a 尽量减少每个连接的时间, 做到尽晚打开连接, Dt o m 对象)以及用作这些子对象的容器的集合对象的 池的使用效率, aC l n a u 尽早关闭连接.最后是选择合适的连接池 创建. 但是, 应用程序负载 当 增加到一定水 平之后,aS 的 执行完数据操作后, Dt e at 大小, 太大的连接池将过多消耗服务器资源, 最佳大小取决于 性能又会超过 Dt e e的性能, aRa r a d 因为Dt edr a Rae过长时间与 a 数据库连接会影响性能. 最终使用哪一种数据提供方 式应依据 S L r r Q S v 硬件以及负载情况, ee 可由性能测试确定. 还有要注 意的是, 只有使用完全相同的连接字符串( 大小写和空格都要 实际的负载水平和使用性能测试来确定, 一般规律是检索单行 一样)才会获得连接池池化机制带来的性能好处. , 或单项使用Dt e e, aRa r a d 大量数据 操作时 使用Dt e aSt a o
指标, 性能瓶颈, 找出 指导改善程序的性能. N T 对. 组件测试 E 首 选 Vs l d . T 自带 的 A pci Cnr s ia S iN u toE u plao et T t itn e e (C ) 这意味着要编写一个测试 A T. 层对数据访问层进行调用才 果Dt r 页 为3条 录, 过 据层 aGi 长 0 记 通 数 返回1 0 记录, 能进行测试. ad 0 条 0 有二种方法产生测试层: 一种是实现A P E S. T N WE B应用程序( B层) WE 产生对 D L A 调用; 另一种方法是编 那么针对每个请求会放弃9% 7 数据量. 这种情况应使用存储过
及 方法.
关键词: 性能; 数据访问层; 性能测试; 性能优化
,引言
基于数据库应用程序体系结构中的一个核心组件是数据 访问层( a Ac s e, )其目 D t c s Lyr A , 的是高效地实现对数 a e a D L 据库中数据创建, 更新和删除(R D操作, 读, ( U ) 所以, C 高性能数 据访问层是实现高性能应用程序的前提和保证. 对于分布式应 用程序而言, 性能包括响应时间, 占用内存大小, 吞吐量, 最大 稳定连接数等多个方面, 这些指标同样适用于评价数据访问 层.影响数据访问层性能的因素很多, 本人根据编写数据访问
21使用 Srg udr . t B ie 进行字符串操作 i l n
由.E F m w r a eo 提供的SsmSi 数据类型是一个 N T r k ye .rg t t n 长度不可改变的字符串.每当字符串长度更改时, 内存中字符 串将被破坏, 并创建一个新字符串, 导致分配内存和解除分配 内 存的操作.这一过程导致公共语言运行库(L ) ( R中内存管理 C 和垃圾回收开销增加, 当字符串变大并且大块的内存被连续快 速地分配和解除分配时, 此问题尤为突出, 可能会导致数据层
5结束语 对硬件投资或对代码优化都可以改善应用程序的性能, 以
代码优化获得的收益最大.如果程序代码效率低下, 会占用大 量的系统资源, 要额外支付昂贵硬件费用才能获得相同的性 能. 本文提出的编程方法和原则, 为指导编写高性能的数据访 问层提供了一条切实可行的途径, 并在实践中证明行之有效.
3 . 2使用存储过程可以改善性能
4性能测试
对于一个企业级应用, 需要考虑的因素很多, 如安全性, 伸 缩性, 易配置性和代码可维护性等.性能是各方面因素权衡的 结果.数据库连接字符串的存储方法就是一个很好的例子: 把 连接串硬编码到程序中可以获得最佳的性能, 但We 应用通 b 常把数据库连接字符串存储于We.ng b of 配置文件中, c i 此时首 先考虑的是配置简易性, 然后才是性能. 此外, 即使采用所有性 能优化措施, 也难于预知数据访问层性能达到什么样的水平, 或者其瓶颈会出现在什么地方, 最终硬件环境, 压力水平甚至 最终用户的使用习惯都会影响到程序的性能. 使用性能测试指 导数据访问组件开发是确保应用程序能够达到性能设计要求 的惟一方法. 数据访问层性能测试就是测试数据访问层组件对数据库 CU R D操作的性能. 测试的目 的是评价组件是否达到性能设计
程在数据库服务器上执行数据分页, 避免通过网络传递不需要 的数据. 应当注意的是, 这种方法增加了服务器的负担, 有可能 从另一方面影响应用程序的可伸缩性和性能. 这种情况应该在 应用环境中运行性能测试, 以便找到适合于特定应用程序方案 的最佳方法. 3 . 4减少与数据库的往返次数 写一个调用 D L的类, ltH ne接口, A 实现 H p adr 这可省去A P S. N T页面请求涉及到的处理,更真实地反映数据访问层的性 E 能.A T C 压力测试应在程序的开发阶段进行, 以便在源头隔离 和修复程序的缺陷, 提高开发效率, 降低测试成本.
3 . 3从数据库中只取回所需要的数据
典型的S L 语句是"ec *fm d "把Od 表所 Q Slt r O e , r r e o rr e
有数据从数据库服务器取到客户端, 在客户端进行分析, 然后 丢弃无用的数据. .d 表有很多记录, 如果 r r e 可以想象这将造成 巨大网络负担和内存开销.从数据库中只取回 所需数据, 是高 性能数据访问的一条准则. 在使用D a i t r 控件的分页功能时候, aG d 数据层需要返回所 有数据, aGi只是基于当前页筛选显示出所要记录.如 而Dt r a d
Dm yt来自百度文库a e S i B ie 10 ) M Srg nw rg udr 00 i i s t n n l (
.T N 框架数据库访问技术全部归集于A ON T 在运用A E D. . E -
D . T 行 据 编 时,发 员 往 因 不 意 些 O E进 数 库 程 开 人 往 会 为 注 纂 N
2 限制晚期绑定 . 4
Vs l iN T c E 支持晚 iaB . u a s 期绑定调用. 所谓晚期绑定是使
用变量前不必声明, 运行时 C R使用反射将该对象转换为正 L 确的类型.晚期绑定调用比直接调用要慢几个数量级, 所以应 尽可能不要使用晚期绑定. 限制使用晚期绑定的方法是在源文
参考文献:
每次对数据库请求连接并获得数据都会降低应用程序可 以提供的每秒请求数.尽可能减少与数据库的往返次数, 如通 过存储过程嵌套调用, 在一个数据库请求中 返回多个结果集 ( 返回多个Dt ae aS ) 这样可以节省与数据库进 aTb 的Dt e , a l a t 行通信所需的总时间长度, 并减少数据库服务器管理请求工作 量, 使系统伸缩性更强.
层的实践, 总结出一些数据访问层性能开发方法.
2 . 2尽可能使用 F r x而不使用 F r h o. et . . N o Ec a
.E F m wr eo 提供的Fr h N T r a k o Ec 循环语句允许遍历集合 a ( 如数组,rys Ar l 及所有的 Im 集合) ai t ts e 中的所有元素, 而这 些元素可以是任意类型.Fr h o Ec 增强了程序的可读性, a 但是 当循环元素是 C a,b c或其它开销大的类型时,程序的响 hr j t Oe 应时间显著增加.从 性能的角度出发, 此时应该尽量使用Fr o. . Nx替代Fr h et o Ec 以改善性能. a
性能和可缩放性问题.
件的顶部包含O tn liO 和O tn i O , 便通 po Epc n po S c n以 i xi t i t t r 知编译器强制变量先声明后使用, 不允许变量类型隐式转换.
除上述介绍的之外, 装箱与拆箱, 反射和对象之间的消息 传递都具有很高的开销.尽量避免装箱与拆箱操作和反射操 作, 对象之间的消息传递要做到一次尽可能多地传递数据, 而 不是多次传递数据, 以减少对象访问的开销.
细节问题而影响应用程序的性能. 3 S l t ed r D t e性能之争 . g a R ae 与 a S t 1 D a a
Sla R dr a St ae与D t e的性能之争从 A O T g te Da a D NE 诞生之 日 开始就一直没有停止.这方面有很多好的例子, 最经典的莫