利用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 ...