主頁 > 資料庫 > oracle存盤程序轉達夢8存盤程序時踩過的坑2(完結篇)

oracle存盤程序轉達夢8存盤程序時踩過的坑2(完結篇)

2020-12-11 08:31:50 資料庫

之前寫過一篇文章總結了oracle存盤程序轉達夢8存盤程序時踩過的坑(https://www.cnblogs.com/kingstarer/p/13379053.html)

當時里面只總結了3個大坑,實際上我還碰到過不少小坑

因為這段時間,我們專案組決定使用java重寫舊系統,放棄了原來使用存盤程序那一套,所以最近就一直沒再去整理之前的小坑,

今天正好記起來這事,就花點時間整理一下,雖然我已經不用到這些經驗了,但希望對其他人有幫助,

(用java寫邏輯比用存盤程序方便好多,建議大家還是盡量放棄存盤程序吧)

時區問題

達夢8安裝后默認的時區,不是作業系統的時區,而是0時區,這會導致sysdate回傳時間有誤,需要修改/etc/dm_svc.conf檔案,在檔案中添加TIME_ZONE=(480)才正常,如下:

[root@ecs-htgx-0003 etc]# vi /etc/dm_svc.conf
# 以#開頭的行表示是注釋
# 全域配置區 dm_svc.conf
TIME_ZONE=(480)
LANGUAGE=(cn)

DMHTGX=(192.168.0.137:5236)

# 服務配置區
[DMHTGX]
LOGIN_MODE=(2)

regexp_replace

達夢的正則匹配有問題,我踩的一個坑是這個:


select regexp_replace('CC4.city', '([(+-*/|><=,]|^)(.+)', '\2', 1, 1, 'i') from dual;

這個陳述句執行結果oracle跟達夢不一樣


select regexp_replace('CC4.city', '([+-*]|^)(.+)', '\2', 1, 1, 'i') from dual; --輸出 C4.city
--把+和-調換位置 oracle輸出結果是一樣的,但達夢卻是不一樣
select regexp_replace('CC4.city', '([-+*]|^)(.+)', '\2', 1, 1, 'i') from dual; --輸出 CC4.city


仔細分析一下,是因為達夢把[]里面的+號字符,認為是正則運算式的元字符+(匹配前面的子運算式一次或多次)

級聯洗掉問題

oracle用戶遷移到達夢資料庫后,發現多了好多觸發器,仔細看了一下代碼,應該是實作外鍵case delete的,估計是達夢不支持外鍵級聯洗掉,在遷移時自動把這些級聯洗掉改成觸發器,

不過改成觸發器后,就無法實作oracle的延遲約束功能了(alter session set constraints=deferred)

這個問題無解

BULK COLLECT問題

使用BULK COLLECT的查詢陳述句,查不到記錄時行為不同:oracle的BULK COLLECT查詢默認是不會拋出no_data_found例外的,而達夢會,

解決方法是捕獲no_data_found例外后做忽略處理,

DBMS_SQL包問題

DBMS_SQL有bug呀,獲取出來的col_max_len是0,例子如下:

 create table mydual as
 select * from dual;

 declare
  v_col_cnt           NUMBER;
  v_cursorid          NUMBER;
  v_desc_t            DBMS_SQL.desc_tab2;
 begin
 	dbms_output.enable;
  	v_cursorid := DBMS_SQL.open_cursor;
 	DBMS_SQL.parse(v_cursorid, 'select ''123'' c1, DUMMY c2 from mydual', dbms_sql.native);
    DBMS_SQL.describe_columns(v_cursorid, v_col_cnt, v_desc_t);
    FOR i IN 1..v_col_cnt LOOP
		dbms_output.put_line('i ' || i || ' name = ' || v_desc_t(i).col_name || 
			' col_max_len = ' || v_desc_t(i).col_max_len);
	END LOOP;
 end;

DBMS_SQL這個包還有其它好多bug,具體我沒記下來,大家使用小心點了,

prior和next問題

當下標值在容器中找不到時,達夢無法正確獲取prior和next,驗證的存盤程序如下:

declare
    type v_mp_type is table of number index by PLS_INTEGER;
    v_mp v_mp_type;
begin
    dbms_output.enable;
	v_mp(1) := 1;
	v_mp(3) := 2;
	-- oracle輸出1 達夢輸出空
	dbms_output.put_line('v_mp.prior(2) = ' || v_mp.prior(2));
end;

解決方法是自己寫prior和next函式:

-- 需要寫函式代替oracle的prior和next
function get_prior_index(v_mp IN v_mp_type, v_ind IN PLS_INTEGER) return PLS_INTEGER
is 
    v_vv_last PLS_INTEGER := null;
	vv PLS_INTEGER := v_mp.first;
begin
	-- 遍歷v_mp 做比較 
	while vv is not null
	loop
		-- 如果發現某個下標值比傳進來的v_ind大或者相等 則回傳上一個下標值
		-- (如果是第一個下標則回傳NULL)
	    if (vv >= v_ind) then return v_vv_last; end if;
	    v_vv_last := vv;
		vv := v_mp.next(vv);
	end loop;
	

	-- 如果遍歷完所有下標,仍未找到大于等于v_ind的值,則回傳最大的下標v_mp.last
	return v_vv_last;

end;

function get_next_index(v_mp IN v_mp_type, v_ind IN PLS_INTEGER) return PLS_INTEGER
is 
	v_vv_last PLS_INTEGER := null;
	vv PLS_INTEGER := v_mp.last;
begin
	-- 反序遍歷v_mp 做比較 
	while vv is not null
	loop
		-- 如果發現某個下標值小于等于v_ind 則回傳上一個下標值
		--(如果是最大的下標則回傳NULL)
		if (vv <= v_ind) then return v_vv_last; end if;
		v_vv_last := vv;
		vv := v_mp.prior(vv);
	end loop;
	

	-- 如果反序遍歷完所有下標,仍未找到小于等于v_ind的值,則回傳最小的下標v_mp.first
	return v_vv_last;

end;




日期計算問題

這個網上有很多文章介紹過了,達夢默認兩個整數相除,結果型別還是整數,而oracle是小數,

所以在oracle我們可以使用trunc(v_date)-1/86400獲取1秒前的時間,但在達夢,這樣寫跟trunc(v_date) - 0是一樣的,

解決方法是改成trunc(v_date)-1.0/86400

出參問題

如果把一個變數傳給一個函式做為函式出參,以獲取函式回傳值,oracle默認會把這個函式清空,而達夢不會,

這就導致一個問題,

驗證代碼如下:

/*測驗出參  在oracle期待輸出為空 但是達夢會出現error*/
create or replace procedure testKinstarerOutParam(str OUT varchar2) as
begin
    dbms_output.put_line('str = ' || str);
    if (str is not null) THEN
        RAISE_APPLICATION_ERROR(-20001, '出參沒有清空');
    end if;
end;
/

create or replace procedure testKinstarerCallOutParam as
       strIn varchar2(64) := 'error';
begin
       testKinstarerOutParam(strIn);
end;
/

dbms_output.enable;
begin testKinstarerCallOutParam(); end;

lob支持問題

oracle可以使用to_char函式對lob型別欄位操作,但在達夢,有時這樣操作會失敗,報錯為DBMS_LOB.READ line 1157

diutil包缺失

不知道為什么,達夢沒有提供diutil包,里面有一些函式,挺方便,沒有真可惜,所以我自己寫了一個

CREATE OR REPLACE PACKAGE diutil IS


  -- bool_to_int:  translates 3-valued BOOLEAN TO NUMBER FOR USE
  --               IN sending BOOLEAN parameter / RETURN VALUES
  --               BETWEEN pls v1 (client) AND pls v2. since sqlnet
  --               has no BOOLEAN bind variable TYPE, we encode
  --               booleans AS false = 0, true = 1, NULL = NULL FOR
  --               network transfer AS NUMBER
  --
  FUNCTION bool_to_int( b BOOLEAN) RETURN NUMBER;
  
    -- int_to_bool:  translates 3-valued NUMBER encoding TO BOOLEAN FOR USE
  --               IN sending BOOLEAN parameter / RETURN VALUES
  --               BETWEEN pls v1 (client) AND pls v2. since sqlnet
  --               has no BOOLEAN bind variable TYPE, we encode
  --               booleans AS false = 0, true = 1, NULL = NULL FOR
  --               network transfer AS NUMBER
  --
  function int_to_bool( n NUMBER) return boolean;
  
  function get_sql_hash(name IN varchar2, v_hash OUT RAW,
                        pre10ihash OUT number)
    return number;

  function rpad_dm(string varchar2, padded_length number, pad_string varchar2 := ' ')
    return varchar2;
  
  function copy1kList(v_input ua_utl_def.t_str_1k_list) return ua_utl_def.t_str_1k_list;
end diutil;

CREATE OR REPLACE PACKAGE BODY diutil IS
  --------------------
  -- bool_to_int
  --------------------
  FUNCTION bool_to_int(b BOOLEAN) RETURN NUMBER IS
  BEGIN
    IF b THEN
      RETURN 1;
    ELSIF NOT b THEN
      RETURN 0;
    ELSE
      RETURN NULL;
    END IF;
  END bool_to_int;
  
    --------------------
  -- int_to_bool
  --------------------
  FUNCTION int_to_bool(n NUMBER) RETURN BOOLEAN IS
  BEGIN
    IF n IS NULL THEN
      RETURN NULL;
    ELSIF n = 1 THEN
      RETURN true;
    ELSIF n = 0 THEN
      RETURN false;
    ELSE
      RAISE value_error;
    END IF;
  END int_to_bool;
  
  function get_sql_hash(name IN varchar2, v_hash OUT RAW,
                        pre10ihash OUT number)
    return number IS
    v_hash_varchar2 VARCHAR2(128);
    v_hash_tmp VARCHAR2(128);
  BEGIN
    --  Compute a hash value for the given string using md5 algo
  --  Input arguments:
  --    name  - The string to be hashed.
  --    hash  - An optional field to store all 16 bytes of returned
  --            hash value.
  --    pre10ihash - An optional field to store the pre 10i database
  --                 version hash value.
  --  Returns:
  --    A hash value (last 4 bytes)  based on the input string.
  --    The md5 hash algorithm computes a 16 byte hash value, but
  --    we only return the last 4 bytes so that we can return an
  --    actual number.  One could use an optional RAW parameter to
  --    get all 16 bytes and to store the pre 10i hash value of 4
  --    4 bytes in the pre10ihash optional parameter.
  	-- Utl_Raw.Cast_To_Raw(
  	
  	v_hash_varchar2 := DBMS_OBFUSCATION_TOOLKIT.MD5(name);
  	v_hash := Utl_Raw.cast_to_raw(v_hash_varchar2);
  	v_hash_tmp := substrb(v_hash, 13, 4);
  	
  	pre10ihash := to_number(v_hash_tmp, 'XXXXXXXXXX');  --TODO: 這里實作有問題 pre10ihash是啥意思我沒看懂
  	
  	-- select Utl_Raw.Cast_To_Raw(DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>'abc')) a from Dual
  	return to_number(v_hash_tmp, 'XXXXXXXXXX'); 
  END;
  
  function rpad_dm(string varchar2, padded_length number, pad_string varchar2 := ' ')
    return varchar2 IS
    v_len number := lengthb(string);
  BEGIN
  	    dbms_output.put_line('v_len - padded_length = ' );
  	if padded_length < v_len THEN
  		return substrb(string, 1, padded_length); --如果輸入長度小于原字串長度,則呼叫substrb截斷
  	elsif padded_length = v_len THEN
  		return string; --如果長度相等直接回傳原串即可
  	else
  		return string || rpad(' ', padded_length - v_len, pad_string); --如果長度大于原字串,則在后面補空格
  	end if;
  END;


  function copy1kList(v_input ua_utl_def.t_str_1k_list) return ua_utl_def.t_str_1k_list IS
    v_tmplist ua_utl_def.t_str_1k_list;
    v_ind PLS_INTEGER;
  begin
  	if v_input.count > 0 then
  		/*
  		for vv in v_input.first .. v_input.last LOOP
  			v_tmplist(vv) := v_input(vv);
  		end loop;
  		*/
  		v_ind = v_input.first;
  		while v_ind is not null
  		loop
  			v_tmplist(v_ind) := v_input(v_ind);
  			v_ind = v_input.next(v_ind);
  		end loop;
  	end if;
  	return v_tmplist;
  end;
end diutil;

存盤程序建失敗不會提示

在達夢客戶端執行新建存盤程序時需要注意,即使創建成功了,也只代表語法正確,很可能存盤程序有其它問題導致沒建成功,仍是無效狀態,

解決方法是創建存盤程序之后再手動執行 alter PROCEDURE 存盤程序名稱 compile;

FORMAT_ERROR_BACKTRACE沒有呼叫處行號問題

眾所周知,oracle提供一個函式dbms_utility.format_error_backtrace,用于獲取例外模塊處理時呼叫,獲取函式堆疊資訊,里面會有明確的函式名稱和原始碼位置資訊

但達夢呼叫這個函式回傳的是一堆看不懂的內部符號

這個問題對我遷移造成不少困擾,因為我們業務的主要邏輯就是在存盤程序里面實作的,我們需要在程式出例外時登記日志,記錄函式堆疊資訊,以方便跟蹤,

經過我不懈研究,終于解決了達夢無法獲取堆疊資訊的問題,這里跟大家分享一下解決方法:

dbms_output.enable;
select * from  q$log order by 1 desc;
select * from q$error_instance order by 1 desc;

CREATE OR REPLACE PROCEDURE logIntoDb(loglevel PLS_INTEGER, inf IN varchar2, callStack IN varchar2)
IS
    PRAGMA AUTONOMOUS_TRANSACTION; --日志登記需要使用自治事務
BEGIN
	-- loglevel 0 debug 10 inf 20 err
	INSERT INTO q$log
          (id, "CONTEXT", text, call_stack, created_on, created_by, app_system, app_module)
        VALUES
          (q$log_seq.nextval,
           decode(logLevel, 0, 'debug', 'other'),
           inf,
           callStack,
           SYSDATE,
           USER,
           'unify_audit',
           'logIntoDb');
    commit;
END;
alter PROCEDURE logIntoDb compile;

CREATE OR REPLACE FUNCTION getErrorBackTrace() return varchar2
IS
	-- 達夢不能直接獲取堆疊資訊,需要套在函式里面 
	c_stack VARCHAR2(6000) := DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
BEGIN
    return c_stack;
END;
/
alter FUNCTION getErrorBackTrace COMPILE;

CREATE OR REPLACE PROCEDURE debugHt(inf IN varchar2)
IS
	-- 默認不使用例外 這樣不能記錄行號
	-- 使用例外可以記錄行號但性能會下降,用于除錯
	v_useException boolean := true;
BEGIN
	if (v_useException) then
		-- 主動創建一個例外,這樣才可以FORMAT_ERROR_BACKTRACE函式才有值
		RAISE_APPLICATION_ERROR(-20001, 'debug');
	else
		logIntoDb(0, inf, DBMS_UTILITY.format_call_stack);
	end if;
exception
  when others then
    -- 達夢的DBMS_UTILITY.FORMAT_ERROR_BACKTRACE函式必須隔位獲取
    -- 不然只能獲取當前函式的堆疊資訊
	logIntoDb(0, inf, getErrorBackTrace());
END;
/
alter PROCEDURE debugHt COMPILE;


CREATE OR REPLACE PROCEDURE proc2
IS
BEGIN
    debugHt('hello log');
	execute immediate 'delete * from dual1233';
exception 
    when others then
    	debugHt('hello exp');
END;
/
alter PROCEDURE proc2 COMPILE;

CREATE OR REPLACE PROCEDURE proc3
IS
BEGIN
    proc2();
END;
/

CREATE OR REPLACE PROCEDURE proc4
IS
BEGIN
    proc3();
END;
/

begin proc4(); end;


轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/232999.html

標籤:其他

上一篇:高并發下,如何讓你的資料庫再快一點?

下一篇:.NET Core 3.0X及以上版本的EFCore連接MySql 8.022

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more