搜尋

搜尋結果

Spring Boot Web App 更新期間的維護模式:從唯讀到全鎖的解決方案
科技新知
MacauYeah・2025-08-25

在營運 Web App 的時候,雖然我們有 Docker K8s 可以滾動更新,但難保用戶在更新的過程中,有一半訪問去到了舊版,另一半去了新版。如果可以,Web App 本身自帶維護模式,可以自我判斷什麼時候應該忽略新的訪問,當然最好。但要做到這一點,前期需要很多規劃。狠心一點,可以直接關掉對外的服務,讓用戶無法訪問。 但在另一些情況下,例如升級搬遷的情況,下線時間比較長,完全關掉服務並不是一個很好的方向,我們至少還可以提供唯讀的選擇。而且這個可以從資料庫出發,讓 Web App 少處理一點邏輯。 如果 Web App 背後的資料庫是 MSSQL 或 MySQL,唯讀這件事應該是簡單的,只要你把 service account 的權限改變就好。但如果你用Oracle,就要想想辦法。 筆者想到的方法,暫時有兩個。第一個就需要大家寫寫 Script ,一口氣把所有 Table 給鎖起來。例如 第二個,就是生成一個新的唯讀 User schema,給他所有Select的權限。然後更新 Web App 使用那個唯讀 User schema存取資料。 兩個方法有什麼差異呢? 前者就全部鎖起來,沒有任何一個資料庫用戶可以改寫資料。如果你的業務沒有差異性,全部一起封起來就完事。但如果你只想 Web App 轉成唯讀,但其他背景程式還可以執行更新。那你就只能用後者了。但後著也不是百分百的完全無痛,至少你 Web App 要支援登入與操作的 Schema分離。 例如用Spring boot JPA的話,可以在 application.properties 可以讓登入及操作的Schema不一樣。 spring.datasource.username=READ_ONLY_USER spring.jpa.properties.hibernate.default_schema=ORIGINAL_SCHEMA 又或者在 java 層面指定。 @Tableschema = quot;ORIGINAL_SCHEMAquot; 這看上去,是很有彈性的。但其實也是有些局限。如果你本來的JPA有寫特制的 JPQL 或 Raw Query,又或者你在Java層面加了 @Subselect,由於這些都是程式原作者所 hard code 的,JPA沒法幫你改寫。改來改去,可能還是前述寫Script的方法,一口氣把所有 Table 給鎖起來實際一些。 Reference 更多筆者的程式開發分享,見請 github

重入膠坑 8 | HG Mighty Strike Freedom 取件表
手機‧電玩
MacauYeah・2025-05-16

之前就為大家介紹過,想有效率地消除Gunpla山積,事前計劃好一個概定的流程,絕對是件很重要的事。 而流程中,預制取件表,絕對素組檔的一件神器,筆者習慣後,可以極大地減少筆者換剪、打磨工具的次數,也減少找不到零件的機會。 筆者就分享一下自己制作的Mighty Strike Freedom 取件表 Google Drive連結,有需要的讀者,可以直接下載或列印。 在這邊再簡介一下如何利用取件表作為素組之用 準備粗剪、薄刃剪、打磨砂紙400, 600, 800號、十二個零件盒 按照取件表,分區粗剪取件: 完整地粗剪頭部所有零件 放入頭零件盒 完整地粗剪身體所有零件 放入身體零件盒 依次粗剪各部份零件,放入對應的零件盒...... 分區薄刃剪修件 完整地修剪頭部所有零件 完整地修剪身體所有零件 依次完整地修剪各部份所有零件...... 選擇性分區打磨零件 完整地打磨頭部所有零件 完整地打磨身體所有零件 依次完整地打磨各部份所有零件...... 回到說明書,分區組合 依次地分區組合 選擇性記錄需要額外補色的位置。 選擇性滲線、補色 於粗坑線條上水性滲線液 Marker筆補色 選擇性保護漆 最後一定要提醒,在第4步組合以外,就必需要決定是否進行打磨,若是組合完再拆散,就有斷件風險。亦有因為上述流程不刻線,其實第5步很安全,沒有進一步打磨修補問題。 最後附上筆者速刷前四個步驟的HG Mighty Strike Freedom美照。

Home Media 系列驚爆娛樂陪您過「哈囉喂」 🎃👻
生活在我城
Cheers!・2024-10-28

