Skip to content

helpManual dbLink

tolizhan edited this page Jul 6, 2023 · 8 revisions

数据库连接

内置方法

&of_db::pool($key, $pool = null, $value = null)读取/设置连接池

参数使用
#创建连接池(数组)
 key  : 连接池名称
 pool : 连接参数, 若key已创建过, 便不起作用, 与_of.db 配置结构相同

#读取连接池(null)  key  : 连接池名称

#查询事务层次(文本), 每开启事务会加一, 完结事务会减一  key  : 连接池名称  pool : 固定"level"

#检查连接是否正常(文本)  key  : 连接池名称  pool : 固定"ping"  val  : 默认null=未初始化返回false, true=初始化连接

#查询事务最终提交状态(文本), 当SQL执行失败, 状态自动改false  key  : 连接池名称  pool : 固定"state"  val  : 默认null=读取状态, false=强制最终回滚

#重命名指定连接池(文本)  key  : 连接池名称  pool : 固定"rename"  val  : 新连接池名, 若新名已存在, 则会替换

#克隆连接池(文本)  key  : 连接池名称  pool : 固定"clone"  val  : 新连接池名, 若名称已存在, 会将原连接改名唯一值

#关闭并删除指定连接池(文本)  key  : 连接池名称  pool : 固定"clean"  val  : 清理方式, 默认null=全部清理, 1=仅清理事务

#读取运行连接信息  key  : 固定null

对应返回
#创建连接池(数组)
#读取连接池(null)
 返回连接池结构, 如果失败则报错并结束脚本

#查询事务层次("level")  不在事务中返回0, 一层事务返回1, ...

#检查连接是否正常("ping")  连接正常返回true, 反之false

#查询事务最终提交状态("state")  最终提交事务true, 反之false

#克隆连接池("clone")  若克隆名已存在, 返回原连接改名的唯一值

#读取运行连接信息(key为null时) {     连接名称 : {         "level" : 同查询事务层次("level"),         "state" : 同查询事务最终提交状态("state")     }, ... }

  • &of_db::sql($sql, $key = 'default')执行sql语句,根据不同语句返回不同结果

    sqlstring
    一条SQL语句
    keystring
    指定 框架配置['db'] 中的键或者 of_db::pool 设置的键
    <?php
    /**
      描述 : 执行sql语句,根据不同语句返回不同结果
           sql : 字符串 = 执行传入的sql
                 null   = 开启事务, 支持嵌套事务
                 true   = 提交事务,
                 false  = 回滚事务, 若子事务回滚,则父事务也回滚,而非Savepoint方式
           key : 连接池区分符, 默认=default
      返回 :
           sql为字符串时 : 若SQL执行失败, 则所在的事务最终会回滚
               存储类,返回三维数组    CALL
               查询类,返回二维数组    SELECT
               插入类,返回插入ID      INSERT
               删改类,返回影响行数    UPDATE
           sql为其它时 : 成功返回 true, 失败返回 false
     /
    of_db::sql('SELECT 1 a');                       //使用默认连接池查询SQL
    of_db::sql('SELECT 1 a', 'test');               //使用test连接池查询SQL
    of_db::sql('/call/SELECT 1 a;SELECT 2 b');    //使用CALL模式,返回三维数组

错误跟踪

框架配置 db.xxx.params.errorTrace 开关

/*
  错误跟踪(errorTrace)配置结构 : 数字=记录所有加锁SQL的前n条, 数组=[
       //默认n=0关闭, n>0记录前n条加锁SQL, n<0不记录SQL
       0,
       //正则匹配加锁SQL, 针对性跟踪表有利于提升系统性能
       '@.@'
  ]
 /
跟踪超时错误代码逻辑(需mysql >= 5.5 和 PROCESS权限)
/
  锁超时被阻列表结构错误日志 : {
      "requestId" : 请求被阻的连接ID
      "lockInfo"  : 阻塞信息结构 {
          被阻时间@阻塞ID : {
              "rWait" : 被阻ID等待时间
              "bInfo" : 递归阻塞, 同阻塞结构
          }, ...
      },
      "lockSqls"  : 阻塞ID执行SQL {
          阻塞ID : 加锁的SQL清单, 最大数量由errorTrace配置控制 [
              执行时间 > 执行SQL,
              ...
          ]
      },
      "lockTrace" : 阻塞逻辑跟踪 {
          阻塞ID : 代码执行逻辑,
          ...
      }
  }
 /
以下日志说明 :
1. 连接"114"在"2020-09-05 13:37:21"被连接"112"阻塞了"9"秒
2. 连接"112"在"2020-09-05 13:37:10"被连接"110"阻塞了"8"秒
3. 连接"112"在"2020-09-05 13:37:20"被连接"111"阻塞了"10"秒
Array(
    [requestId] => 114
    [lockInfo] => Array(
        [2020-09-05 13:37:21@112] => Array(
            [rWait] => 9
            [bInfo] => Array(
                [2020-09-05 13:37:10@110] => Array(
                    [rWait] => 8
                )
                [2020-09-05 13:37:20@111] => Array(
                    [rWait] => 10
                )
            )
        )
    )
)
跟踪死锁错误代码逻辑(需mysql >= 5.0 和 PROCESS权限)
/*
  死锁冲突列表结构错误日志 : {
      "requestId" : 当前回滚连接ID
      "lockSqls"  : 冲突ID执行SQL {
          冲突ID : 加锁的SQL清单, 最大数量由errorTrace配置控制 [
              执行时间 > 执行SQL,
              ...
          ]
      },
      "lockTrace" : 冲突逻辑跟踪 {
          冲突ID : 代码执行逻辑,
          ...
      },
      "lockLogs"  : 死锁日志文本
  }
 */

接口对接

  1. 是通过不同方式连接不同数据的方案
  2. 对接文件存储在 OF_DIR . '/accy/db' 下
  3. 所有对接文件继承 of_db 类
  4. 对接文件可以调用 $this->params 获取连接参数
  5. 对接文件要实现以下方法

abstract protected function _connect();连接到数据库

abstract protected function _close();关闭连接源

abstract protected function _ping($mode);检查连接是否正常, false=判断并延长时效, true=非事务尝试重连

abstract protected function _error(); 读取当前错误,返回 {"code" : 错误编码, "info" : 错误信息, "note" : 详细日志);
在死锁时, 可使用 PROCESS 权限, 将死锁日志记录到"详细日志"中

abstract protected function _affectedRows();查看影响行数

abstract protected function _lastInsertId();获取最后插入ID

abstract protected function _begin();开启事务, 成功返回true, 失败抛出异常

abstract protected function _commit();提交事务

abstract protected function _rollBack();事务回滚

abstract protected function _free();释放内存

abstract protected function _query(&$sql);执行sql语句, 成功返回true, 失败返回false

abstract protected function &_fetch();读取一行数据, 失败返回空数组

abstract protected function &_fetchAll();读取全部数据, 失败返回空数组

Clone this wiki locally