quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)

这篇具有很好参考价值的文章主要介绍了quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本篇内容并非数据库相关的核心知识,而是对一个实用工具的说明介绍,此工具在官方介绍中被称为Zero Config Setup (Dev Services),(零配置的设置,忒莫名其妙)

  • 我这边简单总结为:如果你没有数据库可用,只要你有docker,quarkus应用就能进行数据库相关的开发工作,增删改查啥都行,和有数据库的时候没啥区别

  • 看到这里,经验丰富的您应该会觉得:既然有docker,那么用docker run装一个数据库不就行了吗,和quarkus工具有啥关系?

  • 其实这个Zero Config Setup还算是有那么一点自己的特色,和自己动手在docker中装数据库有一丢丢区别,我做了个对比图如下

quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)
  • 可见Zero Config Setup的好处是啥都不用配,有docker就行,劣势是必须要用mvn quarkus:dev启动应用,profile固定是dev

  • 看到这里,您是否会这么觉得:哦,知道了,那我去建一个application-dev.properites文件,里面没有数据库配置,然后执行mvn quarkus:dev启动应用就行了,就这点内容呗,欣宸你别写了,太啰嗦...

  • 确实内容少,但是它有坑啊,所以请您随本文一同实战吧,等到操作成功的那一刻,新技能get带来的舒适感相信您也不会拒绝,然后用起Zero Config Setup直呼666

  • 接下来咱们亲自动手体验这个Zero Config Setup,看看适不适合开发阶段使用

关于数据库操作的源码

  • quarkus操作数据库的代码,就直接用前文《quarkus数据库篇之一》的代码吧,除了从前文拷贝,您也可以在我的GitHub仓库下载,,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos)
名称 链接 备注
项目主页 https://github.com/zq2599/blog_demos 该项目在GitHub上的主页
git仓库地址(https) https://github.com/zq2599/blog_demos.git 该项目源码的仓库地址,https协议
git仓库地址(ssh) git@github.com:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议
  • 这个git项目中有多个文件夹,本次实战的源码在quarkus-tutorials文件夹下,如下图红框
    quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)
  • quarkus-tutorials是个父工程,里面有多个module,本篇实战的module是basic-db,如下图红框
    quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)

提前下载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开始执行单元测试,控制台输出如下,可见和上一篇的操作并没有什么区别(还省去了数据库的部署和配置)
quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)
  • 至此,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的数据库工具去连接这个数据库,如下图,天哪,连接成功了
quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)
  • 然后查看表的数据,如下图,正是初始化脚本import.sql中新增的内容
quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)
  • 本以为发现了quarkus的惊天秘密,今后开发中随时可以连接此数据库查看数据,结果发现单元测试对数据的任何写操作,都不会改变上图表中的内容,这和使用自己的数据库是完全不同的,上一篇文章中,咱们执行完单元测试后,写操作的结果在数据库中是可以查到的

  • 目前还没有查到上述问题的原因,估计是quarkus自己内部的处理机制吧,例如自动rollback,或者某些程度的可见性隔离等,这都是猜的,亲爱的读者,如果您知道了原因,麻烦您在回复中指点一二,谢谢了

  • 其实这也不是什么问题,不去查那个表就行了,单元测试的读写功能是正常的,也就是说单元测试中,数据发生变化后程序可以读取到变化后的数据,只是我们用工具看不到变化而已(官方文档也没有提及用工具去连接那个表,应该是不推荐这么做)

  • 至此,quarkus的Zero Config Setup体验完成,希望这个小技能可以对您有所帮助,以更简单的操作度过编码和自测的时光

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...文章来源地址https://www.toymoban.com/news/detail-650332.html

