quarkus資料庫篇之二:無需資料庫也能運行增刪改查(dev模式)

来源:https://www.cnblogs.com/bolingcavalry/archive/2023/08/16/17624442.html
-Advertisement-
Play Games

### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本篇內容並非資料庫相關的核心知識,而是對 ...


歡迎訪問我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos

本篇概覽

  • 本篇內容並非資料庫相關的核心知識,而是對一個實用工具的說明介紹,此工具在官方介紹中被稱為Zero Config Setup (Dev Services),(零配置的設置,忒莫名其妙)

  • 我這邊簡單總結為:如果你沒有資料庫可用,只要你有docker,quarkus應用就能進行資料庫相關的開發工作,增刪改查啥都行,和有資料庫的時候沒啥區別

  • 看到這裡,經驗豐富的您應該會覺得:既然有docker,那麼用docker run裝一個資料庫不就行了嗎,和quarkus工具有啥關係?

  • 其實這個Zero Config Setup還算是有那麼一點自己的特色,和自己動手在docker中裝資料庫有一丟丟區別,我做了個對比圖如下

流程圖 (5)
  • 可見Zero Config Setup的好處是啥都不用配,有docker就行,劣勢是必須要用mvn quarkus:dev啟動應用,profile固定是dev

  • 看到這裡,您是否會這麼覺得:哦,知道了,那我去建一個application-dev.properites文件,裡面沒有資料庫配置,然後執行mvn quarkus:dev啟動應用就行了,就這點內容唄,欣宸你別寫了,太啰嗦...

  • 確實內容少,但是它有坑啊,所以請您隨本文一同實戰吧,等到操作成功的那一刻,新技能get帶來的舒適感相信您也不會拒絕,然後用起Zero Config Setup直呼666

  • 接下來咱們親自動手體驗這個Zero Config Setup,看看適不適合開發階段使用

關於資料庫操作的源碼

名稱 鏈接 備註
項目主頁 https://github.com/zq2599/blog_demos 該項目在GitHub上的主頁
git倉庫地址(https) https://github.com/zq2599/blog_demos.git 該項目源碼的倉庫地址,https協議
git倉庫地址(ssh) [email protected]:zq2599/blog_demos.git 該項目源碼的倉庫地址,ssh協議
  • 這個git項目中有多個文件夾,本次實戰的源碼在quarkus-tutorials文件夾下,如下圖紅框
    image-20220312091203116
  • quarkus-tutorials是個父工程,裡面有多個module,本篇實戰的module是basic-db,如下圖紅框
    image-20220504102912592

提前下載docker鏡像

  • 建議先把鏡像下載到本地才能使用Zero Config Setup功能,否則如果等quarkus框架自動下載鏡像,可能會有如下錯誤發生
[INFO] Compiling 1 source file to /Users/zhaoqin/github/blog_demos/quarkus-tutorials/basic-db/target/test-classes
Listening for transport dt_socket at address: 5005
2022-05-08 10:52:56,714 ERROR [com.git.doc.api.asy.ResultCallbackTemplate] (docker-java-stream-1954350275) Error during callback: com.github.dockerjava.api.exception.InternalServerErrorException: Status 500: {"message":"Head \"https://registry-1.docker.io/v2/testcontainers/ryuk/manifests/0.3.3\": unauthorized: incorrect username or password"}

        at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.execute(DefaultInvocationBuilder.java:247)
        at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.lambda$executeAndStream$1(DefaultInvocationBuilder.java:269)
        at java.base/java.lang.Thread.run(Thread.java:829)

2022-05-08 10:52:57,019 INFO  [io.qua.dep.dev.IsolatedDevModeMain] (main) Attempting to start live reload endpoint to recover from previous Quarkus startup failure
2022-05-08 10:52:57,037 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
        [error]: Build step io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor#launchDatabases threw an exception: java.lang.RuntimeException: com.github.dockerjava.api.exception.InternalServerErrorException: Status 500: {"message":"Head \"https://registry-1.docker.io/v2/testcontainers/ryuk/manifests/0.3.3\": unauthorized: incorrect username or password"}

        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:314)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.launchDatabases(DevServicesDatasourceProcessor.java:121)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:882)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
        at java.base/java.lang.Thread.run(Thread.java:829)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Caused by: com.github.dockerjava.api.exception.InternalServerErrorException: Status 500: {"message":"Head \"https://registry-1.docker.io/v2/testcontainers/ryuk/manifests/0.3.3\": unauthorized: incorrect username or password"}

        at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.execute(DefaultInvocationBuilder.java:247)
        at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.lambda$executeAndStream$1(DefaultInvocationBuilder.java:269)
        at java.base/java.lang.Thread.run(Thread.java:829)
  • 為了避免上述錯誤,以下兩種方式都可以,請您二選一即可
  1. 提前下載docker鏡像,命令是docker pull testcontainers/ryuk:0.3.3(當您看到此文是,tag可能不是0.3.3了,你可以從錯誤信息中確定您那邊的tag)
  2. 如果您有docker賬號,執行命令docker login index.docker.io登錄docker

