日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

昨天看到一個問題,疫情結束后你最想吃什么?

仔細想了一下,火鍋?烤肉?

看了一下體重秤,怕是只能報個健身房了。

你以為你胖N斤的時間復雜度是O(2^N), 事實上它是O(1),嗖嗖的.

正文

回到正題

說到遠程Debug這個功能,基本上大多IDE都會自帶,但是一般情況下還真是很少用!

筆者切換到IDEA之后,還真再就沒用過遠程Debug,直到昨天發(fā)現了一個非常基礎的錯誤

坑從何來

來自于我的開源小工具:
https://gitee.com/vtDev/v-mock

筆者本意是打造一個,簡單,輕巧,一鍵運行的接口模擬系統(tǒng),用來方便等待他人接口的前端后端同學.

基于以上目的,我使用了嵌入式數據庫sqlite,來配合Springboot,構造了無須配置,一行啟動的小jar包. 目錄結構如下,數據庫直接扔在了Resource中:

保命小訣竅:IDEA遠程Debug技巧,你了解嗎?

 

開源后有使用的同學提了Bug,筆者也是正常操作,改完bug重新打版發(fā)行.

升級版本的同學,發(fā)現數據沒了,筆者暫時給出了方案,嵌入式數據庫嘛,把舊jar中的DB文件,覆蓋到新Jar中就好了

保命小訣竅:IDEA遠程Debug技巧,你了解嗎?

 

(DB文件位于jar包中的位置)

說出這句話的時候,也不能完全賴瓦特了,畢竟Springboot+Sqlite這種奇葩組合也是為了工具的小巧性,偶爾嘗試的產物.

事實上稍微想想,db文件和其他資源不一樣,是要頻繁改寫的,當然改動的不是jar包中的原始文件.

直到收到了一個Issues,告訴了筆者DB文件復制到新jar中并沒有生效.

筆者也迅速反應過來,怎么可能用的jar內的DB文件,真實文件不出意外是放在JAVA.io.tmpdir下了.

java.io.tmpdir的路徑,一般情況下,macos是在$TMPDIR,win則在%temp%.

筆者也切換到了對應的目錄,終于看到了jar運行時真實使用的DB文件:

保命小訣竅:IDEA遠程Debug技巧,你了解嗎?

 

但是這個命名方式很奇怪啊,和原本的v-mock.sqlite并不沾邊.

一路追隨sqlite的jdbc驅動源碼,找到了
org.sqlite.SQLiteConnection的extractResource方法,看到了命名代碼:

保命小訣竅:IDEA遠程Debug技巧,你了解嗎?

 

其實看到這已經清晰了,源碼中使用了sqlite-jdbc-tmp拼接了原始jar中DB文件的URL類的hashcode作為文件名.

之所以筆者開發(fā)的時候沒注意到,看看這個方法第一個if判斷就知道了。

筆者習慣用IDE中的Springboot或者Application模式直接啟動項目,并不是打包后的啟動方式

所以當Protocol是file而不是jar的情況,直接就使用了
target/classes/db/v-mock.sqlite文件,不用生成臨時文件.

開發(fā)時,DB可視化工具也連接的是
target/classes/db/v-mock.sqlite,所以當時并沒發(fā)現疑點.

事實上這是很正常的操作,很多地方的源碼都有判斷是普通web環(huán)境還是以jar運行的,如果有這方面的調試,要思考你的啟動方式了.

那么想把斷點打在第一個if之后,看到效果,選擇之一就是可以使用遠程Debug的方式.

IDEA的遠程Debug

IDEA的遠程Debug模塊真的是設計十分貼心,傻瓜操作,命令都生成好了,不知道現在的eclipse版本有沒有這么貼心.

保命小訣竅:IDEA遠程Debug技巧,你了解嗎?

 

從configuration中搜索remote模版,點擊右上角的create configuration,就創(chuàng)建好了一個遠程debug啟動方式.

Debugger mode選擇Attach to remote JVM即可,它還有一個選項是Listen to remote JVM,意如其名嘛,一個是主動附著到啟動的程序,一個是被動監(jiān)聽程序。

ip和端口不用多說,筆者直接用的本地jar包,所以填了localhost,右邊jdk版本如果使用其他版本的,需要調一下。

中間的文本框就是生成好的jvm參數了,非常人性化了,直接加入啟動命令即可
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 v-mock.jar

可以完全不用管命令什么意思,如果你想知道,筆者也大概解釋一下:

  • -agentlib:jdwp 最重要的參數,啟動JDWP代理,JDWP全稱就是Java Debug Wire Protocol,官方給的方便調試的工具.
  • transport=dt_socket 通過socket方式傳輸數據,dt八成就是data transfer的縮寫了.
  • server=y 開啟調試server端,注意,因為筆者上文選擇的是Attach to remote JVM,所以這里才是y,等待有調試器Attach過來,如果你選了Listen模式,那么就是反過來的,調試器是server,這里就是n了.
  • suspend=n 是否掛起,這里設置為n,也就是說程序正常跑,什么時候需要Attach就去Attach即可,如果設置為y,程序將會等待調試器Attach上才會繼續(xù)執(zhí)行,比如啟動源碼的調試場景.
  • address=5005 調試端口設置為5005,當然其它端口也可以.
保命小訣竅:IDEA遠程Debug技巧,你了解嗎?

 

啟動jar包,再以剛才創(chuàng)建的方式進行debug,期待的斷點位置已經成功到達了.

結尾

找到原因后,筆者也順著sqliteJDBC源碼中命名的方式,開發(fā)了一種數據遷移的方式

即:自動或手動找到之前版本的數據庫文件,復制一份,以新版本的hashcode命名即可.

Springboot+嵌入式數據庫,是個非常“不正經”的組合,但是開發(fā)小工具還是蠻不錯的,如果有遇到同樣數據遷移問題的,不妨參考一下筆者的解決方案

作者:Vt
鏈接:
https://juejin.cn/post/6844904071204339725
來源:掘金

分享到:
標簽:IDEA
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰(zhàn)2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定