代码点火器多个数据库连接会减慢我的页面速度.我必须关闭连接吗?哪里



我正在使用CodeIgniter 3.0作为Web应用程序。 我有 2 个数据库,在同一台服务器上(我猜),但有 2 个不同的主机名。 我不使用第二个数据库,除了一种用户。

当这种用户连接到 Web 应用程序时,页面需要很长时间才能显示,但对于我的其他用户来说,没问题,所以我想这是一个多数据库连接问题。

在我的数据库.php文件中,我写入了 2 个数组,包括数据库信息。 在使用第二个数据库的模型文件中,我只写这样的东西:

$db1 = $this->load->database('db1', TRUE);
...
// I do my query as usual
$db1->...
...
return $db1->get();

我不关闭连接。

问题:

1)在每个页面中,我使用第二个数据库的几个函数。这个问题是由于与我的第二个数据库的多个连接造成的吗?

2) 我是否必须在返回之前关闭函数模型中的连接?还是在控制器中连接和断开连接?

3)我看到了CI重新连接功能,但是如何很好地使用它?要重新连接,我必须先连接,但首先在哪里连接?

4)或者你认为问题是由其他原因引起的,比如一些错误的SQL查询?

让我们一次回答一个问题,我会发表评论。

1)在每个页面中,我使用第二个数据库的几个函数。是 这个问题是由于与我的第二个数据库的多个连接?

我说不,因为我多次使用相同的多数据库方法,并且从未见过性能下降。此外,如果性能下降是一个常见问题,就会有很多在线投诉和人们寻找解决方案。我没见过。(我花了太多时间帮助人们使用CodeIgniter。

2)我是否必须在函数模型中关闭连接,只需 在返回之前?还是在 控制器?

如果关闭连接确实有帮助,那么何时关闭连接的答案取决于逻辑的整体结构。例如,如果控制器使用同一模型中的多种方法,则创建一个页面,然后关闭控制器中的连接。另一方面,如果只使用一种模型方法创建给定页面,则关闭模型中的连接。

您不想做的是在构建页面时反复打开和关闭数据库连接。

3)我看到了CI重新连接功能,但是如何很好地使用它?自 重新连接,我必须先连接,但首先在哪里连接?

仅当数据库服务器由于空闲时间过长而断开连接时,reconnect()才有用。当您开始收到"无数据库连接"或"无法连接到数据库"错误时,您将知道需要使用reconnect()

4)或者你认为问题是由其他原因引起的,比如一些错误的SQL查询?

因为您询问的其他方法无济于事,这是最强的可能性。同样,我的推理是因为使用多个数据库连接时我从未遇到过此问题。

我建议您对第二个数据库的查询进行一些性能分析。查看以下文档以获取帮助。

分析您的应用程序

基准测试类

页面加载缓慢的原因有很多,使用第二个数据库可能只是一个巧合。

关于关闭连接

问题是,"如果我不自己关闭数据库连接,CI 会为我做,但是什么时候?

答案可以在PHP手册中找到,"当PHP脚本完成执行时,打开的非持久性MySQL连接和结果集会自动销毁。 这句话来自mysqli文档,但是,据我所知,对于PHP的所有数据库扩展都是如此,即Oracle,Mssql,PDO等。

简而言之,数据库连接关闭被烘焙到 PHP 中,并在脚本完成时发生。在 CI 中,脚本在控制器返回后不久完成。(检查/system/core/Codeigniter的末尾.php如果您想查看控制器返回时会发生什么。实际上,控制器返回或多或少是"加载页面后"的另一种说法。

除非您碰巧使用持久连接(通常是个坏主意),否则您很少需要显式关闭数据库连接。自己关闭查询的一个原因是,当处理查询结果需要大量(实际上很多)时间时。手动关闭连接将有助于确保Web 服务器在大量使用时不会达到其连接限制。

要确定"真正很多"的含义,您必须考虑多个因素,即数据库服务器允许的连接数,处理时间与数据库空闲连接丢失持续时间的比较以及站点需要处理的流量。

可能还有其他考虑因素。我不是数据库性能调优专家。

最新更新