Skip to content

helpManual dbLink

tolizhan edited this page May 31, 2024 · 8 revisions

数据库连接

内置方法

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

参数使用
#读取运行连接信息(key为null)
 key  : 固定null

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

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

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

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

#查询连接信息(pool为"info")  key  : 连接池名称  pool : 固定"info"

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

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

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

#关闭并删除指定连接池(pool为"clean")  key  : 连接池名称  pool : 固定"clean"  val  : 清理方式, 默认null=销毁连接池, 1=仅关闭连接

对应返回
#读取运行连接信息(key为null时) {
     连接名称 : {
         "level" : 嵌套的层次, 数据库未连接为 0
         "state" : 嵌套未回滚, 数据库未连接为 null
         "tzId"  : 时区标识符, 数据库未连接为 ''
     }, ...
 }

#创建连接池(pool为数组)  $instList.连接池名.pool 结构

#读取连接池(pool为null)  key有效返回$instList.连接池名.pool 结构, 否则报错

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

#查询事务最终提交状态(pool为"state")  不在事务中null, 最终提交事务true, 反之false

#查询连接信息(pool为"info")  数据库未连接为 null, 已连接返回 key为null 结构

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

#克隆连接池(pool为"clone")  若克隆名($val)已存在, 返回原连接改名的唯一值, 否则为null

  • &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