日韩在线观看-日韩在线成人-日韩在线不卡视频-日韩在线不卡视频-国产精品99-国产精品99

開發(fā)者必讀

此部分對于 ORM 的學(xué)習(xí)和使用非常重要。遇到使用問題時(shí),請先確保自己認(rèn)真看完了 ORM 組件的所有使用文檔,在對問題進(jìn)行排查后,實(shí)在不能解決時(shí)再進(jìn)行提問和反饋。

設(shè)計(jì)思想

ORM 全稱:object relational mapping,目的是想像操作對象一樣去操作數(shù)據(jù)庫,是符合面向?qū)ο箝_發(fā)思想的。

如將一條數(shù)據(jù)的插入,映射成一個(gè)對象的實(shí)例化。偽代碼如下所示:

<?php
$user = new UserModel();
$user->setData([
    'attr' => 'value'
]);
$user->insert();

常見問題匯總

重復(fù)使用 Model 對象

一個(gè)對象映射一條數(shù)據(jù),此時(shí)會(huì)有很多用習(xí)慣了 db 封裝組件的小伙伴把 Model 當(dāng)成了 db 封裝使用,重復(fù)調(diào)用一個(gè) Model 對象,如下所示:

<?php
// 錯(cuò)誤使用

// 假設(shè)id自增
$user = new UserModel();

// 插入一條新用戶
$user->setData([
    'attr' => 'value'
]);
$user->insert();

// 插入第二條新用戶,此時(shí)由于重復(fù)調(diào)用同一個(gè)對象,產(chǎn)生報(bào)錯(cuò),自增 id 主鍵重復(fù)
$user->setData([
    'attr' => 'value2'
]);
$user->insert();

ORM 生成復(fù)雜 sql

  1. ORM 是基于 mysqli 3.x 組件實(shí)現(xiàn),內(nèi)部引用 mysqli 組件中的 QueryBuilder 類 完成 sql 的構(gòu)造,并且在 QueryLimit 章節(jié) 注明了閉包函數(shù)使用方式(可直接使用 mysqli 組件中的絕大部分連貫操作,如 having 等特殊條件)

  2. 如果 mysqli 組件的連貫操作也無法滿足您的需求,您有以下幾種方式解決該問題:

    • 使用自定義 sql 執(zhí)行
    • 嘗試給組件貢獻(xiàn)代碼,新增功能特性
    • 提出反饋,我們會(huì)在精力允許和大眾所需時(shí),對組件進(jìn)行維護(hù)升級(jí)

優(yōu)雅刪除數(shù)據(jù)

ORM 設(shè)計(jì)思想中,對數(shù)據(jù)的操作映射為對對象的操作,如果按照此原則,那么需要我們先查詢出對象,然后再調(diào)用對象的 delete() 方法進(jìn)行刪除。

但是對于執(zhí)行效率的消耗來說,此次查詢在部分業(yè)務(wù)場景下是無用的。

那么我們到底是否需要遵守設(shè)計(jì)原則?一般情況下是在 操作前需要校驗(yàn)數(shù)據(jù)是否存在 時(shí)遵守,無需校驗(yàn)則直接根據(jù)刪除條件傳參刪除即可。

設(shè)計(jì)原則代表思想,在某些場景下遵守它需要付出一定代價(jià),開發(fā)者可以根據(jù)喜好去決定是否遵守。

刪除數(shù)據(jù)偽代碼如下所示:

<?php
$user = (new UserModel())->get($param['id']);

if (!$user){
    return '操作數(shù)據(jù)不存在,請檢查再試';
}

$res = $user->delete();

連接預(yù)熱

為了避免連接空檔期突如其來的高并發(fā),我們可以對數(shù)據(jù)庫連接預(yù)熱,也就是 Worker 進(jìn)程啟動(dòng)的時(shí)候,提前準(zhǔn)備好數(shù)據(jù)庫連接。

具體使用可查看 連接預(yù)熱 章節(jié)

斷線問題

為什么會(huì)斷線?

