`

高速缓存和连接池对访问数据库性能的影响

阅读更多

初识高速缓存和连接池

设想这样一种情形:你突然口渴,需要一杯水来缓解,从心情上来讲,当然是越快越好了。通常,一杯水的产生包括从水源(井水、河水或江水、甚至海水等)抽取,通过管道传输和设备净化,才到达你饮水的容器中。上述过程是必须的,但并不是每一杯水的产生都必须把上述过程重复一次。你可以用一个大一点的容器(例如缸或罐等)来盛大量的水,喝水之前分到杯子小部分中即可,你的代价只是把水从缸转移到杯子;你还可以在大量用水(例如洗澡或洗衣服等)时,只需打开水阀,而不必临时铺设通往水源的管道和购买净化水的设备。因为水是人们生活不可缺少的东西,每时每刻都在被大量地使用,而且物理本质也完全相同,所以政府会铺设管道和建设水处理站,完成那些比较困难的工作,达到资源共享的目的,而你也可针对自己的需求,用容器来盛那些具有特定用途的水。本文将要和你讨论的高速缓存和连接池与上述特定容器和传输管道有很多相似之处,它们都达到了同一个目的:在满足用户意愿的前提下,尽可能地共享资源,以提高整个系统的性能。

高速缓存和连接池是数据访问中的重要技术,某些情况下的应用对访问数据库的性能有巨大的提高,而且都得到了数据库业界的普遍支持。前者由DBMS厂商针对自己的数据库实现,提供可供用户配置的方案;后者是JDBC的一个标准接口,由支持J2EE技术的应用服务器厂商提供具体的实现,而你的Java程序代码无需更改。本文将向你简单介绍高速缓存和连接池的概念和机制,并以PointBase数据库为例向你展示高速缓存的应用,而一个简单的连接池应用场景将向你描述应用的条件和提高的性能。

Cache(高速缓存)和Connection Pool(连接池)的概念和机制

它们不是数据库独有的技术,但却得到数据库业界的普遍支持,并在其它数据存取和对象复用领域有很多类似的应用。

Cache(高速缓存)

作为个人计算机的日常使用者,你肯定听说过这些名词:Cache(高速缓存)、Memory(内存)、Hard disk(硬盘)。它们都是数据存取单元,但存取速度却有很大差异,呈依次递减的顺序。对于CPU来说,它可以从距离自己最近的Cache高速地存取数据,而不是从内存和硬盘以低几个数量级的速度来存取数据。而Cache中所存储的数据,往往是CPU要反复存取的数据,有特定的机制(或程序)来保证Cache内数据的命中率(Hit Rate)。因此,CPU存取数据的速度在应用高速缓存后得到了巨大的提高。

对于数据库来说,厂商的做法往往是在内存中开辟相应的区域来存储可能被多次存取的数据和可能被多次执行的语句,以使这些数据在下次被访问时不必再次提交对DBMS的请求和那些语句在下次执行时不必再次编译。

因为将数据写入高速缓存的任务由Cache Manager负责,所以对用户来说高速缓存的内容肯定是只读的。需要你做的工作很少,程序中的SQL语句和直接访问DBMS时没有分别,返回的结果也看不出有什么差别。而数据库厂商往往会在DB Server的配置文件中提供与Cache相关的参数,通过修改它们,可针对我们的应用优化Cache的管理。下图是在Win2K中配置MS Access数据源的界面,在"驱动程序"部分你可设置的页超时和缓冲区大小就是和Cache有关的参数。在后面的讨论中,我将展示一个更复杂的数据库,向你解释Cache对访问数据库性能的影响和如何寻找最优的配置方案。

对于访问数据库来说,建立连接的代价比较昂贵,因此,我们有必要建立"连接池"以提高访问的性能。我们可以把连接当作对象或者设备,池中又有许多已经建立的连接,访问本来需要与数据库的连接的地方,都改为和池相连,池临时分配连接供访问使用,结果返回后,访问将连接交还。

JDBC 1.0标准及其扩展中没有定义连接池,而在JDBC 2.0标准的扩展中定义了与连接池相关的接口。与接口对应的类由应用服务器厂商实现,你可在对服务器的管理过程中调节某个数据库连接池的参数。

高速缓存的参数设定

在PointBase数据库DB Server的配置参数列表中,我们可以找到这几个参数:cache.checkpointinterval、cache.size、SQLCaching.size等。下表是对各个参数的描述:

参数名 参数描述
cache.checkpointinterval 检查点的时间间隔
cache.size 高速缓存的最大页数(素数时,性能最好)
SQLCaching.size 高速缓存中SQL语句的个数

对于cache.checkpointinterval来说,和前面Access界面中的页超时是一个概念,它指定了页面内容更新的时间间隔,这取决于你的应用对时效性的要求程度。

对于cache.size来说,指定了页面的个数,一般应设定为符合你查询结果的需求。至于为何是素数,我也纳闷,不过还是遵照厂商的指示吧。

对于SQLCaching.size来说,指定了存储的经过编译的SQL语句的个数,你可以把它设定为0,从而取消这个选项。

使用Cache后,性能到底有多大提高?我打开PointBase的Console通过JDBC驱动访问Server,将SQL菜单下的Timing Mode选上,以显示各个步骤的耗费时间。执行语句是:

SELECT * FROM PRODUCT_TBL

第一次访问,总计耗时1082毫秒,而编译耗时771毫秒。

紧接着的第二次访问,总计耗时仅为160毫秒,而编译耗时为0。

再接着的第三次访问,总计耗时仅为91毫秒,编译耗时也为0。

关闭Console,等待超过30秒之后,重新开启Console,执行相同的语句,总计耗时210毫秒,编译耗时为20毫秒。

自等待超过30秒之后,执行语句,总计耗时101毫秒,编译耗时为0。

由此可以看出,高速缓存的应用大大提高了访问数据库的性能,而其参数的设定则要依据前面对它们的描述来进行,需要你仔细阅读数据库的配置文档。

 

连接池的设置和应用

在这儿,仅仅列举和连接池有关的属性:

Minimum Pool Size 池中保持的连接的最小数目;有新的请求,且没有激活连接可供使用时,池中连接数将增大,到最大连接数为止
Maximum Pool Size 池中保持的连接的最大数目;当这个数目达到,且没有激活连接可供使用时,新的请求将等待
Connection Timeout 当连接数达到最大值,且激活连接都在被使用时,新的请求等待的时间
Idle Timeout 连接可在池中闲置的时间;超过将释放资源,到最小连接数为止
Orphan Timeout 连接在被应用控制时,可闲置的时间;超过将返回池中

你可以根据需要来修改这些数值,以满足你的应用需要。接下来,我们讨论一下连接池的应用。

EJB访问数据库(场景1,使用JDBC 1.0)

import java.sql.*;
import javax.sql.*;
...
public class AccountBean implements EntityBean {
...
public Collection ejbFindByLastName(String lName) {
      try {
            String dbdriver = new initialContext().lookup("java:comp/env/DBDRIVER").toString();
            Class.forName(dbdriver).newInstance();
            Connection conn = null;
            conn = DriverManager.getConnection("java:comp/env/DBURL", "userID", "password");
            ...
            conn.close();
      }
...
}

如果EntityBean是一个共享组件,那么每次客户请求时,都要建立和释放与数据库的连接,这成为影响性能的主要问题。

EJB访问数据库(场景2,使用JDBC 2.0)

import java.sql.*; 
import javax.sql.*; 
// import here vendor specific JDBC drivers
public ProductPK ejbCreate() {
      try {
// initialize JNDI lookup parameters
            Context ctx = new InitialContext(parms);
...
            ConnectionPoolDataSource cpds = (ConnectionPoolDataSource)ctx.lookup(cpsource); 
...
// Following parms could all come from a JNDI look-up 
            cpds.setDatabaseName("PTDB"); 
            cpds.setUserIF("XYZ"); 
...
            PooledConnection pc = cpds.getPooledConnection(); 
            Connection conn = pc.getConnection(); 
...
// do business logic
            conn.close();
      }
...
}

EJB组件利用JNDI的lookup()方法定位数据库的连接池资源,利用getConnection()方法得到已经打开的数据库连接,而用close()来释放连接,放回池中。因此,与场景1相比,少了与数据库建立物理连接的损耗。对于原本要频繁打开和关闭物理连接的应用来说,通过这种建立逻辑连接并复用的方法,性能肯定能够得到大幅度提高。

性能问题的深远思索

性能问题并不局限于数据库的应用上,而是存在于每个软件系统中。我们希望软件系统付出的最小,而获得的最大,因而无时无刻不在优化它们。通过《Java程序访问数据库的速度瓶颈问题的分析和解决》和本文,我对Java程序访问数据库的性能问题做了分析,并提供了优化Java程序的解决方案,希望对你有所帮助。

也许你会关心碰到类似的性能问题时应如何分析和解决,我就针对此次探讨"访问数据库的速度瓶颈"问题的过程中碰到的难题、网友的意见和自己的体会,作一个关于"方法论"的经验总结,希望能够抛砖引玉,更好地解决类似的问题。

分享到:
评论

相关推荐

    数据库优化设计方案.doc

    一、数据库优化自由结构 数据库的逻辑配置对数据库性能有很大的影响。为此,数据库平台一般对表空间设计提 出有相应的优化结构,如ORACLE公司的OFA(Optimal flexible Architecture),使用这种结构进行设计会大大...

    Sybase ASE 15.7 开发文档:系统管理指南(卷二)

    高速缓存绑定对存储过程和触发器的影响 .......... 100 使用配置文件配置数据高速缓存 .......... 100 配置文件中的高速缓存和缓冲池条目 .......... 100 高速缓存配置指南 .......... 104 第 5 章管理多处理器...

    ORACLE9i_优化设计与系统调整

    §1.6 块缓存(数据高速缓冲区) 33 §1.7 数据库写入进程 34 §1.8 日志写进程 34 §1.9 数据库检查点 34 §1.10 归档处理 35 §1.11 程序全局区(PGA) 35 第2章 警告日志与跟踪日志 35 §2.1 警告与日志文件 36 §...

    iBATIS实战

    3.3.2 Jakarta Commons数据库连接池 49 3.3.3 分布式高速缓存 49 3.4 将iBATIS添加到应用程序中 49 3.4.1 在独立应用程序中使用iBATIS 50 3.4.2 在Web应用程序中使用iBATIS 50 3.5 iBATIS和JDBC 51 3.5.1 释放JDBC...

    【JeeSpringCloud v3.2.4】后台权限管理系统+互联网云快速开发框架+微服务分布式代码生成.zip

    连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 在线接口文档:使用swager生成在线文档。 ActiveMQ队列:提供ActiveMQ队列,处理批量发送大数据量邮件、大数据量日志文件。 工作流:...

    【JeeSpringCloud v3.2.4】后台权限管理系统+互联网云快速开发框架+微服务分布式代码生成

    连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 在线接口文档:使用swager生成在线文档。 ActiveMQ队列:提供ActiveMQ队列,处理批量发送大数据量邮件、大数据量日志文件。 工作流:...

    cognos 管理与安全性指南

    管理 Content Manager 的数据库连接池设置 101 对非英语区域的条目进行排序 102 管理 Content Manager 同步 102 控制外部名称空间的浏览 103 设置高级 Content Manager 参数 103 在提示高速缓存中更改(默认)区域...

    building_storage_networks_chsSAN存储区域网络 .rar

    这个方案将提供对最广泛的服务器平台、操作系统和应用的支持,事实上,在容量、连接性、性能和可用性等方面,它也有着广阔的发展空间。 存储价格:容量增长的催化剂 国际数据公司(IDC)预言:若按磁盘的每兆...

    Oracle9i的init.ora参数中文说明

    说明: 指定数据库的默认语言, 该语言将用于消息, 日期和月份名, AD, BC, AM 和 PM 的符号, 以及默认的排序机制。可支持的语言包括英语, 法语和日语等等。 值范围: 任何有效的语言名。 默认值: 根据操作系统而定 ...

    ASP3《高级编程》(第一部分)

    第24~27章是在企业环境中使用ASP的安全性、性能和可扩展性等问题。第28章和附录提供了一个XML驱动的在线报纸示例和大量以表格形式给出的相关资料。本书不仅为Internet开发人员提供了详实的开发编程指导,也是致力于...

    ASP3《高级编程》(第二部分)

    第24~27章是在企业环境中使用ASP的安全性、性能和可扩展性等问题。第28章和附录提供了一个XML驱动的在线报纸示例和大量以表格形式给出的相关资料。本书不仅为Internet开发人员提供了详实的开发编程指导,也是致力于...

    Java数据编程指南

    数据库性能问题 本地编译机制 挑选适当的JDBC驱动程序 连接池 事务和批量查询 存储过程和JDBC准备语句 JDBC准备语句 在程序块上检索大数据集合 高速缓存频繁使用的数据 性能监控 小结...

    JAVA上百实例源码以及开源项目

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    JAVA上百实例源码以及开源项目源代码

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 谓语前推 42 2.10 使用物化视图进行查询重写 44 2.11 确定执行计划 46 2.12 ...

    TCP/IP教程TCP/IP基础

    6.8 高速缓存 52 6.9 反向解析(Pointer)查询 52 6.10 DNS安全 52 6.11 资源记录 53 6.12 小结 54 第7章 WINS 55 7.1 NetBIOS 55 7.2 NetBIOS名字解析 57 7.3 动态NetBIOS名字解析 58 7.3.1 使用WINS的优点 58 7.3.2 ...

    JeeSpringCloud后台权限管理系统-其他

    连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。在线接口文档:使用swager生成在线文档。ActiveMQ队列:提供ActiveMQ队列,处理批量发送大数据量邮件、大数据量日志文件。工作流:功能...

Global site tag (gtag.js) - Google Analytics