`

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

阅读更多

初识高速缓存和连接池

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

高速缓存和连接池是数据访问中的重要技术,某些情况下的应用对访问数据库的性能有巨大的提高,而且都得到了数据库业界的普遍支持。前者由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程序的解决方案,希望对你有所帮助。

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

分享到:
评论

相关推荐

    Delphi连接池.rar

    FireDAC具有高速数据传输能力、事务处理、数据缓存和连接池等功能,旨在提高应用程序的性能和响应速度。 2. **Delphi XE 10.1 Berlin**: Delphi XE 10.1 Berlin是Embarcadero开发的一款集成开发环境(IDE),支持...

    SpringBoot+MyBatis+Druid连接池+JDBC官方驱动+ClickHouse

    通过这种方式,我们可以构建一个高性能的数据处理系统,利用SpringBoot的便利性、MyBatis的灵活性和Druid的稳定性,以及ClickHouse的高速查询能力,实现对大数据的高效管理和分析。在实际项目中,还可以根据需求添加...

    Oracle数据库性能优化浅析.pdf

    Oracle的共享池包括库高速缓冲和数据字典高速缓存两个部分,它们在优化数据库性能方面起着重要作用。库高速缓存用于存储SQL和PL/SQL代码及执行计划,而数据字典高速缓存则存储数据库对象和用户权限信息。调整共享池...

    Oracle 8i数据库性能优化技术.pdf

    Oracle 8i数据库性能优化技术是一项关键的技能,特别是在处理大规模数据和高并发访问的环境中。Oracle数据库系统因其高效、稳定而广泛应用于各行各业。本文主要探讨了如何优化Oracle 8i数据库系统的性能,以实现最佳...

    数据库性能调优技术系列

    9. **数据库参数调整**:每个数据库系统都有大量可配置参数,如连接池大小、排序区大小等,正确调整这些参数可优化数据库性能。 10. **代码优化**:在应用程序层面,避免过度的数据库交互,减少不必要的事务,使用...

    Oracle数据库性能优化的分析 (2).pdf

    本文将对Oracle数据库性能优化进行深入分析。 1. 查询优化:Oracle数据库支持SQL语言,查询优化是性能优化的核心。通过合理设计索引、避免全表扫描、使用绑定变量和适当的JOIN策略,可以显著提高查询速度。优化器会...

    Redis缓存数据库_redis_数据库系统_

    Redis,全称Remote Dictionary Server,是一款开源的、高性能的键值对存储系统,常被用作数据缓存、消息中间件以及数据库等角色。在Windows系统下安装和使用Redis,可以为应用程序提供高速的数据访问能力,提升系统...

    数据库性能调优.原理与技术

    数据库性能调优是IT领域中的一个关键话题,尤其是在大数据量和高并发的业务环境中,确保数据库高效运行至关重要。本文将深入探讨数据库性能调优的原理和技术,帮助读者理解和掌握优化数据库性能的关键点。 首先,...

    OCP 中文资料-数据库性能优化

    9. **缓存与内存管理**:理解Oracle的缓冲区高速缓存、共享池和Redo Log Buffer的工作原理,以及如何调整其大小和行为,对于优化内存使用和提升响应速度至关重要。 10. **SQL性能改进**:学习如何使用绑定变量、...

    ORACLE数据库性能优化的方法研究.pdf

    应用程序的代码质量对数据库性能有很大影响。避免在应用程序中执行大量的数据库操作,减少不必要的连接和事务,合理使用批处理,可以减轻数据库负载。 7. 定期维护和监控 定期执行数据库维护任务,如统计信息更新...

    SQL 数据库性能调优方面的总结

    在现代企业级应用中,数据库性能是决定系统响应时间和用户体验的关键因素之一。为了确保应用程序能够高效地运行并提供最佳的服务质量,数据库调优成为了一个不可忽视的重要环节。本篇文章将从多个角度探讨如何进行...

    Oracle 数据库性能优化方法研究.pdf

    存储空间的不足会降低高速缓存区的利用率,影响数据处理。选择适当的存储设备,如硬盘驱动器,对大量数据的读写至关重要,因为固定输入/输出能力可能导致数据错误。此外,网络系统的负载过高会降低数据交换速度,...

    delphi连接数据库高级操作

    8. 数据缓存和连接池:为了提高性能,可以使用缓存策略,如内存中存储数据或利用数据缓存组件。此外,数据库连接池技术也可以提高应用的响应速度,避免频繁地创建和销毁数据库连接。 9. 数据绑定:Delphi的VCL和FMX...

    Oracle RAC数据库缓存优化方法研究.pdf

    数据库缓冲区高速缓存(Buffer Cache)是主要的内存组件,应根据数据访问模式和工作负载来配置。通过增大Buffer Cache大小,可以减少磁盘I/O,提高命中率。此外,还要合理配置重做日志缓冲区、共享池、大池和Java池...

    浅析Sybase数据库系统性能调优

    5. **使用缓存池**:通过sp_poolcache命令为特定的缓存配置内存池,有助于加速数据访问速度。 #### 四、总结 Sybase数据库性能调优是一项涉及多方面的综合技术,需要DBA及开发人员具备扎实的技术基础和丰富的实践...

    php连接代理 提供连接池 异步pdo redis 读写分离 负载均衡 日志打印等功能

    Redis通常用于缓存、队列服务和发布/订阅等场景,它的高速性能和丰富的数据结构使其成为数据库连接代理的一个理想补充。 “读写分离”是一种数据库架构策略,旨在提高数据库系统的可扩展性和性能。在这个代理中,...

    Oracle数据库的性能优化技术探讨.pdf

    5. **操作系统和硬件优化**:数据库性能也受到操作系统设置的影响,如文件系统、网络配置、CPU调度策略等。调整这些设置可以提升数据库的整体性能。硬件层面,选择合适的硬件配置,如高速SSD硬盘、足够的内存和适当...

    MySQL数据库的多线程引擎的实现思路.pdf

    - **数据库缓存层**:接收连接池的管理,同时与数据库驱动层通信,负责数据的缓存和高速访问。 3. **多线程框架的具体功能** - **线程分配与竞争**:多线程竞争连接资源可能导致效率下降和数据一致性问题。通过...

Global site tag (gtag.js) - Google Analytics