Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->PHP4/PHP5 ->正文

可扩展 可伸缩的 Oracle 与 PHP

来源: ORACLE 作者:webmaster 时间:2007-04-16 点击: [收藏] [投稿]

$stmt = OCIParse($db, $query);
OCISetPreFetch($stmt, 1000);
// execute and fetch

这些设置指示 OCI 客户库每次内部缓冲 1000 行,对任何返回超过一行的查询提供积极的回报。1000 是个相当随意的数字 — 在选择预取缓冲区大小时仅有的限制因素是:

  1. 在执行返回之前需要填充缓冲区 — 如果对部分结果集的即时访问非常重要,将不希望缓冲区过于庞大。
  2. 被缓冲的结果集保留在本地内存中,直到被刷新为止 — 如果您具有非常大的行或非常大的结果集,则不应将缓冲区设置得过大,以防止客户端出现内存不足。

管理与 Oracle 的交互操作

现在您已看到了一些通过 PHP 改进与 Oracle 数据库交互操作方式的技术。对您的程序作出这类结构性更改是管理上的争论焦点,因为它通常需要对代码中的很多地方作出不少更改。解决问题的正确方法是将所有的数据库访问代码封装在一个打包的库中,这样就可以对怎么样准备和执行查询等内部问题进行更改,而不必审计您的全部编码内容。

我说的是“打包的库”而不是“抽象层”,因为很多所谓的抽象层强调不仅向您隐藏低级数据库调用的细节,而且还隐藏 SQL。它们实施各自的与数据库无关的语法,以便您能够毫不费力地将您的应用程序改到其他数据库中。我认为这种方法存在三个主要问题:

  1. SQL 是很多开发人员了解的一种功能强大的描述性语言。不让他们使用这种语言并要求他们学习一种新的、灵活性较差的语言是很可笑的。
  2. 每种主要的数据库产品都具有非标准的 SQL 语法,以便完成特定的任务。放弃这些差异会限制您的灵活性,并使您失去所选择平台的某些价值。如果只考虑它们所支持特性的交集,最终只得到最低程度的通用特性。
  3. 对于多数人而言,更换数据库供应商是很少见的现象,无论您的应用程序是否识别数据库,这都会涉及到相当多的数据移植工作。

用于 PHP 的两种最流行的数据库封装/抽象库是 PEAR::DB(从 http://pear.php.net/ 获取)和 ADODB(从 http://php.weblogs.com/adodb 获取)。不管这两种实施方法的流行程度(和品质)怎么样,,我通常从头开始实施自己的数据库打包的库。我不需要 ADODB 或 PEAR::DB 中的很多高级特性,而保持库的简单性可以使它速度更快并且更易于维护。没有复杂的特性,一个紧密的库可以用大约 100 行代码来完成它。如果提供了 Oracle 数据库和语句句柄中所执行的信息量,则我更喜欢面向对象的封装,尽管我也曾看到过效果良好的程序性封装。

清单 1显示了一个完整的打包的库,它包含一个围绕数据库连接的包 (DB_Oracle) 和一个围绕游标的包 (DB_OracleStatement)。

这些类的目标是使对数据库交互操作的管理变得简单、直接和清晰。以下显示了怎么样使用它们来执行一个简单的查询:

<?php
include_once("DB_Oracle.inc");
$dbh =& new DB_Oracle('scott', 'tiger', 'testdb');
$stmt =& $dbh->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(array(':name' => 'george'));
$result = $stmt->fetch();
// ...
?>

由于封装是面向对象的,通过对类进行扩展,可以轻易隐藏所有的连接参数。这对于提供一个简单的、无参数的连接类非常有用,如下所示:

class DB_Oracle_Test extends DB_Oracle {
var $user = "scott";
var $pass = "tiger";
var $tnsname = "testdb";

function DB_Oracle_Test() {}
}

这个新类向程序员隐藏了所有的连接标准,允许透明地更改实例的 TNSNAME 或连接标准。还要注意怎么样向用户隐藏 OCISetPreFetch() 调用。如果您需要删除它,或者需要添加另一个连接修改器,其操作很容易,并且对您的所有连接起作用。这就是使用打包的库的价值。

使您的进程更加高效

在文章的开始部分,我提到我将帮助您不遗漏在 Apache 中为满足可伸缩性需求而减少的子进程。利用更少资源来完成任务的三种最简单方法是:

  1. 更快地完成任务。任何人都会告诉您,增加工作负载的最快方法是更快地完成现有的工作。无论是安装编译器高速缓存、配置代码还是调整数据库查询,您能够从应用程序中取得的任何性能增益都会在可伸缩性方面得到回报。
  2. 将某些任务转包给专家。例如,网站通常包含动态组件(您的 PHP 脚本就是这种组件)和静态组件(图像和非动态 HTML)。访问 Oracle 的 Apache 实例在服务于静态内容时,您受到严格的约束,这是在浪费时间。可将它外包给专用于处理这类负载的 Web 服务器。
  3. 完全跳过工作。分析应用程序时经常会发现一些数据库驱动的组件,这些组件不必为每个请求而从数据库生成。找到这些组件并尽可能将其重新设计为静态组件,这样会显著提高性能和可伸缩性。

     如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



    上一篇:使用 PHP 和 Oracle 开发企业应用程序   下一篇:PHP 5 数据对象 (PDO) 抽象层与 Oracle

    文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号