在連接池模式下,一個(gè)連接創(chuàng)建后,并不會(huì)因?yàn)橐驗(yàn)檎埱蠼Y(jié)束而斷開,就好比 php-fpm 下的 pconnect 特性一樣。而一個(gè)連接建立后,可能會(huì)因?yàn)樘脹]有使用(執(zhí)行 sql ),而被 mysql 服務(wù)端主動(dòng)斷開了連接,或者是因?yàn)殒溌穯栴},切斷了連接。而連接被切斷的時(shí)候。我們并不知道這件事。因此就導(dǎo)致了我們用了一個(gè)斷線的數(shù)據(jù)庫連接去執(zhí)行 sql,從而出現(xiàn)斷線錯(cuò)誤或者異常。

如何解決短線問題?

java 全家桶的原理一致,我們需要做的事情就是:

  • 定時(shí)檢查連接是否可用
  • 定時(shí)檢查連接的最后一次使用狀態(tài)

因此在 EasySwooleORM 中,ORM 組件提供了 IntervalCheckTime 配置項(xiàng),它指定的就是多久做一次周期檢查,MaxIdleTime 配置項(xiàng)指的是如果一個(gè)連接超過這個(gè)時(shí)間沒有使用,則會(huì)被回收。AutoPing 配置項(xiàng)指的是多久執(zhí)行一個(gè) select 1 用來觸發(fā)這個(gè)連接,讓這個(gè)連接被 mysql 服務(wù)端標(biāo)記為活躍而不會(huì)被回收。如果經(jīng)常出現(xiàn)斷線,可以適當(dāng)縮短 周期性檢查AutoPing 的時(shí)間(即調(diào)整 IntervalCheckTimeAutoPing 配置項(xiàng)的值)。

百分百不會(huì)斷線了?

理論上,做了上面的步驟,出現(xiàn)使用斷線連接的概率是非常低的,但是并不是真的就百分百穩(wěn)了,比如極端情況:mysql 服務(wù)重啟,或者是鏈路斷線了。因此,我們一定要做類似如下這樣的處理措施:

<?php
try {
    $client = $pool->getClient();
    $cilient->query(xxxxxx);
} catch (\Throwable $t) {}

也就是說,任何 orm 的使用,一定要 try。至于為何,請參考 java 為何強(qiáng)制對任何數(shù)據(jù)庫 iotry 處理。

為何不能做自動(dòng)重連

我們可以看到,在某些自以為很聰明的框架中,有下面這樣的操作:

<?php
$client = $pool->getClient();
try {
    return $client->query();
} catch(\Throwable $t) {
    // 2006 2002 為斷線
    if ($client->getError() == '2006') {
        $client->connect();
        return $client->query();
    } else {
        throw $t;
    }
}

乍一看,沒有什么問題。實(shí)際上,按照上面的重連,我們來看看下面的偽代碼:

<?php
$client = $pool->getClient();
$client->startTransaction();
$client->query(query one);
// client disconnect case network
$client->reconnect();
$client->query(query two);
$client->commit();

這樣,在極端情況下,會(huì)導(dǎo)致 query one 結(jié)果丟失,但是 query two 卻執(zhí)行了,這對于事務(wù)來說,是不可原諒的。此刻又會(huì)有人說,那我判斷下鏈接是不是在事務(wù)中不就好了。實(shí)際上,遠(yuǎn)遠(yuǎn)沒這么簡單。為此,最好的方式就是我們養(yǎng)成良好的習(xí)慣。任何的數(shù)據(jù)庫 io,都做 try 操作,與 java 一致。

主站蜘蛛池模板: 韩国电影《密爱》观看| 双男动漫| midjourney中文版| 肢体的诱惑| 87版七仙女台湾| 同字异音联| 回响电影| 二年级写玩具的作文| 刚满18岁| 男人不可以穷演员表| 条件概率经典例题| a级在线| 书柜效果图大全2023款| 我的老婆又大肚| 老闺蜜电视剧免费观看完整版高清 | 新三国第95集完整版| 特殊的精油按摩1| 布袋头| 纵情欲海电影| 2024微信头像图片新款| xxxxxxxx| 一江深情简谱| 视频污在线观看| 野性狂欢大派对| 台湾卫视| 正义回廊 电影| 红剪花| cctv16体育节目表今天目表| 陕09j01图集| 狗年龄| 孙兴电影| 02j331| 希崎| 重启之极海听雷2免费版在线播放| 83版霍元甲全部演员表| 胎心监护多少周开始做| 台湾电视台| 电影宝贝| 一万个伤心的理由| 香港之夜电视剧免费播放国语版| 黄网站在线观看视频|