Php-到Mysql的连接池
我想以类似于java的方式在Php中实现连接池 为什么我需要这个:Php-到Mysql的连接池,php,mysql,connection-pooling,connection-pool,Php,Mysql,Connection Pooling,Connection Pool,我想以类似于java的方式在Php中实现连接池 为什么我需要这个: 让我们考虑流量 Step1: Connection To Db --- Resource Id #12 Step2: some computation... time taking .3 seconds Step3: Query on Solr .... timing taking 2 seconds Step4: Connection To Db --- Resource Id #12 (i am using same re
让我们考虑流量
Step1: Connection To Db --- Resource Id #12
Step2: some computation... time taking .3 seconds
Step3: Query on Solr .... timing taking 2 seconds
Step4: Connection To Db --- Resource Id #12 (i am using same resource id)
Step5: Exit
尽管在步骤4中,我使用的是与步骤1相同的DB资源。但是,对于step2和step3,连接都将进入睡眠状态,因此在退出之前,任何其他PHP进程(其他客户端)都不能使用连接
解决方案:
请建议将可伸缩性技术应用于此池模型的一种方法是允许对池分布进行动态更改。如果由于某种原因,您有一个非常流行的permalink,您可以将从属服务器从主池移动到注释池来帮助它。通过隔离负载,您成功地为自己提供了更大的灵活性。您可以向任何池添加从属服务器,在池之间移动从属服务器,最后拨入您当前流量级别所需的性能 MySQL数据库池还有一个额外的好处,那就是查询缓存的命中率要高得多。MySQL(和大多数数据库系统)内置了查询缓存。此缓存保存最近查询的结果。如果重新执行相同的查询,则可以快速返回缓存的结果 如果您有20个数据库从机,并且在一行中执行同一查询两次,则只有1/20的机会命中同一从机并获得缓存结果。但是,通过将特定类别的查询发送到一组较小的服务器,您可以大大增加缓存命中的机会并获得更高的性能 您需要在代码中处理数据库池,这是第1部分中基本负载平衡代码的自然扩展。让我们看看如何扩展该代码以处理任意数据库池:
<?php
class DB {
// Configuration information:
private static $user = 'testUser';
private static $pass = 'testPass';
private static $config = array(
'write' =>
array('mysql:dbname=MyDB;host=10.1.2.3'),
'primary' =>
array('mysql:dbname=MyDB;host=10.1.2.7',
'mysql:dbname=MyDB;host=10.1.2.8',
'mysql:dbname=MyDB;host=10.1.2.9'),
'batch' =>
array('mysql:dbname=MyDB;host=10.1.2.12'),
'comments' =>
array('mysql:dbname=MyDB;host=10.1.2.27',
'mysql:dbname=MyDB;host=10.1.2.28'),
);
// Static method to return a database connection to a certain pool
public static function getConnection($pool) {
// Make a copy of the server array, to modify as we go:
$servers = self::$config[$pool];
$connection = false;
// Keep trying to make a connection:
while (!$connection && count($servers)) {
$key = array_rand($servers);
try {
$connection = new PDO($servers[$key],
self::$user, self::$pass);
} catch (PDOException $e) {}
if (!$connection) {
// Couldn’t connect to this server, so remove it:
unset($servers[$key]);
}
}
// If we never connected to any database, throw an exception:
if (!$connection) {
throw new Exception("Failed Pool: {$pool}");
}
return $connection;
}
}
// Do something Comment related
$comments = DB::getConnection('comments');
. . .
?>
您签出multiquery了吗?增加最大连接数…@salketter max connection如何帮助我重用睡眠连接。增加最大连接数是最糟糕的opotion@Will阅读问题“我希望睡眠连接被另一个客户端重用”。好吧,一个PHP脚本不能重用另一个PHP脚本的连接。。。这根本不会发生。您希望创建最少数量的连接的唯一原因是因为您超出了限制,因此我建议您增加连接。