123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- <?php
- class LtDbConnectionManager
- {
- /**
- * Connection management
- * array(
- * "connection" => connection resource id,
- * "expire_time" => expire time,
- * "schema" => default schema name,
- * "charset" => char set / encoding
- * )
- */
- static public $connectionPool;
- public $configHandle;
- protected $connectionAdapter;
- protected $sqlAdapter;
- private $servers;
- public function getConnection($group, $node, $role = "master")
- {
- if(empty($this->servers))
- {
- $this->servers = $this->configHandle->get("db.servers");
- }
- if (($connection = $this->getNewConnection($group, $node, $role)) ||($connection = $this->getCachedConnection($group, $node, $role)))
- {
- return array(
- "connectionAdapter" => $this->connectionAdapter,
- "connectionResource" => $connection
- );
- }
- else
- {
- trigger_error("db server can not be connected: group=$group, node=$node, role=$role", E_USER_ERROR);
- return false;
- }
- }
- protected function getConnectionKey($connConf)
- {
- return $connConf['adapter'] . $connConf['host'] . $connConf['port'] . $connConf['username'] . $connConf['dbname'];
- }
- protected function saveConnection($connConf, $connection, $ttl)
- {
- $connectionInfo = array(
- "connection" => $connection,
- "expire_time" => time() + $ttl,
- "schema" => $connConf["schema"],
- "charset" => $connConf["charset"],
- );
- self::$connectionPool[$this->getConnectionKey($connConf)] = $connectionInfo;
- }
- protected function getCachedConnection($group, $node, $role)
- {
- foreach($this->servers[$group][$node][$role] as $hostConfig)
- {
- $key = $this->getConnectionKey($hostConfig);
- if(isset(self::$connectionPool[$key]) && time() < self::$connectionPool[$key]['expire_time'])
- {//cached connection resource FOUND
- $connectionInfo = self::$connectionPool[$key];
- if ($connectionInfo["schema"] != $hostConfig["schema"] || $connectionInfo["charset"] != $hostConfig["charset"])
- {//检查当前schema和charset与用户要操作的目标不一致
- $hostConfig = $this->servers[$group][$node][$role][$hostIndexArray[$hashNumber]];
- $dbFactory = new LtDbAdapterFactory;
- $this->connectionAdapter = $dbFactory->getConnectionAdapter($hostConfig["connection_adapter"]);
- $this->sqlAdapter = $dbFactory->getSqlAdapter($hostConfig["sql_adapter"]);
- if ($connectionInfo["schema"] != $hostConfig["schema"])
- {
- $this->connectionAdapter->exec($this->sqlAdapter->setSchema($hostConfig["schema"]), $connectionInfo["connection"]);
- }
- if ($connectionInfo["charset"] != $hostConfig["charset"])
- {
- $this->connectionAdapter->exec($this->sqlAdapter->setCharset($hostConfig["charset"]), $connectionInfo["connection"]);
- }
- $this->saveConnection($hostConfig, $connectionInfo["connection"], $hostConfig["connection_ttl"]);
- }
- return $connectionInfo["connection"];
- }
- }
- return false;
- }
- protected function getNewConnection($group, $node, $role)
- {
- $hostTotal = count($this->servers[$group][$node][$role]);
- $hostIndexArray = array_keys($this->servers[$group][$node][$role]);
- while ($hostTotal)
- {
- $hashNumber = substr(microtime(),7,1) % $hostTotal;
- $hostConfig = $this->servers[$group][$node][$role][$hostIndexArray[$hashNumber]];
- $dbFactory = new LtDbAdapterFactory;
- $this->connectionAdapter = $dbFactory->getConnectionAdapter($hostConfig["connection_adapter"]);
- $this->sqlAdapter = $dbFactory->getSqlAdapter($hostConfig["sql_adapter"]);
- if ($connection = $this->connectionAdapter->connect($hostConfig))
- {
- $this->connectionAdapter->exec($this->sqlAdapter->setSchema($hostConfig["schema"]), $connection);
- $this->connectionAdapter->exec($this->sqlAdapter->setCharset($hostConfig["charset"]), $connection);
- $this->saveConnection($hostConfig, $connection, $hostConfig["connection_ttl"]);
- return $connection;
- }
- else
- {
- //trigger_error('connection fail', E_USER_WARNING);
- //delete the unavailable server
- for ($i = $hashNumber; $i < $hostTotal - 1; $i ++)
- {
- $hostIndexArray[$i] = $hostIndexArray[$i+1];
- }
- unset($hostIndexArray[$hostTotal-1]);
- $hostTotal --;
- }//end else
- }//end while
- return false;
- }
- }
|