我的應用程序正在4個節點的羣集上運行。在啓動時(ServletContextListener),它必須執行一個SQL腳本。如何確保SQL只執行一次而不是4次,因爲每個節點都會嘗試執行相同的代碼?多節點環境(集羣),如何確保一個動作在啓動時只執行一次?
回答
如果您只想執行一次(就像更新數據庫結構的腳本一樣),您應該在數據庫中使用某種版本字段(最簡單的情況就是單列/單行表)。如果你不想自己做,http://flywaydb.org/可能是你的解決方案。如果你只是想確保沒有實例同時運行相同的腳本,你基本上使用相同的想法,而不是使用增加的版本字段,而是使用相同類型的布爾鎖,在你的腳本完成之後你重置它。如果你想自己實現ist,一定要正確處理併發訪問。例如,而不是select entry from lock /if entry = 0 update lock set entry = 1
這是非原子做類似update lock set entry = 1 where entry = 0/check if number affected rows = 1
所以無論誰看到這個鎖是0將它設置爲1並運行sql腳本,並且每個不是第一個的人都會看到1,所以不會做任何事情?鎖何時將重置爲0? –
是的,只需在腳本完成後重置即可。 – Drunix
如果腳本在一秒鐘內完成,但節點的延遲開始時間比那更長,該怎麼辦?首先啓動節點將值設置爲1,啓動腳本,腳本結束,值復位爲0.第二個節點啓動,看到值爲0並重新啓動進程? –
- 1. 節點集羣:確保一次只有一個函數實例正在運行
- 2. 如何從多節點cassandra集羣重新啓動一個活動節點?
- 3. Nifi羣集未啓動,只在一個節點
- 4. MQ羣集 - 如何在生產環境中正確禁用一個節點
- 5. 執行器端點如何在羣集環境中工作
- 6. 如何在每次節點保存後在drupal中執行一個動作?
- 7. 如何確保從命令行運行elasticsearch只啓動一次?
- 8. 如何在Spring中啓動時只執行一次SQL腳本?
- 9. 多節點羣集只能識別1個活動節點
- 10. 其中一個節點無法在Galera羣集中啓動mariadb
- 11. TimerTask啓動停止只執行一次
- 12. django啓動代碼只執行一次
- 13. 在weblogic集羣環境(羣集內的多個節點)上工作時行鎖定失敗
- 14. 我想一次只啓動5個羣集資源
- 15. spark serverserver不能在集羣中的多個節點上啓動
- 16. 只在一個環境中執行javascript
- 17. 如何在準確時間每天執行一次動作
- 18. ElasticSearch:啓動多個羣集
- 19. 無法啓動MySQL集羣SQL節點
- 20. Percona Xtradb羣集節點不會啓動
- 21. 無法啓動MySQL集羣SQL節點
- 22. 如何在第一次啓動應用程序時使Activity只啓動一次?
- 23. Spark如何在一個工作節點上執行一個地圖動作?
- 24. 確保委託只執行一次
- 25. 單節點羣集在多節點羣集上工作?
- 26. 如何確保一次活動只訂閱一次
- 27. 如何在ec2上重新啓動單節點hadoop集羣
- 28. 如何在jquery中只執行一次動作?
- 29. Quartz Scheduler:在每個羣集節點上觸發一些作業,每個羣集只觸發一些作業
- 30. 如何在第一次執行時重新啓動PC vb.net
ServletContextListener方法,contextInitialized方法將只在調用應用程序時調用一次。所以查詢只會觸發一次 –
除羣集中有4個節點外,每個節點都運行它自己的應用程序副本,所以會有4個ServletContextListeners執行它們的contextInitialized方法。 –
讓我問你,第一次到什麼時候,如果在停止1個節點並重新啓動之後會發生什麼,這是否算作新的啓動? –