分类: Oracle
2008-05-23 21:50:28
来源: |
|
数据库系统的设计与开发 1、应用设计 不论使用何种工具或语言来开发应用程序,都需要进行应用的全面设计。应用设计包括: 首先,分析应用要完成的功能,确定应用类型,是OLTP(联机事务处理)系统、DSS(决策支持)系统还是批处理系统; 其次,应用在何时由谁使用、应用访问的数据、应用程序用到的组件、应用被要求的响应时间等,在设计前,必须对这些问题尽量进行解答,这对应用设计特别是大规模的应用设计非常重要; 第三,根据上面的,确定应用的体系结构,是采用client/server两层架构的方式,还是采用browser/server多层架构的方式实现一个开放的分布式应用系统,如何对应用服务器进行选择与配置; 第四,将应用按功能划分为一个或多个应用程序,明确应用程序的具体功能、类型、组成,使用时间及高峰时间、事务的流量、用户组成、访问的数据库对象等,确定应用程序间的关联和互操作特性,对各个应用程序的执行时间合理地进行安排; 第五,对应用程序进行模块化设计,选择实现应用的数据库组件和开发语言及工具。 2、应用开发 在应用开发阶段,根据应用的不同,实现的和步骤会有很大的差异。这里只讨论以下在应用开发中需要重点注意的几个问题。 1) 在开发会话关键型应用程序时,尽可能使用Pro*C/C++或OCI。在编写后备实例和数据库失败恢复等需要进行数据库重新的代码时,用Pro*C/C++ 或OCI比用PL/SQL要容易实现,在Oracle8/8i中,OCI可以实现透明应用程序失败恢复(TAF)。编写数据库操作繁重的应用程序,使用OCI,OCI程序对数据库的访问是通过调用OCI库函数实现的,能够直接到达系统内核,比Pro*C/C++速度更快。 2) 在开发会话关键型应用程序时,尽量实现失败检查和恢复能力,如指定后备数据库或实例、终止出错进程等。 3) 编写代码时,要考虑应用程序的可维护性,尽量将应用程序独立于数据库的变化。可使用视图、相对变量类型定义(%TYPE)、记录型变量定义(%ROWTYPE),采用表驱动的应用程序设计模式。 4) 进行充分的单元测试和模块测试,为应用集成打下坚实的基础。 5) 对关键表操作的应用程序实现要特别当心,必要的话,在应用中对关键表先做备份,应用成功执行后再删除备份表。 6) 编码结束后,应对代码进行优化。前面提到过,代码优化在数据库应用中非常重要,很高比例的性能问题与编码拙劣的应用程序有关。 7) 定期对应用操作的数据库对象增长的情况进行监控,避免因空间不足引起的应用程序的失败。 8) 对应用的数据定时进行整理。有些应用中,存放在数据库表中的数据只要求保存一段时间,就需要定时对数据进行删除。如果手工进行删除操作,量很大,可以用Oracle提供的作业来完成, unix系统下可用cron进程来实现。笔者在工作中经常使用cron来做数据的定 时删除,根据应用要求,编制Pro*C/C++程序,编写Shell脚本调用应用程序,将Shell脚本提交给cron进程。 注意:在Shell脚本中必须设置相应的Oracle环境变量,如ORACLE_BASE、ORACLE_HOME、NLS_LANG、LD_LIBRARY_PATH、PATH等,用户环境文件中的定义是无效的。 9)对于大量删除操作的应用程序,如果表是分区存放的,可对数据分区执行截断(truncate)操作,截断操作执行速度快并且不会产生碎片,但截断后可能需要进行重建索引的工作。对大量的数据做删除(delete)操作,会引起数据库回滚段的急剧增长,建议根据删除 数据量为这类应用创建特殊的专用回滚段,为专用回滚段指定合适的storage参数。平常,专用回滚段可以是离线的(offline),在事物开始前,使专用回滚段在线(online),指定事物使用专用回滚段,事物结束后再使专用回滚段离线,笔者使用的部分代码 (Pro*C/C++) 如下所示。 .. EXEC SQL WHENEVER SQLERROR goto Error; EXEC SQL CONNECT :uid; .. EXEC SQL ALTER ROLLBACK SEGMENT RBS_SPEC ONLINE; EXEC SQL SET TRANSACTION USE ROLLBACK SEGMENT RBS_SPEC; .. EXEC SQL DELETE FROM .. WHERE ..; EXEC SQL ALTER ROLLBACK SEGMENT RBS_SPEC OFFLINE; .. 结束语 Oracle数据库是一个功能强大的数据库系统,适用于各种各样的应用系统,系统规模可大可小,应用设计或简单或复杂,因此在使用过程中要根据各自不同的应用进行设置与调整,以上是笔者在使用Oracle进行应用开发过程中一点心得和体会,写出来与大家共勉,谢谢。 |