为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。 【DM版本】:dm8 【操作系统】: 【CPU】: 【问题描述】*: 服务器上存在存在两个达梦数据库(负载均衡),要求thinkphp框架的model查询在连接第一个数据库查询不到数据的时候自动连接到第二个达梦数据库进行查询。 如:model(test)->find(); 先查第一个数据库,第一个没数据后在自动连接第二个数据库查找,要怎么配置或者更改才能成功
在ThinkPHP框架中实现达梦数据库双节点自动切换查询,可通过以下方案实现:
一、基础配置(config/database.php)
return [ 'connections' => [ 'dm1' => [ 'type' => 'dm', // 需确保已安装达梦PDO驱动 'hostname' => '192.168.1.101', 'database' => 'DAMENG', 'username' => 'SYSDBA', 'password' => 'Dameng123', 'charset' => 'utf8', 'port' => 5236, ], 'dm2' => [ 'type' => 'dm', 'hostname' => '192.168.1.102', 'database' => 'DAMENG', 'username' => 'SYSDBA', 'password' => 'Dameng123', 'charset' => 'utf8', 'port' => 5236, ] ] ];
二、自定义Model基类(app/model/BaseModel.php)
namespace app\model; use think\Model; use think\Db; class BaseModel extends Model { protected $connection = 'dm1'; // 默认连接dm1 public function findWithFallback($data = null) { // 第一次查询主库 $result = $this->find($data); if (empty($result)) { // 切换连接并重新查询 $this->connection = 'dm2'; $result = $this->find($data); // 恢复默认连接 $this->connection = 'dm1'; } return $result; } }
三、业务Model继承基类(app/model/Test.php)
namespace app\model; class Test extends BaseModel { // 自动设置表名(根据实际表名调整) protected $name = 'TEST_TABLE'; // 重写查询方法 public static function find($data = null) { return (new static())->findWithFallback($data); } }
四、调用方式
// 常规查询(自动切换) $data = \app\model\Test::find(1); // 或通过依赖注入 $testModel = new \app\model\Test(); $result = $testModel->findWithFallback(1);
五、高级优化方案
// 在BaseModel中添加连接状态检查 protected function checkSecondaryConnection() { try { Db::connect('dm2')->query('SELECT 1'); return true; } catch (\Exception $e) { // 记录日志并报警 return false; } }
// 通过.env文件管理节点配置 DMHOST1=192.168.1.101 DMHOST2=192.168.1.102
// 在基类中添加查询耗时统计 public function findWithFallback($data = null) { $start = microtime(true); // ...原有逻辑... $this->logQueryTime(microtime(true) - $start); }
六、达梦相关注意事项
确保已安装达梦PHP驱动 wget https://eco.dameng.com/dm8/connector/php/dmdriverfor_php7.3.zip unzip dmdriverfor_php7.3.zip cp -r php73/* /usr/local/php/lib/php/extensions/
'dm1' => [ 'params' => [ \PDO::ATTR_TIMEOUT => 3, // 3秒超时 \PDO::ATTR_PERSISTENT => false // 禁用持久连接 ] ]
SELECT * FROM V$DMINI WHERE PARANAME LIKE '%INSTANCE%';
在ThinkPHP框架中实现达梦数据库双节点自动切换查询,可通过以下方案实现:
一、基础配置(config/database.php)
return [ 'connections' => [ 'dm1' => [ 'type' => 'dm', // 需确保已安装达梦PDO驱动 'hostname' => '192.168.1.101', 'database' => 'DAMENG', 'username' => 'SYSDBA', 'password' => 'Dameng123', 'charset' => 'utf8', 'port' => 5236, ], 'dm2' => [ 'type' => 'dm', 'hostname' => '192.168.1.102', 'database' => 'DAMENG', 'username' => 'SYSDBA', 'password' => 'Dameng123', 'charset' => 'utf8', 'port' => 5236, ] ] ];
二、自定义Model基类(app/model/BaseModel.php)
namespace app\model; use think\Model; use think\Db; class BaseModel extends Model { protected $connection = 'dm1'; // 默认连接dm1 public function findWithFallback($data = null) { // 第一次查询主库 $result = $this->find($data); if (empty($result)) { // 切换连接并重新查询 $this->connection = 'dm2'; $result = $this->find($data); // 恢复默认连接 $this->connection = 'dm1'; } return $result; } }
三、业务Model继承基类(app/model/Test.php)
namespace app\model; class Test extends BaseModel { // 自动设置表名(根据实际表名调整) protected $name = 'TEST_TABLE'; // 重写查询方法 public static function find($data = null) { return (new static())->findWithFallback($data); } }
四、调用方式
// 常规查询(自动切换) $data = \app\model\Test::find(1); // 或通过依赖注入 $testModel = new \app\model\Test(); $result = $testModel->findWithFallback(1);
五、高级优化方案
// 在BaseModel中添加连接状态检查 protected function checkSecondaryConnection() { try { Db::connect('dm2')->query('SELECT 1'); return true; } catch (\Exception $e) { // 记录日志并报警 return false; } }
// 通过.env文件管理节点配置 DMHOST1=192.168.1.101 DMHOST2=192.168.1.102
// 在基类中添加查询耗时统计 public function findWithFallback($data = null) { $start = microtime(true); // ...原有逻辑... $this->logQueryTime(microtime(true) - $start); }
六、达梦相关注意事项
确保已安装达梦PHP驱动 wget https://eco.dameng.com/dm8/connector/php/dmdriverfor_php7.3.zip unzip dmdriverfor_php7.3.zip cp -r php73/* /usr/local/php/lib/php/extensions/
'dm1' => [ 'params' => [ \PDO::ATTR_TIMEOUT => 3, // 3秒超时 \PDO::ATTR_PERSISTENT => false // 禁用持久连接 ] ]
生产环境建议使用达梦DMDSC共享存储集群+读写分离
配置达梦监视器实现自动故障转移
定期检查数据库节点状态:
SELECT * FROM V$DMINI WHERE PARANAME LIKE '%INSTANCE%';