到了这里,关于quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Oracle数据库从入门到精通系列之二十一:Oracle 19c数据库增加重做日志大小

    在此最佳实践中,我们增加了 Oracle 重做日志的大小以提高数据库性能。适当调整数据库重做日志的大小可以减少数据库中的等待事件,从而优化数据库系统。 数据库重做日志至少包含两个文件,负责存储对数据库所做的任何更新。重做日志对于数据库至关重要,因为它们可

    2024年04月26日
    浏览(51)
  • 开源数据库MySQL 8.0 OCP认证精讲视频、环境和题库 之二

    修改用户的初始密码: mysqlalteruserroot@localhostidentifiedby\\\'Qaz1234; 或者: mysqlalteruseruser0identifiedby\\\'Qaz_1234\\\'; 在版本5.x中: mysqlsetpassword=password(Qaz_1234\\\'); 可执行文件: 服务器端:mysgld多线程 客户端:mysqlmysqladminmysqldumpmysqlbackup mysqlshowdatabases; mysqlselectdatabaseO; mysqlselectuser0; mysqlcrea

    2024年02月08日
    浏览(52)
  • JS实现搜索功能页面(可搜索,无需数据库,无后端)

    很多刚学习前端的小伙伴想做一个搜索页面,一看要做后端又要数据库的可能就放弃了,这里给大家带来一个不需要数据库的,也可以使用的搜索功能页面。网页包含了3个功能:搜索框,类别选项,价格进度条。 搜索框是实时搜索的,而且做了不区分英语大小写,也支持中

    2024年02月11日
    浏览(43)
  • 【PHP图片托管】CFimagehost搭建私人图床 - 无需数据库支持

    图片服务器也称作图床,可以说是互联网存储中最重要的应用之一,不仅网站需要图床提供的外链调取图片,个人或企业也用图床存储各种图片,方便随时访问查看。不过由于图床很不挣钱,各互联网大厂正在逐步关停所属的图床服务器,这也导致用户只能自己想办法,搭建

    2024年02月07日
    浏览(40)
  • 智云影院CMS程序PHP源码, 无需数据库,附带搭建教程

    源码介绍 本程序无需数据库,直接上传源码即可访问,(服务器或虚拟主机空间)都可以搭建使用!模板自适应端,浏览体验更佳!安装操作简单!无需繁琐的操作,即可快速拥有一个视频看片资源网站!通用苹果cms10的m3u8 josn或者是josn接口数据,本程序暂不支持上传到二级

    2024年01月25日
    浏览(36)
  • 使用CFimagehost源码自建无需数据库支持的PHP图片托管服务

    图片服务器也称作图床,可以说是互联网存储中最重要的应用之一,不仅网站需要图床提供的外链调取图片,个人或企业也用图床存储各种图片,方便随时访问查看。不过由于图床很不挣钱,各互联网大厂正在逐步关停所属的图床服务器,这也导致用户只能自己想办法,搭建

    2024年02月04日
    浏览(44)
  • 使用CFimagehost源码搭建免费的PHP图片托管私人图床,无需数据库支持

    图片服务器也称作图床,可以说是互联网存储中最重要的应用之一,不仅网站需要图床提供的外链调取图片,个人或企业也用图床存储各种图片,方便随时访问查看。不过由于图床很不挣钱,各互联网大厂正在逐步关停所属的图床服务器,这也导致用户只能自己想办法,搭建

    2024年02月07日
    浏览(46)
  • 使用CFimagehost源码搭建无需数据库支持的PHP免费图片托管私人图床

    图片服务器也称作图床,可以说是互联网存储中最重要的应用之一,不仅网站需要图床提供的外链调取图片,个人或企业也用图床存储各种图片,方便随时访问查看。不过由于图床很不挣钱,各互联网大厂正在逐步关停所属的图床服务器,这也导致用户只能自己想办法,搭建

    2024年02月08日
    浏览(47)
  • 【SQL Server】无需公网IP,就可以远程连接SQL Server数据库

    目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.本地网页发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 数据库的重要性相信大家都有所了解,作为各种数据的电子资料夹,

    2023年04月24日
    浏览(45)
  • DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务

    最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 图片服务器也称作图床,可以说是互联网存储中最重要的应用之一,不仅网站需要图床提

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包