如何處理 h2 數(shù)據(jù)庫(kù)無(wú)法處理中斷,我偶爾會(huì)看到我的嵌入式 h2 數(shù)據(jù)庫(kù)似乎已損壞,特別是我修改了一個(gè) ExecutorService,這樣如果任務(wù)花費(fèi)的時(shí)間太長(zhǎng),它就會(huì)取消任務(wù)。該任務(wù)可以取消,但是隨后的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)失敗,出現(xiàn)異常我后來(lái)發(fā)現(xiàn)了這個(gè)問(wèn)題基本上,如果在嵌入式模式下使用 H2,并且它接收到中斷,那么所有后續(xù)訪(fǎng)問(wèn)都會(huì)失敗,直到線(xiàn)程池關(guān)閉并重新打開(kāi)。在我給出的例子中,一個(gè)進(jìn)程必須被取消,因?yàn)樗坪醣豢ㄗ×耍酥袛嘀鉀](méi)有其他解決方案我還有另一種情況,通??刂破骶€(xiàn)程本身不直接執(zhí)行數(shù)據(jù)庫(kù)工作,所以我一直在努力了解為什么發(fā)生中斷時(shí)為什么會(huì)導(dǎo)致數(shù)據(jù)庫(kù)錯(cuò)誤,因?yàn)檫@是由控制器線(xiàn)程處理的。我現(xiàn)在已經(jīng)解決了這個(gè)問(wèn)題,我使用的是具有固定大小 BlockingQueue 的 ExecutorService(這樣我們就不會(huì)在內(nèi)存中建立大隊(duì)列),但是如果隊(duì)列已滿(mǎn),那么新任務(wù)實(shí)際上由控制器線(xiàn)程執(zhí)行(因?yàn)?CallerRunsPolicy),所以控制器線(xiàn)程畢竟可以調(diào)用數(shù)據(jù)庫(kù)。我將 H2 與休眠一起使用,并且在這兩種情況下,在中斷后立即調(diào)用以下命令 HibernateUtil.closeFactory();似乎解決了這個(gè)問(wèn)題,但是我想這意味著任何其他具有休眠會(huì)話(huà)的線(xiàn)程都將被破壞,但至少新打開(kāi)的會(huì)話(huà)是可以的。所以我對(duì)這個(gè)解決方法不是特別滿(mǎn)意,還有其他想法嗎?使用 H2 作為服務(wù)器不是解決方案,因?yàn)?H2 的全部要點(diǎn)是應(yīng)用程序中自包含的嵌入式數(shù)據(jù)庫(kù)。
添加回答
舉報(bào)
0/150
提交
取消