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

Oracle 性能问题排查 Oracle 性能问题排查应用程序层面代码逻辑问题:检查应用程序的代码逻辑,看是否存在不合理的查询语句或者频繁的数据库操作。例如,是否有不必要的嵌套查询、循环中多次执行相同的 SQL 语句等。可以使用代码审查工具或者日志记录来定位问题代码。连接池配置:确认应用程序的数据库连接池配置是否合理。如果连接池的最大连接数设置过小,可能会导致应用程序在高并发情况下等待数据库连接,从而影响响应时间。可以调整连接池的参数,如最大连接数、最小连接数、连接超时时间等。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

FoolsGarden@SMTH
自由Java传道士

初识高速缓存和连接池

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

高速缓存和连接池是数据访问中的重要技术,某些情况下的应用对访问数据库的性能有巨大的提高,而且都得到了数据库业界的普遍支持。前者由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对访问数据库性能的影响和如何寻找最优的配置方案。

Connection Pool(连接池)

池是一个很普遍的概念,和缓冲存储有机制相近的地方,都是缩减了访问的环节,但它更注重于资源的共享。下图展示了建立"调制解调器池"以共享调制解调器资源的VPN拨号方案:

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

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。

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

连接池的设置和应用

我选择IBM公司的应用服务器平台WebSphere来给大家演示连接池的设置,使你面对友好的Web界面,可以体验到非常简易的操作场景。

首先,我们进入WebSphere的管理控制台,这是一个非常漂亮的Web界面:

紧接着,我选定一个数据源:Session Persistence datasource,就可看到这个数据源的属性配置了。在这儿,仅仅列举和连接池有关的属性:

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程序的解决方案,希望对你有所帮助。

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

解决性能问题的几条经验

  1. 不要让硬件的低配置成为软件正常运行的障碍,后者有升级前者的需求,请立即满足;经常碰到这样的问题"P166 64M的机子跑Win2K MySql JBoss,能跑么?"我在回答"可以"的同时只有对着屏幕发呆了。
  2. 尽量使用商业软件,并享受良好的售后技术支持;如果你没有黑客精神,请不要使用自由软件。
  3. 分析好自己的问题,也许它的本质和他人的不同;没有一把钥匙可打开的任一把锁。
  4. 确定瓶颈环节的位置;解决了瓶颈问题,往往整个的性能问题就解决了,千万不要抓着边缘的问题不放。
  5. 将瓶颈环节细分为多个顺序的流程,用逐个替代的方法来试探瓶颈的核心位置;细分问题使你都问题有更进一步的了解。
  6. 做自己能做的和该做的事情,始终面向自己的现实问题;不要尝试那些应该由厂商解决的问题(例如,自己写个JDBC驱动)。
  7. 他人的方案只供自己参考,解决要靠自己思考;你我应用的情形不同,应用解决方案要在理解他人的方案之后。
  8. 观察新技术,应用新技术;它往往包含了前人对问题解决的思路,只是对你来说不可见。
  9. 问题得到解决后,立即罢手,并汇报结果;在现实问题得到解决后,没有必要花费精力在非核心的问题上,也许它们永远不会被碰到,不要假想问题让自己解决。

上述经验为个人即兴的总结,并未有严谨的逻辑推导,仅代表我解决技术问题的思路,供你碰到类似问题时参考。

可以提前告诉大家的是,下一篇文章我将把主题转移到JDO的介绍和讨论上。这个陌生的API已经进入Final Draft了,可它到底能够给数据存取带来什么好处,和JDBC有什么关联的地方,《JDO(Java Data Object)的发展和介绍》将向你娓娓道来。

参考资料

关于作者
曾任水木清华BBS的Java技术和嵌入式系统的讨论区负责人,对Java技术有很深的钻研和丰富的教学经历
曾在清华大学微电子学研究所从事Java智能卡微处理器的研究和开发
现任水木清华BBS的自由与协作的讨论区负责人,探讨网络协作的开发模式
参与JXTA项目的探讨,并为JXME(JXTA J2ME)项目的核心成员,致力于推动P2P在嵌入式(尤其是无线网络)领域的发展
致力于国内Java技术的推广宣传和普及教育
实战指南:基于ELK与Grafana构建天融信防火墙日志可视化看板 本文详细介绍了如何基于ELK与Grafana构建天融信防火墙日志可视化看板,包括环境准备、日志收集与解析配置、Elasticsearch存储优化、Grafana看板设计等关键步骤。通过实战案例和优化技巧,帮助用户高效处理天融信防火墙日志,实现安全态势的可视化监控与分析。 阅读详情