今個 Halloween 留喺屋企一樣咁「盞鬼」!Home Media 集齊一系列驚險遊戲、懸疑猛片、解密綜藝等,為您開啟刺激冒險之旅,依家新客戶仲可用 350 CTM 積分換購 Home Media 免費體驗,快 d 去換購,同家人朋友一齊挑戰驚悚極限啦 ! OnePlay 雲遊戲平台服務(30 小時)(優惠價:$68) 免費 3 個月 myTV SUPER 服務(App 網頁版) 首月免費 Blacknut hmvod 芒果 TV 國際服務,期後享優惠月費 $28 月 6 個月 myTV Gold 服務(電視盒子 智能電視版 App 網頁版)(優惠價:$280) 仲有 Home Media 電視盒子連 myTV SUPER 服務等更多積分優惠:httpss.ctm.netotdXe 萬聖節心跳推介: 冒險類雲遊戲 #OnePlay:《Batman》化身蝙蝠俠對抗危險惡棍 #Blacknut:《Among the Sleep》直面童年恐懼 都市懸疑劇 myTV SUPER 帶您重溫經典懸疑劇《金宵大廈》《降魔的》等, 仲可升級 myTV Gold 專享更多海外驚悚劇 《2323(雙語版)》《天黑了》等 萬聖節必睇猛片 #hmvod:《鬼靈精怪大酒店:怪獸變錯身》展開歡樂緊張奪寶之旅 ,《窺探者》改編自愛爾蘭古老恐怖傳說 推理解密綜藝 #芒果TV國際 《密室大逃脫》《YES OR NO 第三季》靠線索逃出密室 推理故事 好歌分享 #JOOX:Serrini《日月無光》、陳蕾《妖治時代》擊退內心魔鬼 下載 Home Media App 體驗一系列精彩娛樂:httpss.ctm.net0X0oD,一個賬號盡享最新體育賽事直播、電視劇、電影、綜藝等! Home Media 娛樂服務詳情:httpss.ctm.netsIrfC

Git Worktree
科技新知
MacauYeah・2024-04-09

看了Git 大神的影片 part two,才知道原來切換git分支還是有不同的做法。傳統中,我們使用git checkout BRANCH_NAME_1 來切換到我們想要的分支。通常這樣做,代表我們放棄原來的工作環境,換到另一個工作環境中。 這樣做很好,對不對? 是的。但有些時候,我們只是被逼離開原本的工作環境,跳到一個過去的分支節點去查一些東西,或者修正一些東西。更什的是我們原本的工作環境都還是混亂狀態下,我們不想做commit(提交),我們只好用git stash,暫時將工作環境存起,然後再git checkout BRANCH_NAME_1。在你想做的事做完後,再git checkout OLD_BRANCH。 看起來其實也沒有很麻煩,是不是? 但其實當你的專案有一定大小,你在不同版本跳來跳去,你的IDE就會不斷地重新編譯。更不幸的是,當你的不同版本中有模組數量的差異,弱一點的IDE,什至會攪死它的cache,之後就會發生鬼打牆。為解決IDE引發的問題,筆者有時會直接cp r YOUR_PROJECT TEMP_PROJECT,在一個新資料夾下另起爐灶。那就是有兩個不同的資料夾裝載著你的專案。 這樣應該沒有問題了吧,是不是?這次是真的可以了,扣除了筆者個人健忘的問題,就沒什麼問題了。 不知大家有沒有經驗,連續commit了幾次,但最後一次commit卻忘了push(與伺服器同步),然後就跳到其他地方繼續工作。如果我們在同一個git repository下,我們commit了但忘了push,即使我們git checkout去了其他分支,用git GUI畫出commit graph時,也至少可以提醒筆者有一個未與伺服器同步的分支。但如果當初我們用的是cp,那就沒戲唱了,什至乎當初複制了去哪裏都忘了。(當你老闆同時要你跟多個專案,健忘真的很容易發生。) 這問題有解嗎?有的,git在2.5版本以後,就提供了一個git worktree的指令。它有點像cp 指令,更重要的是,它打通了兩個資料夾下的隱藏資料庫.git,當大家在那兩個資料夾底下,都可以看到另一方的存在。大家可以用git branch a或git log oneline graph來看看。 詳細的指令介紹:git worktree git 大神的影片 Part 2