数据库连接

内置方法

&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

错误跟踪

框架配置 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();读取全部数据, 失败返回空数组