相关推荐

opencv读取海康威视摄像头相关配置

1、开发环境 海康威视的网络摄像头使用: 开发工具:vs2015 C++ 海康SDK 2、相关操作 下载海康威视SDK:网址:http://www.hikvision.com/cn/download_61.html • 1:对照自己的开发平台可以下载设备网络SDK_Win32设备网络SDK_Win64,解压到本地文件下: • 2:VS配置 、Opencv配置。参考址 http://blog.youkuaiyun.com/poem_qianmo/article/details/19809337 (建议自己创

HMJ115的博客 984

数据库连接池的大小你真的设置对了吗

问题 真实环境prod中的系统,我们该如何设置数据库连接池的大小呢? 一些所谓的开发老鸟可能会肯定的告诉你:没关系,尽量设置的大些,比如设置成200,这样数据库性能会高些,吞吐量也会大些! 对于菜鸟的你,也许认为好像似乎说的有道理,真的是这样吗?接下来的分析,也许颠覆你的认知哦! 数据库连接池的设置分析——测试数据 条件 线程池设置大小 每个请求在连接池队列里平均等待时间 执行SQL耗时 总耗时 Oracle、9600并发线程、每次数据库操作sleep 550ms 2048 33ms 77ms 110ms

weixin_44166895的博客 1862

从零开始:如何用Python手绘波特图并分析电路稳定性

本文详细介绍了如何使用Python绘制波特图并分析电路稳定性,涵盖从基础理论到实际应用的完整流程。通过NumPy和Matplotlib实现频域分析,包括RC低通滤波器和RLC带通滤波器的案例,以及相位裕度计算等高级技巧,为电子工程师提供了一套高效的电路分析解决方案。

hhh00的博客 371

数据库连接池实现原理

数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接 ,并对外暴露数据库连接获取和返回方法。如:   外部使用者可通过getConnection 方法获取连接 ,使用完毕后再通过releaseConnection 方法将连接返回 ,注意此时连接并没关闭 ,而是由连接池管理器回收 ,并为下一次使用做好准备。   数据库连接池技术带来的优势:   1. 资源重用   由于数据...

JAVA 324

【论文精读】DisCo: Graph-Based Disentangled Contrastive Learning for Cold-Start Cross-Domain Recommendat

源域中具有相似偏好的用户在目标域中可能会表现出不同的兴趣。因此,直接迁移嵌入可能会引入不相关的源域协同信息。提出了一个基于图的解耦对比学习框架,以捕捉细粒度的用户意图并过滤掉不相关的协同信息,从而避免负迁移。 具体而言,对于每个域,我们使用多通道图编码器来捕捉多样化的用户意图。然后,我们在嵌入空间中构建亲和图,并执行多步随机游走以捕捉高阶用户相似性关系。将一个域视为目标域,我们提出了一种以用户相似性为指导的解耦意图对比学习方法,以优化跨域的用户意图桥接。

qq_52342142的博客 1227

硬件工程师笔记——电子器件汇总大全

本文系统总结了14种常用电子器件的工作原理及功能应用,包括电阻、压敏电阻、电容、电感、二极管、三极管、MOS管、晶振、光耦、IGBT、继电器、磁珠、可控硅和线性稳压器。每种器件从结构原理、工作特性到典型应用进行全面解析,如电阻的限流分压、电容的储能滤波、三极管的放大开关等。重点阐述了各器件在电路设计中的关键作用,如IGBT的功率控制、继电器的隔离保护、LDO的电压稳定等,并提供了实际电路应用案例。文章还整理了硬件工程师笔试面试相关的知识点和真题资源,为电子工程师提供全面的技术参考。

XU157303764的博客 2万+

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

初识高速缓存和连接池Cache(高速缓存)和Connection Pool(连接池)的概念和机制高速缓存的参数设定连接池的设置和应用性能问题的深远思索解决性能问题的几条经验全文阅读:http://www.javah.net/JDBC_JDO/20070519/1611.html

zaowei21的专栏 615

STM32(HAL库)驱动HC-SR04测距模块

本文介绍通过STM32F103C8T6单片机对HC-SR04测距模块进行驱动,并且通过串口对数据进行打印。

weixin_44597885的博客 2203

SSM考证考级

SSM

weixin_53166575的博客 5639

手把手教你学Simulink--基于飞轮储能系统的场景实例:飞轮储能与锂电池混合储能系统的协同控制

