資料刪除失效問題

2021-10-19 23:23:12 字數 1956 閱讀 3608

利用jdbc進行mysql資料庫操作,我在同乙個事務裡對錶進行刪除和插入操作,但是不知道什麼原因,資料刪除不起作用。

mysql表:

create table day_info (

dayinfo date,

isholiday int(1) comment '工作日對應結果為 0, 休息日對應結果為 1, 節假日對應的結果為 2'

);

**斷如下:

class.forname("com.mysql.jdbc.driver");

conn = drivermanager.getconnection(connect_str[0], connect_str[1], connect_str[2]);

conn.setautocommit(false); // 設定手動提交

int count = 0;

string delete_sql = "delete from day_info where dayinfo = date_format(?,'%y%m%d') ";

psts = conn.preparestatement(delete_sql);

for (mapmap:resultmaplist)

// psts.executebatch(); // 執行批量處理

// conn.commit(); // 提交

string insert_sql = " insert into day_info ( dayinfo, isholiday ) values ( date_format(?,'%y%m%d'), ? ) ";

psts = conn.preparestatement(insert_sql);

for (mapmap:resultmaplist)

psts.executebatch(); // 執行批量處理

conn.commit(); // 提交

system.out.println("all down : " + count);

多次執行後發現資料有重複,可以確定是刪除是失效的。

如果注釋掉如下**,即只進行刪除而不插入。

那麼資料可以正常刪除,具體原因未知。

驗證一:將**段中的這兩行注釋去除,此時可以正常的刪除和插入。

但是**中提示存在記憶體洩漏,需要關閉一下psts(加一行**psts.close())

問題原因:

psts在此處有兩次建立(1.psts = conn.preparestatement(delete_sql);   2.psts = conn.preparestatement(insert_sql);)由於第一次建立後sql沒有執行(psts.executebatch(); ),所以資料沒有進行刪除,後面重新建立psts後已經覆蓋了前面刪除相關的sql,所以最終執行的只有第二次建立出來的psts。即只執行了插入操作。解決方案就是上面驗證一的方案,將第乙個psts相關語句執行(psts.executebatch();),事務(conn.commit();)可以提交或者待第二個psts執行完後提交均可。

這也就可以解釋為什麼驗證一中去掉注釋的兩行**後編譯器為什麼會提示記憶體洩漏了。因為這是完全不一樣的兩個psts,由於第乙個並沒有進行關閉,所以會有記憶體洩漏,需要進行關閉。

C 中容器迭代器刪除失效問題

c 迭代器失效問題 map set等關聯容器如何刪除元素 vector list deque等序列容器如何刪除元素 迭代器如何使用 序列性容器 vector和list和deque erase迭代器不僅使所指向被刪元素的迭代器失效,而且使被刪元素之後的所有迭代器失效,所以不能使用erase iter ...

資料庫索引失效問題

通俗的說,索引的作用就像目錄一樣,是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。索引中包含由表或檢視中的一列或多列生成的鍵。這些鍵儲存在乙個結構 btree 中,使sql可以快速有效地查詢與鍵值關聯的行。這是因為,建立索引可以大大提高系統的效能。通過建立唯一性索引,可以保證給資料庫...

索引失效問題

今天用子查詢時遇到了索引失效的問題,就把解決的過程和大家分享一下吧。先是用in語句 select index table index index 欄位a tablea where 欄位b in 檢視執行計畫,發現沒有走索引。為什麼?在網上一檢視,一解釋是用in 時由於值不確定,所以不能走索引 in ...