我们正在开发一个PHP项目,该项目已经开发了2年多,现在团队已经准备好并且感觉愿意将开发转换为ORM。因为它确实加快了开发速度并允许您按对象操作,而不是在大多数时间考虑SQL代码和数据库表。
我们决定选择Doctrine ORM,因为它有YAML数据夹具加载 - 我们非常需要它来进行单元测试。
我担心的主要问题是使用新的ORM框架会降低网站的性能。我们无法在当前数据库抽象层(使用pg_connect
语法,而不是PDO - 兼容)之间建立共享连接。数据库连接机制无法切换到PDO兼容,因为有许多SQL代码与PDO_SQLITE语法不兼容。
因此,据我所知,如果我们开始使用它,它将使数据库连接数增加一倍。我不确定数据库服务器是否能够处理这个问题。
在这种情况下,您建议我们做什么?
答案 0 :(得分:1)
PDO_SQLITE的相关性是什么?
除非您实际计划使用SQLite驱动程序,否则PDO不会强制要求兼容性。
如果您不打算使用SQLite,那么我将使旧数据库层PDO兼容并重新使用这些连接,直到您可以完全迁移到Doctrine。
也就是说,连接级别不会成为您转向ORM的唯一性能问题。它们本身效率低下,所以我期望查询速度变慢,应用程序服务器和数据库服务器之间的带宽使用量增加,以及应用程序级别的内存使用量增加,因为冗余数据不可避免地被选中。 根据您当前的设置,上述内容可能是也可能不是问题。
你应该把最后一段用一小撮盐拿走,因为它们只是ORM的特征,而不是特别是Doctrine,我没有经验。
答案 1 :(得分: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?
中写了更多相关内容我不是说你不应该这样做。只是不要认为它会解决你所有的问题。此外,由于这种重写实际上根本不会改变功能(从你所描述的内容),我不确定这样做的成本是否与修复已经存在的成本相比是有利的。太多未知数,无法说出你的情况会走向何方。
答案 2 :(得分:0)
嗯,是的,不是 - 只要您同时拥有非PDO和PDO连接,您的数据库连接就会加倍。
我不确定您对PDO_SQLITE引用的意思,因为SQLite与您现在使用的PostgreSQL完全不同。
您应该能够像今天一样通过PDO :: query运行当前查询,除非您做了一些非常错误的事情:)