2

我们正在开发一个 PHP 项目,该项目已经开发了 2 年多,现在团队已准备好并愿意将开发切换到 ORM。因为它确实加快了开发速度,让您可以通过 Objects 来操作,而不是大多数时候考虑 SQL 代码和数据库表。

我们决定选择Doctrine ORM,因为它加载了 YAML 数据夹具——我们非常需要它来进行单元测试。

我主要担心的是,使用新的 ORM 框架会降低网站的性能。我们无法在当前数据库抽象层(使用pg_connect语法,不兼容PDO )之间建立共享连接。数据库连接机制不能切换到PDO-compatible,因为有很多SQL代码不兼容PDO_SQLITE语法。

因此,据我了解,如果我们开始使用它,它将使数据库连接数增加一倍。我不确定数据库服务器是否能够处理这个问题。

在这种情况下,您会建议我们做什么?

4

3 回答 3

1

PDO_SQLITE 有什么相关性?

除非您确实计划使用 SQLite 驱动程序,否则 PDO 不强制要求兼容性。

如果您不打算使用 SQLite,那么我将使遗留数据库层 PDO 兼容并重新使用连接,直到您可以完全迁移到 Doctrine。

也就是说,连接级别不会是您迁移到 ORM 的唯一性能问题。它们本质上是低效的,因此我预计查询速度会变慢,应用程序服务器和数据库服务器之间的带宽使用量会更高,并且由于不可避免地会选择冗余数据,因此应用程序级别的内存使用量会更高。根据您当前的设置,上述可能是也可能不是问题。

不过,您可能应该对最后一段有所保留,因为它们只是一般的 ORM 的特征,而不是特别的 Doctrine,我没有经验。

于 2009-03-06T13:00:11.703 回答
1

您可以做的显而易见的事情是在您需要之前不要打开数据库连接。我个人使用这样的代码:

public function connect() {
  if (!defined('CONNECT')) {
    mysql_connect(...);
  }
}

public function db_query($query) {
  connect();
  $ret = mysql_query($query);
  if (!$ret) {
    die(mysql_error());
    error_log(mysql_error() . ' - ' . $query);
  }
  return $ret;
}

减少重复次数并仅在需要时打开连接。

在你的情况下,你需要打破你可以开始的最小块。理想情况下,它应该是一个垂直切片,这意味着该切片将使用新代码完成几乎所有的数据库工作,而很少使用旧代码。通过这种方式,您可以最大限度地减少数据库连接的增加,这可以让您积累一些技能并获得一些经验。

但请注意,ORM 绝不是灵丹妙药。您可能讨厌 SQL 并发现它繁琐且容易出错,但在大多数情况下,您只是简单地将一组问题换成另一组问题。我个人认为,虽然 ORM 可能有用,但它被夸大了,而且比许多人意识到或愿意承认的更虚假经济。我在Using an ORM or plain SQL?

我不是说你不应该这样做。只是不要以为它会解决你所有的问题。此外,由于这种重写实际上根本不会改变功能(根据您所描述的),我不确定这样做的成本是否与修复已有的成本相比更有利。太多的未知数无法说明您的情况会如何发展。

于 2009-03-06T13:04:54.187 回答
0

好吧,是也不是——只要您同时拥有非 PDO 和 PDO 连接,您的 DB 连接只会翻倍。

我不确定您对 PDO_SQLITE 参考的意思是什么,因为 SQLite 是一个与您现在正在使用的 PostgreSQL 完全不同的数据库。

您应该能够像今天一样通过 PDO::query 运行当前查询,除非您做错了什么:)

于 2009-03-06T13:11:29.757 回答