dev這個profile的配置文件

  • 新增名文件application-dev.properties,裡面就一行內容
quarkus.hibernate-orm.sql-load-script=import.sql
  • 可見和之前的application-test.properties相比,dev這個profile下的配置文件中,不能有任何資料庫配置(資料庫IP、埠、庫名、賬號、密碼等)

啟動應用

  • 進入目錄quarkus-tutorials/basic-db,執行命令mvn quarkus:dev啟動應用,控制台輸入如下
[INFO] Nothing to compile - all classes are up to date
Listening for transport dt_socket at address: 5005
2022-05-08 17:51:48,010 INFO  [io.qua.dat.dep.dev.DevServicesDatasourceProcessor] (build-12) Dev Services for the default datasource (postgresql) started.
2022-05-08 17:51:48,011 INFO  [io.qua.hib.orm.dep.HibernateOrmProcessor] (build-5) Setting quarkus.hibernate-orm.database.generation=drop-and-create to initialize Dev Services managed database
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2022-05-08 17:51:48,244 INFO  [io.agr.pool] (Quarkus Main Thread) Datasource '<default>': Initial size smaller than min. Connections will be created when necessary

Hibernate: 
    
    drop table if exists known_fruits cascade
2022-05-08 17:51:48,510 WARN  [org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread: <default>) SQL Warning Code: 0, SQLState: 00000
2022-05-08 17:51:48,511 WARN  [org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread: <default>) table "known_fruits" does not exist, skipping
Hibernate: 
    
    drop sequence if exists known_fruits_id_seq
2022-05-08 17:51:48,512 WARN  [org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread: <default>) SQL Warning Code: 0, SQLState: 00000
2022-05-08 17:51:48,512 WARN  [org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread: <default>) sequence "known_fruits_id_seq" does not exist, skipping
Hibernate: create sequence known_fruits_id_seq start 10 increment 1
Hibernate: 
    
    create table known_fruits (
       id int4 not null,
        name varchar(40),
        primary key (id)
    )

Hibernate: 
    
    alter table if exists known_fruits 
       add constraint UK_57g3m8wr3qxoj706a6hsqg6ye unique (name)

Hibernate: 
    INSERT INTO known_fruits(id, name) VALUES (1, 'Cherry')
Hibernate: 
    INSERT INTO known_fruits(id, name) VALUES (2, 'Apple')
Hibernate: 
    INSERT INTO known_fruits(id, name) VALUES (3, 'Banana')
