本文目錄一覽:
- 1、mysql高並發查詢,java程序怎麼做
- 2、java程序使用oracle中sequence會不會有並發訪問的問題
- 3、mysql大並發,報 java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 錯誤
- 4、如何查詢mysql sequence
- 5、java如何處理並發問題
mysql高並發查詢,java程序怎麼做
我覺得1萬的數據並發量並不大,想oracle數據庫,mysql承載這些並發是沒有問題的 我覺得,主要的問題在於你GPS是一直在修改的,因為車輛在不斷的行駛,這樣的話,可能會影響數據庫的性能 我覺得,你可以用一個內存行的數據庫
java程序使用oracle中sequence會不會有並發訪問的問題
不會的oracle的sequence有它自己的一套控制機制~哪怕你是並發100萬個都不會重複~因為這個就相當與一個序列排隊的~操作系統本身控制的東西~
mysql大並發,報 java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 錯誤
處理過類似的問題,原因可能是你的連接太頻繁,客戶端太多,這裡沒看到你的具體表結構和業務邏輯,僅能提供一些經驗:
檢查訪問的業務表的索引是否存在多個唯一索引(包括主鍵),如果是盡量保持主鍵,刪除其他的唯一索引;
避免客戶端訪問時的多表聯合和複雜的子查詢,如果無法解決,從數據庫中對錶的結構進行調優,盡量讓客戶端的訪問一步抵達,減少中間運算過程;
select不會鎖表,只有update或insert才會導致鎖表,一定避免 insert into *** select ** from的結構,這個你可以詳細的查看Mysql的鎖表機制,盡量避免在高並發情況使用對錶的批量寫操作;
高並發下客戶端對錶的寫操作最好根據主鍵1對1的操作,比如update table set A = B where id = 3,看起來不高效,但實際上效果很好,一定不會產生鎖表的問題,因為這樣在排隊的時候就不會把優先級的邏輯運算交由mysql自己處理,也不會出現阻塞的情況;
如何查詢mysql sequence
項目應用中,曾有以下一個場景:
接口中要求發送一個int類型的流水號,由於多線程模式,如果用時間戳,可能會有重複的情況(當然概率很小)。
所以想到了利用一個獨立的自增的sequence來解決該問題。
當前數據庫為:mysql
由於mysql和oracle不太一樣,不支持直接的sequence,所以需要創建一張table來模擬sequence的功能,理由sql語句如下:
第一步:創建–Sequence 管理表
Java代碼
DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
name VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE=InnoDB;
第二步:創建–取當前值的函數
Java代碼
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ”
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value
FROM sequence
WHERE name = seq_name;
RETURN value;
END
$
DELIMITER ;
第三步:創建–取下一個值的函數
Java代碼
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ”
BEGIN
UPDATE sequence
SET current_value = current_value + increment
WHERE name = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;
第四步:創建–更新當前值的函數
Java代碼
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ”
BEGIN
UPDATE sequence
SET current_value = value
WHERE name = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;
第五步:測試函數功能
當上述四步完成後,可以用以下數據設置需要創建的sequence名稱以及設置初始值和獲取當前值和下一個值。
INSERT INTO sequence VALUES (‘TestSeq’, 0, 1);—-添加一個sequence名稱和初始值,以及自增幅度
SELECT SETVAL(‘TestSeq’, 10);—設置指定sequence的初始值
SELECT CURRVAL(‘TestSeq’);–查詢指定sequence的當前值
SELECT NEXTVAL(‘TestSeq’);–查詢指定sequence的下一個值
在java代碼中,可直接創建sql語句查詢下一個值,這樣就解決了流水號唯一的問題。
貼出部分代碼(已測試通過)
Java代碼
public void testGetSequence() {
Connection conn = JDBCUtils.getConnection(url, userName, password);
String sql = “SELECT CURRVAL(‘TestSeq’);”;
PreparedStatement ptmt = null;
ResultSet rs = null;
try {
ptmt = conn.prepareStatement(sql);
rs = ptmt.executeQuery();
int count = 0;
while (rs.next()) {
count = rs.getInt(1);
}
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, ptmt, conn);
}
}
ps:在應用中,還有一種用java代碼去實現模擬自增sequence的方式,具體思路是創建一張存放sequence的table,然後通過java調用sql語句去查詢和修改這個table中指定sequence名稱的值,這種方式請加上synchronized。具體代碼這裡就不上傳了,因為實現了,未去測試過。
java如何處理並發問題
這個和處理器多核沒關係,問題應該是出在你的存儲過程自增程序上,多個客戶端同時發起申請時,自增程序都是在原申請編碼基礎上遞增,所以取值相同。簡單一點的做法是:新增一張臨時表,每次發起申請時記錄預分配的申請編碼。自增程序在此編碼的基礎上遞增即可
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/253760.html