使用過數據庫時,您是否經歷過一些奇怪的情況?好像數據庫沒有更新或刷新?您剛剛新添加到數據庫中的值檢索不到,但是當您關閉模型并查看數據庫時,這些值又存在了。。。。
Well,你不是一個人!
在文章的底部,有兩個關于Stack Overflow的其他用戶的例子,他們也經歷了在AnyLogic中使用數據庫表的“Dark?Side”。
假設您有一個數據庫表,其中包含模型的一些關鍵信息。
在運行時,您希望使用selectFrom()函數訪問信息
您還需要使用update()函數更新表中的一些信息
當運行您的模型
您從DB中獲得值,它會像預期的那樣返回22。
然后保存一個新值25到DB
然后想從DB中獲取這個新值,但它仍然返回22。。。。
關閉模型。
您可以查看DB值
它顯示了保存的25
這是什么情況?
再次運行模型...
根據查看的?DB 值,它返回 25,如預期的一樣。
您將值更改為?30。
然后獲取?DB 值.. 它仍然返回25。
這是在搞笑嗎!
保持模型打開并查看DB,值顯示為 25...
關閉表并再次打開它......它顯示30......
獲取?DB 值,它仍然返回 25...
關閉模型
再次運行模型...
獲取?DB 值,它返回 30!
超級煩躁!崩潰到大罵幾聲。。。。,然后發誓永遠不再使用數據庫!
可是等等....
似乎有什么導致了必然無法從數據庫中獲得正確的值。
如果您查看 firstResult() 文檔,您將看到以下內容
默認情況下, firstResult() 函數將返回緩存的值!
如果您總是想獲取最新值,則必須調用 firstResult(false, "column")
甚至于有一個緩存選項的原因是為了加快數據庫的處理速度,其“險惡之處”在于它是默認啟用的,對初學者沒有任何警告或提示,因為如果您省略緩存參數,該功能仍然有效 .
另外!
請記住,還有一些其他功能具有相同的“特點”:
l firstResult()
l uniqueResult()
l count()
l hasResults()
注意:無論您使用的是 insertInto() 還是 ModelDatabase.importFromExternalDB,對數據庫進行的更新都是如此
Stack Overflow的其他用戶的例子:
如何從代碼中刷新 AnyLogic ModelDatabase(How do I Refresh AnyLogic ModelDatabase from code)?
您可以在點擊下圖下載具有正確解決方案的示例:
或者下載放置在AnyLogic云的模型