持久性数据库连接-是或者否?
我正在使用PHP的PDO层在项目中进行数据访问,并且我一直在阅读它,并发现它对持久性数据库连接具有良好的先天支持。我想知道何时/是否应该使用它们。我会在拥有大量CRUD的应用程序中看到性能优势吗?是否有不利因素要考虑,也许与安全性有关?
如果对我们来说很重要,我正在使用MySQL5.x。
解决方案
回答
创建与数据库的连接是相当昂贵的操作。持久连接是一个好主意。在ASP.Net和Java世界中,我们有"连接池",这几乎是同一件事,也是一个好主意。
回答
IMO,这个问题的真正答案是最适合应用程序。我建议我们同时使用持久性连接和非持久性连接对应用程序进行基准测试。
玛吉·尼尔森(Maggie Nelson)在8月发布了有关此问题的客观报道,罗伯特·斯沃索特(Robert Swarthout)随行写了一些硬数字。两者都是不错的读物。
回答
我们可以将其用作粗略的"规则集":
是的,如果存在以下情况,请使用持久连接:
- 只有很少的应用程序/用户访问数据库,即我们不会导致200个打开(但可能是空闲)的连接,因为在同一主机上共享200个不同的用户。
- 数据库正在我们通过网络访问的另一台服务器上运行
- 一个(一个)应用程序经常访问数据库
不,如果出现以下情况,请不要使用持久连接:
- 应用程序每小时只需要访问数据库100次。
- 我们有许多Web服务器正在访问一台数据库服务器
- 我们在prefork模式下使用Apache。它为每个子进程使用一个连接,该连接可以快速启动。 (通过@Powerlord在评论中)
使用持久连接的速度要快得多,尤其是在通过网络访问数据库时。如果数据库在同一台计算机上运行,并不会有太大的区别,但是它仍然要快一些。但是,顾名思义,连接是持久的,即即使不使用它也保持打开状态。
问题在于,在"默认配置"中,MySQL仅允许1000个并行的"开放通道"。此后,将拒绝新的连接(我们可以调整此设置)。因此,如果我们说有20个Web服务器,每个服务器上有100个客户端,并且每个服务器每小时只有一次页面访问,那么简单的数学就会告诉我们,我们将需要2000个并行连接到数据库。那行不通。
Ergo:仅将其用于具有大量请求的应用程序。
回答
在我的愚见:
当使用PHP进行Web开发时,大多数连接将在页面执行的整个过程中"保持有效"。持久性连接将花费大量的开销,因为我们必须将其放入会话或者类似的东西。
在页面执行结束时终止的单个非持久连接在99%的时间中都可以正常工作。
另外1%的时间,我们可能不应该在应用程序中使用PHP,并且没有完美的解决方案。
回答
我本来要问同样的问题,但是我不会再问同样的问题,我只会添加一些我发现的信息。
- PHP持久连接是否有害?
- 持久数据库连接
还值得注意的是,较新的mysqli扩展甚至不包括使用持久数据库连接的选项。
我目前仍在使用永久连接,但计划在不久的将来切换为非永久连接。
回答
通常,我们有时需要使用非持久连接,并且将单个模式应用于数据库连接设计是很好的(只要在上下文中使用持久连接的上行空间相对较小)。
回答
简而言之,根据我的经验,应该尽可能避免持久连接。
请注意,对于使用mysql_pconnect创建的连接,mysql_close是空操作(no-op)。这意味着客户端无法随意关闭持久连接。当持续时间超过wait_timeout的连接上未发生任何活动时,该连接将被mysqldb服务器关闭。如果wait_timeout是一个很大的值(例如30分钟),则mysql db服务器可以轻松达到max_connections限制。在这种情况下,mysql db将不接受任何将来的连接请求。这是寻呼机开始发出哔哔声的时候。
为了避免达到max_connections限制,使用持久连接需要仔细平衡以下变量...
1. Number of apache processes on one host 2. Total number of hosts running apache 3. wait_timout variable in mysql db server 4. max_connections variable in mysql db server 5. Number of requests served by one apache process before it is re-spawned
因此,请在充分考虑后使用持久连接。我们可能不想邀请复杂的运行时问题来获得持久连接带来的小收益。