本文详细介绍了基于Simulink的飞轮储能与锂电池混合储能系统协同控制建模方法。通过高通/低通滤波器实现功率分配,使飞轮处理高频波动(±100kW),锂电池承担削峰填谷(50kW)。仿真结果表明,该系统效率达88%,锂电池循环次数减少90%,投资成本比纯电池方案节省200万美元。文章包含完整的建模步骤、控制策略设计和多场景仿真分析,为构建高效、长寿、经济的智能储能系统提供了实用解决方案。

MHD0815的博客 342

11-16 Fluent结果查看及后处理功能(做动画、监控点)

监控点、面及动画操作

zheaa的博客 1万+

关于数据库连接池

数据库连接池像打开关闭数据库连接这种和数据库的交互可能是很费时的,尤其是当客户端数量增加的时候,会消耗大量的资源,成本是非常高的。可以在应用服务器启动的时候建立很多个数据库连接并维护在一个池中。连接请求由池中的连接提供。在连接使用完毕以后,把连接归还到池中,以用于满足将来更多的请求。 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提

weixin_69302918的博客 396

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景,在 Windows Presentation Foundation(WPF)开发中,依赖项属性是一个核心且强大的特性,它为构建灵活、可扩展的用户界面提供了关键支持。理解并熟练运用依赖项属性,对于开发高效、健壮的 WPF 应用程序至关重要。本文将深入探讨 WPF 依赖项属性,通过丰富的代码示例和对关键概念的详细解释,帮助读者全面掌握这一重要特性及其应用场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

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

高速缓存和连接池对访问数据库性能的影响初识高速缓存和连接池 设想这样一种情形:你突然口渴,需要一杯水来缓解,从心情上来讲,当然是越快越好了。通常,一杯水的产生包括从水 源(井水、河水或江水、甚至海水等)抽取,通过管道传输和设备...

congji3817的博客 201

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

一.初识高速缓存和连接池   设想这样一种情形:你突然口渴,需要一杯水来缓解,从心情上来讲,当然是越快越好 了。通常,一杯水的产生包括从水源(井水、河水或江水、甚至海水等)抽取,通过管 道传输和设备净化,才到达你饮水的容器中。上述过程是必须的,但并不是每一杯水的 产生都必须把上述过程重复一次。你可以用一个大一点的容器(例如缸或罐等)来盛大 量的水,喝水之前分到杯子小部分中即可,你的代价只是把水从缸

xxcc的专栏 2819

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

 初识高速缓存和连接池设想这样一种情形:你突然口渴,需要一杯水来缓解,从心情上来讲,当然是越快越好了。通常,一杯水的产生包括从水源(井水、河水或江水、甚至海水等)抽取,通过管道传输和设备净化,才到达你饮水的容器中。上述过程是必须的,但并不是每一杯水的产生都必须把上述过程重复一次。你可以用一个大一点的容器(例如缸或罐等)来盛大量的水,喝水之前分到杯子小部分中即可,你的代价只是把水

kinglino520的专栏 483

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

高速缓存和连接池对访问数据库性能的影响作者:自由Java传道士     来自:水木清华  初识高速缓存和连接池  设想这样一种情形:你突然口渴,需要一杯水来缓解,从心情上来讲,当然是越快越好了。通常,一杯水的产生包括从水源(井水、河水或江水、甚至海水等)抽取,通过管道传输和设备净化,才到达你饮水的容器中。上述过程是必须的,但并不是每一

purecoffee的专栏 1766

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

 高速缓存和连接池对访问数据库性能影响本文将要和你讨论的高速缓存和连接池与上述特定容器和传输管道有很多相似之处,它们都达到了同一个目的:在满足用户意愿的前提下,尽可能地共享资源,以提高整个系统的性能。初识高速缓存和连接池  设想这样一种情形:你突然口渴,需要一杯水来缓解,从心情上来讲,当然是越快越好了。通常,一杯水的产生包括从水源(井水、河水或江水、甚至海水等)抽取,通过管道传

530

26种提高ASP.NET网站访问性能的优化方法

1. 数据库访问性能优化数据库的连接和关闭  访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。 ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求。  连接池的大小是有限的,如果

当当当当 677

数据库访问性能优化

1.数据库访问性能优化   数据库的连接和关闭    访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响

chenandczh的专栏 1474
上一篇: Sun为国电信息中心员工培训Java技术
下一篇: Java变量类型间的相互转换
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值