-1

我想以与 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 resource id) 
Step5: Exit

虽然在第 4 步中,我使用与第 1 步相同的数据库资源。但是,对于 step2 和 step3,连接将进入睡眠状态,因此在退出之前不能被任何其他 PHP 进程(其他客户端)使用。

解决方案:

  1. 在查询被触发后每次都使用 mysql_close:缺点:每次都需要连接,因此很耗时

  2. 创建一个 java 服务来处理查询(可能但太耗时,我正在寻找其他需要迁移查询的解决方案)

  3. 需要像第三方一样探索 SQL 中继,但我不确定这是否会成功,并且没有多少好的公司使用它

  4. mysql_pconnect 没有解决我的问题。

请建议

4

1 回答 1

0

您可以将可伸缩性技术应用于此池模型的一种方法是允许动态更改您的池分布。如果您有一个由于某种原因非常受欢迎的特定永久链接,您可以将奴隶从主池移动到评论池以帮助它。通过隔离负载,您已经设法给自己更多的灵活性。您可以将从属服务器添加到任何池中,在池之间移动它们,最后在当前流量级别下拨入所需的性能。

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');
    . . . 

    ?>
于 2017-08-28T12:53:15.270 回答