【问题标题】:Class::DBI - does it load all tables?Class::DBI - 它会加载所有表吗?
【发布时间】:2018-06-27 19:21:13
【问题描述】:

我们有一个包含大量表的 MySQL 数据库。不幸的是,在 2018 年,我们仍然使用 Perl CGI。所以脚本的加载时间是必不可少的。

DBIx::Class 被我排除在外,因为它加载了大约 1.6 秒(因为它加载了数据库的 所有 表的 Perl 定义,所以很长)显然太多了。

Class::DBI 的加载速度有多快?我的主要问题:当我们使用Class::DBI 时,Perl 是否会加载有关所有可用表的信息(如DBIx::Class),还是仅为我们实际使用的这些表加载 Perl 定义?


以下是加载 1.6 秒的 DBIx::Class 代码:

#!/usr/bin/perl

package MyApp::Schema;
use lib '.../ORMs/dbix-class';
use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_namespaces();

1;

(架构是自动生成的。)

有什么方法可以加快速度吗?如何在不加载所有表的情况下使用它?

【问题讨论】:

  • 为什么不切换到快速 CGI?用最少的努力,这 1.6 秒就变得无关紧要了
  • 如果您向我们展示您使用 DBIx::Class 的代码太慢,这可能会很有用。使用模式信息初始化 DBIx::Class 有不同的方法,并且不需要加载所有表。您还可以只为您关心的应该更快加载的表设置静态定义。
  • @ikegami 如果他们在共享托管环境中,他们可能无法做到这一点。
  • @GrantMcLean 请解释如何在不加载所有表的情况下初始化DBIx::Class。我已经编辑了问题

标签: profiling perl class-dbi


【解决方案1】:

我真的不推荐Class::DBI。它已经有 12 年没有维护了 - 每个人都切换到 DBIx::Class 是有充分理由的。

我强烈建议您解决导致您仍在使用 CGI 的问题。例如,是什么阻止您使用CGI::Emulate::PSGI 将您的 CGI 代码简单地转换为 PSGI 应用程序,然后您可以将其部署在 FastCGI 之类的持久环境中,或者更好的是,作为您可以使用 nginx 访问的独立服务?这些解决方案中的任何一个都意味着 DBIx::Class 加载时间不再是问题。

显然,我不知道是什么让你与 CGI 联系在一起。但是,根据我的经验,迁移到 PSGI 解决方案通常比人们预期的要容易,而且无疑会让您处于更好的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2013-08-29
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多