随着硬件的日新月异,现在设计软件已经不再像十年前那样对软件占用的内存、软件运行消耗的CPU斤斤计较了。如果你有在DOS下写程序的体验,那么当年经常为物理内存不够而头痛的经历或许到现在还历历在目吧。还记得十年前会有很多书籍是专门讲述如何去优化程序,使其占用更少的内存。但是到现在,恐怕都难觅这类书籍的芳踪了。硬件厂商现在似乎为我们程序员创造着一个资源永动机,为我们的软件提供永远也用不完的资源。程序员的精力也不会过多花在如何高效利用资源上了,有时候甚至是没有办法去想。譬如,写了那么多所谓的OO程序,你是否会考虑自己的程序里面构造了多少的对象实例,而这些对象又占用了多少内存呢?C++尚可以使用sizeof看个仔细,但是我心爱的Java连sizeof都没有,我该拿什么去看呢?好了,先别想这些偏门的了,但是自己在初学Java的时候,会考虑使用ArrayList带参数的构造函数以减少数组创建的次数[1]吗?噢,我发现自己已经被这强大的硬件资源宠坏了。忆苦思甜一下,俺当年用的是一台有着1M内存和210M硬盘的386。当你面对着这样配置的机子,你还会对资源大手大脚吗?爱惜这些资源,好好地利用它们,它们会给你最好的回报。忽视了资源的管理,你将会面对一个响应时间(Response Time)很长,响应率(Responsiveness)很低以及吞吐能力(Throughput)很小的系统[2]。
天马行空了一番,让我们再次回到数据访问上来。首先我们并非直接使用硬件资源,而是使用操作系统提供的硬件资源的抽象接口。你应该会了解操作系统的主要功能,如进程管理,内存管理,文件管理等,操作系统会为我们的程序分配内存,分配CPU周期,操作文件,我们并不需要在硬件资源使用的细节花太多的心思。在操作系统提供这样的硬件抽象基础上,还有其他相关的软件进行更进一步的抽象,特别的就是数据库软件了。经过操作系统和数据库软件组织、优化并且抽象之后,呈现在数据访问方面的资源不再是内存、CPU周期和文件了,而是Connection、Statement、ResultSet以及Transaction等等。
1、Connection:应用程序通过Connection来跟数据库进行交互,它是所有数据库操作的基础。初始化一个Connection,需要进行的操作相当复杂:封装Socket操作、用户验证和授权等,因此开销是相当大的。通常我们会采用Connection Pool来存放一定数量的处于Open状态的Connection以减少频繁初始化Connection所带来的开销;
2、Statement:在Connection基础上创建的Statement负责数据库具体的增删查改操作并且返回相应的ResultSet。尽管创建Statement的开销并不大,但是使用PreparedStatement来存储反复使用的SQL语句是一个提高性能好方法;
3、ResultSet:负责查询的Statement返回的数据集就是ResultSet。ResultSet使用游标来维护指向当前记录的指针,当你需要更新ResultSet的时候,通常会引起行锁或者全表锁。当然你也可以在返回了结果集之后,调用ResultSet的close方法或者ResultSet对应的Statement的close方法以释放占用的资源,在结果集更新完毕之后再将改动同步至数据库中。
4、Transaction:Transaction将数据表一系列的改动组织为一个有机的整体,要么执行所有更新操作,要么所有都放弃。Transaction的实现需要对行记录或者表进行锁定,就会阻塞其他更新操作,因此Transaction范围的界定相当重要,一个Transaction包含过多的更新操作必然会影响系统的处理效率。
以上是数据访问操作中会频繁使用到的资源,那么我们在管理这些资源的时候,应该遵循怎样的原则和模式呢?
1、及时释放资源:良好的Garbage Collection机制让我们只会一味的申请资源,却忽视了将资源释放这重要一环。除了时常提醒自己使用后放回原处之外,封装一个好用的资源类,让释放资源自动化是一个不错的选择。通常我们通过Resource Decorator模式来实现;
2、最小化资源打开的间隔:当业务逻辑处理搀杂着数据操作的时候,你心里必须得明白资源应该在什么时候打开。在打开了一个Connection之后仍然需要进行大量的逻辑处理并不是一件好事。对于资源,我们需要的是一种按需索取的原则,当你真的需要的时候,才去获得并且操作相应的资源,而不是过早地据为己有。设置Timeout来防止应用程序占用某一资源的时间过长也是一种很好的方法。对于这一点,常用的模式是Resource Timer模式;
3、使用资源池:俗话说养兵千日,用在一时,毕竟临阵磨枪是糟糕的。由于资源初始化是一个花销巨大的操作,及早初始化一定的资源,就可以减少书到用时方恨少的尴尬了。想想连接池的应用,你会更清楚地了解这个原则的重要性。与这一点相应的模式就是Resource Pool模式了。
资源稀缺与否都不应该影响到我们对于资源管理的看重,多从资源的角度去审视自己的程序,你会得到很多你原来不曾发现的顿悟。
[1] 此Vector非彼Vector
[2] 参考《Patterns of Enterprise Application》
分享到:
相关推荐
《数字信息时代图书馆随书光盘科学管理模式研究——以江苏大学为例》这篇文章主要探讨了在当前数字信息时代,图书馆如何科学地管理和利用随书光盘这一特殊资源的问题。随书光盘作为图书内容的补充和扩展,其重要性日...
本次将聚焦于一种较为简单的模式——单例模式。 #### 单例模式概述 单例模式是一种创建型模式,它的核心在于确保某个类只有一个实例,并提供一个全局可访问的访问点。这种模式非常实用,尤其是在需要频繁地创建和...
这种模式允许系统通过增加更多的副本节点来分散访问压力和提高系统的容错性。一致性哈希是实现复制伸缩的一种技术,它通过将数据分布在哈希空间的节点上,当系统规模发生变化时,只有部分数据需要迁移,以此来减少...
传统的边界安全管理模式已难以满足现代机械制造业的数据安全管理需求。因此,制定一套全面的数据信息安全管理体系变得尤为重要。 #### 敏感数据类型与分布 - **敏感数据类型**:主要包括设计图纸和文档等,这些...
"8大数据时代的掘金术——数据资产管理探讨"这一主题深入剖析了如何在大数据时代有效地管理和利用这些宝贵的数据资源,实现企业的战略目标。以下是关于大数据时代数据资产管理的一些关键知识点: 1. **大数据定义与...
本文介绍了一个实际案例——基于B/S模式的教学资源管理系统,该系统已经在某高校投入使用。系统采用B/S架构,用户可以通过任何一台连接互联网的计算机访问该系统。系统主要包括以下功能模块: - **用户登录与权限...
云端数据湖是指一种基于云平台的数据存储和管理方式,它允许企业以原始格式存储大量不同来源的数据,而无需预先定义数据结构或模式。 **优势:** 1. **所有数据集中一处:** - 数据湖提供了一个集中的存储位置,...
模块化设计可以将系统分解为更小、更易管理的部分,如数据访问层、业务逻辑层和用户界面层。MVC(Model-View-Controller)模式是一个常见的选择,可以帮助分离数据模型、显示视图和用户交互控制。 【C++课程设计...
在图书管理系统中,数据库关系模式设计需要考虑读者资源、书籍资源、借书信息、还书信息等多个方面,以确保系统的正确性和可靠性。 总结 通过这次课程设计,我们更加深入的了解了操纵数据库的知识,并且对数据库...
它采用独特技术区分应用系统和本地的敏感数据,同时结合用户和终端的管理模式,实现加密、授权和审批的全过程管理。 此外,Chinasec移动终端安全解决方案关注移动设备的安全认证与接入、网络访问控制、安全传输、接...
1. 读者认证管理服务模式的重要性 读者身份认证是图书馆服务管理的基础性工作,也是不可或缺的重要组成部分。读者身份认证管理服务模式的目的是让读者快速了解、熟悉、掌握和利用图书馆的服务,提高读者服务认可度...
- **加强患者教育**:提高患者对医疗数据共享重要性的认识,增强其参与意愿。 - **完善法律法规**:建立健全医疗数据共享相关的法律法规体系,为数据共享提供法律保障。 - **优化奖惩机制**:设计合理的激励和惩罚...
总的来说,"数据库——教师管理系统5.0"是一个针对教育行业的管理解决方案,利用ASP和Access数据库技术,提供便捷的教学资源管理和教师信息管理功能。用户在使用时,需要注意合适的运行环境配置,以便充分发挥系统的...
【运维安全管理——数据中心的内部防御门户】 在当前的数字化时代,数据中心的安全管理至关重要,因为它们是企业信息系统的核心,存储着大量的关键数据。然而,传统的运维模式存在诸多问题,容易引发安全风险,例如...
在虚存管理实验中,这可能意味着你需要设计一个机制,使得多个进程可以共享内存资源,同时保证它们的独立性和数据安全性。 FIFO(先进先出)通信是一种进程间通信(IPC)方式,常用于消息队列。在内存管理中,FIFO...
* 安全性系统对数据、节点的安全做了充分考虑,包括数据加密、节点认证、文件访问权限、用户角色等安全技术手段加以保证。 * 开放性采用国际工业标准,对数据的 XML 标准、适配器的 JCA 保准、体系架构的 SOA、服务...
【ASP.NET源码——基于浏览器的简易资源管理器(源码).zip】是一个包含ASP.NET技术实现的在线文件管理系统源代码。这个系统旨在提供一个简单的Web界面,让用户能够通过浏览器来浏览、管理和操作服务器上的文件资源,...
根据系统的访问模式和数据量,选择合适的存取方法,如B树、哈希索引等,以优化数据读写速度。 4.2 存储构造设计 考虑磁盘空间利用率,选择适合的数据存储格式,如行存储或列存储,以及压缩策略,以降低存储成本。 ...
本项目——“学生选课系统实训项目”,是一个基于MVC(Model-View-Controller)设计模式的未完成版,尽管如此,它已经实现了基本的增查改功能,对于学习和理解JavaWeb开发,特别是MVC架构有极大的帮助。 首先,让...