高併發mysql主鍵設計 高併發資料庫自增主鍵分析

2021-10-17 15:45:14 字數 1443 閱讀 3102

在一般情況下,在新增領域物件後,都需要獲取對應的主鍵值。使用應用層來維護主鍵,在一定程度上有利於程式效能的優化和應用移植性的提高。在採用資料庫自增主鍵的方案裡,如果jdbc驅動不能繫結新增記錄對應的主鍵,就需要手工執行查詢語句以獲取對應的主鍵值,對於高併發的系統,這很容易返回錯誤的主鍵。通過帶快取的datafieldmaxvalueincrementer,可以一次獲取批量的主鍵值,供多次插入領域物件時使用,它的執行效能是很高的。

我們經常使用資料的自增欄位作為表主鍵,也即主鍵值不在應用層產生,而是在新增記錄時,由資料庫產生。這樣,應用層在儲存物件前並不知道物件主鍵值,而必須在儲存資料後才能從資料庫中返回主鍵值。在很多情況下,我們需要獲取新物件持久化後的主鍵值。在hibernate等orm框架,新物件持久化後,hibernate會自動將主鍵值繫結到物件上,給程式的開發帶來了很多方便。

在jdbc 3.0規範中,當新增記錄時,允許將資料庫自動產生的主鍵值繫結到statement或preparedstatement中。

使用statement時,可以通過以下方法繫結主鍵值:int executeupdate(string sql, int autogeneratedkeys)

也可以通過connection建立繫結自增值的preparedstatement: preparedstatement preparestatement(string sql, int autogeneratedkeys)

當autogeneratedkeys引數設定為statement.return_generated_keys值時即可繫結資料庫產生的主鍵值,設定為statement.no_generated_keys時,不繫結主鍵值。下面的**演示了statement繫結並獲取資料庫產生的主鍵值的過程:

statement stmt = conn.createstatement();

string sql = "insert into t_topic(topic_title,user_id) values(『測試主題』,』123』)";

stmt.executeupdate(sql,statement.return_generated_keys); // ①指定繫結表自增主鍵值

resultset rs = stmt.getgeneratedkeys();

if( rs.next() ) , keyholder);

forum.setforumid(keyholder.getkey().intvalue()); // ②從主鍵執有者中獲取主鍵

這樣,在呼叫addforum(forum forum)新增forum領域物件後,forum將擁有對應的主鍵值,方便後繼的使用。在jdbc 3.0之前的版本中,preparedstatement不能繫結主鍵,如果採用表自增鍵(如mysql的auto increment或sqlserver的identity)將給獲取正確的主鍵值帶來挑戰——因為你必須在插入資料後,馬上執行另一條獲取新增主鍵的查詢語句。下面給出了不同資料庫獲取最新自增主鍵值的查詢語句:

高併發系統設計

高併發系統主要是為了解決在有限的資源下解決最核心的問題,並發現以後可能會出現的問題。高併發原則一般遵守如下幾個設計原則 1.無狀態 指的是應用在處理業務邏輯期間盡量減少鎖的使用 降低網路通訊延遲 無資料持久化操作等,以此來增加應用系統的效能。2.拆分 大而全的系統,可根據實際的訪問量來拆分系統,來實...

MySQL 高併發優化

保證在實現功能的基礎上,儘量減少對資料庫的訪問次數 可以用快取儲存查詢結果,減少查詢次數 通過搜尋引數,儘量減少對錶的訪問行數,最小化結果集,從而減輕網路負擔 能夠分開的操作盡量分開處理,提高每次的響應速度 在資料視窗使用 sql 時,盡量把使用的索引放在選擇的首列 演算法的結構盡量簡單 在查詢時,...

高併發 高可用

高併發 提高系統併發能力的方法主要有兩種 前者垂直擴充套件可以通過提公升單機硬體效能,或者提公升單機架構效能,來提高併發性,但單機效能總是有極限的,網際網路分布式架構設計高併發終極解決方案還是後者 水平擴充套件。網際網路分層架構中,各層次水平擴充套件的實踐又有所不同 1 反向 層可以通過 dns輪詢...