2022-05-08 17:51:48,558 INFO  [io.quarkus] (Quarkus Main Thread) basic-db 1.0-SNAPSHOT on JVM (powered by Quarkus 2.7.3.Final) started in 2.706s. 
2022-05-08 17:51:48,559 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2022-05-08 17:51:48,559 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, hibernate-orm, jdbc-postgresql, narayana-jta, smallrye-context-propagation]
--
--
Tests paused
Press [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
  • 從上述信息可見,即便是沒有資料庫,也沒有資料庫配置,quarkus也會通過docker為應用把資料庫備好,讓應用順利啟動、連接、執行初始化SQL

執行單元測試

  • 從上述控制台信息可見,目前的控制條已經處於命令行交互模式,先輸入o開啟測試日誌輸出開關
  • 然後再輸入r開始執行單元測試,控制台輸出如下,可見和上一篇的操作並沒有什麼區別(還省去了資料庫的部署和配置)
image-20220508180422674
  • 至此,Zero Config Setup的體驗就完成了,雖然省去了資料庫的部署和配置,但profile被限定在dev,這怕是很多人不情願的,另外這都是後臺命令的操作,IDEA的單元測試頁面也不知道如何與quarkus的dev模式結合起來用,又是個巨大損失,所以,Zero Config Setup到底適不適用也是見仁見智

接受資料庫的license

  • 如果您用的資料庫是DB2或者MSSQL,在使用Zero Config Setup的時候會涉及到接受license的操作,您需要新增文件src/main/resources/container-license-acceptance.txt,內容如下,就是資料庫的鏡像名
ibmcom/db2:11.5.0.0a
mcr.microsoft.com/mssql/server:2017-CU12

MySQL的配置

  • 在使用MySQL的時候,我們可能對其做一些配置,那麼Zero Config Setup提供的MySQL就無法滿足我們的需求了,這裡可以通過配置來指定MySQL配置信息(個人的感覺,就是為瞭解決一個問題而引入了新的問題)
quarkus.datasource.devservices.container-properties.TC_MY_CNF=testcontainers/mysql-conf

發現神秘信息

  • 接下來聊聊一次偶然的發現,既有驚喜也有疑惑,還希望親愛的讀者能夠給予指導和建議

  • 回想一下,當您使用mvn quarkus:dev啟動應用後,控制台提示如下信息

Press [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
  • 於是,我按照上述提示輸入冒號,進入quarkus的終端模式,控制條提示如下
You are now in Quarkus Terminal. Your app is still running. Use `help` or tab completion to explore, `quit` or `q` to return to your application.
quarkus$
  • 然後,輸入postgres print-command,就會看到quarkus創建的資料庫信息,賬號、密碼、埠、庫名、啥都有,如下,真是神奇啊
quarkus$ postgres print-command
PGPASSWORD=quarkus psql --host=localhost --port=49294 --username=quarkus default
  • 上述信息,應該是quarkus在docker上創建的資料庫信息,於是我興衝衝地用IDEA的資料庫工具去連接這個資料庫,如下圖,天哪,連接成功了
image-20220508182514692
  • 然後查看表的數據,如下圖,正是初始化腳本import.sql中新增的內容
image-20220508183042894
  • 本以為發現了quarkus的驚天秘密,今後開發中隨時可以連接此資料庫查看數據,結果發現單元測試對數據的任何寫操作,都不會改變上圖表中的內容,這和使用自己的資料庫是完全不同的,上一篇文章中,咱們執行完單元測試後,寫操作的結果在資料庫中是可以查到的

  • 目前還沒有查到上述問題的原因,估計是quarkus自己內部的處理機制吧,例如自動rollback,或者某些程度的可見性隔離等,這都是猜的,親愛的讀者,如果您知道了原因,麻煩您在回覆中指點一二,謝謝了

  • 其實這也不是什麼問題,不去查那個表就行了,單元測試的讀寫功能是正常的,也就是說單元測試中,數據發生變化後程式可以讀取到變化後的數據,只是我們用工具看不到變化而已(官方文檔也沒有提及用工具去連接那個表,應該是不推薦這麼做)

  • 至此,quarkus的Zero Config Setup體驗完成,希望這個小技能可以對您有所幫助,以更簡單的操作度過編碼和自測的時光

歡迎關註博客園:程式員欣宸

學習路上,你不孤單,欣宸原創一路相伴...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • package com.yc.cloud.excel.util; import cn.hutool.poi.excel.ExcelWriter; import lombok.extern.slf4j.Slf4j; import org.apache.poi.hssf.usermodel.HSSFCl ...
  • ## 1、說明 一般情況下,都是在model中指定一個資料庫連接參數即可。但某些情況下,相同的庫表會在不同地區都有部署,這個時候需要按地區進行切換(只有一個model情況下)。 ## 2、多model繼承方式 Model層代碼 ``` //A地區的資料庫 class A extends Model ...
  • [TOC] ## 1. 好險,差點被噴 早幾天發了一篇文章:[《僅三天,我用 GPT-4 生成了性能全網第一的 Golang Worker Pool,輕鬆打敗 GitHub 萬星項目》](https://www.danielhu.cn/golang-gopool-1/),這標題是挺容易被懟,哇咔咔; ...
  • 變數 變數是一種可以賦給值的標簽。每一個變數都指向一個相關聯的值,下列代碼中 message 即為變數,指向的值為“Hello Python world !” message = "Hello Python world!" print(message) 第二行的 print() 函數用於列印輸出這個 ...
  • C++ STL 中的非變易演算法(Non-modifying Algorithms)是指那些不會修改容器內容的演算法,是C++提供的一組模板函數,該系列函數不會修改原序列中的數據,而是對數據進行處理、查找、計算等操作,並通過迭代器實現了對序列元素的遍歷與訪問。由於迭代器與演算法是解耦的,因此非變易演算法可以... ...
  • # 將Markdown文件上傳到博客園 # 1.下載python 下載地址為:http://npm.taobao.org/mirrors/python/ 安裝為3.10.11版本 在cmd視窗輸入python,彈出以下視窗為安裝成功 ![image-20230816102551883](https: ...
  • 所謂**數據轉置**,就是是將原始數據表格沿著對角線翻折,使原來的行變成新的列,原來的列變成新的行,從而更方便地進行數據分析和處理。 `pandas`中`DataFrame`的轉置非常簡單,每個`DataFrame`對象都有一個`T`屬性,通過這個屬性就能得到轉置之後的`DataFrame`。下麵介 ...
  • Elasticsearch是一個分散式、RESTful風格的搜索和數據分析引擎,適用於各種數據類型,數字、文本、地理位置、結構化數據、非結構化數據; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...