【问题标题】:Issues connecting to (Mysql) database (running in docker-compose) from quarkus application从 quarkus 应用程序连接到(Mysql)数据库(在 docker-compose 中运行)的问题
【发布时间】:2020-12-26 07:21:10
【问题描述】:

我有一个 quarkus 应用程序正在尝试连接到 mysql 数据库,这两个数据库都在 docker-compose 中运行。应用程序已启动,正在处理请求(这里是 docker-compose 日志的屏幕截图,显示 quarkus 应用程序和 mysql 正在启动): [![docker-compose 启动日志][1]][1]

为了验证 quarkus 应用程序是否正常工作,我向:http://localhost:8080/health/liveliness 发出请求。屏幕截图如下所示: [![活跃度检查][2]][2]

数据库也已启动并可用(验证您是否可以运行mysql -h 192.168.0.4 -P 3306 -u user -p,当提示输入密码时,输入密码)。您可以在下面看到我能够登录并运行一些伪命令的屏幕截图:

但是,当我提出涉及对数据库运行查询的请求时,它总是超时。完整的日志(包括堆栈跟踪)如下所示:

    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    reading-comprehension-ws_1  | 2020-09-07 21:59:51,526 INFO  [com.con.rea.int.DebugInterceptor] (executor-thread-1) Unique id: 6060ad67-723a-4899-afa4-0811ec9dc3b4 com.connor.reading.dao.AssessmentDao.getAllAssessmentsthrew exception of type class com.connor.reading.exception.SystemException for parameters empty (no parameters)
    reading-comprehension-ws_1  | 2020-09-07 21:59:51,526 INFO  [com.con.rea.int.DebugInterceptor] (executor-thread-1) Unique id: 6060ad67-723a-4899-afa4-0811ec9dc3b4 com.connor.reading.service.AssessmentService.getAssessmentsthrew exception of type class com.connor.reading.exception.SystemException for parameters NULL, NULL
    reading-comprehension-ws_1  | 2020-09-07 21:59:51,526 INFO  [com.con.rea.int.DebugInterceptor] (executor-thread-1) Unique id: 6060ad67-723a-4899-afa4-0811ec9dc3b4 com.connor.reading.controller.AssessmentsApiImpl.getAssessmentsthrew exception of type class com.connor.reading.exception.SystemException for parameters NULL, NULL
    reading-comprehension-ws_1  | 2020-09-07 21:59:51,526 ERROR [com.con.rea.uti.ExceptionMapperImpl] (executor-thread-1) Handling error: com.connor.reading.exception.SystemException: There was an error when querying the database for all assessments.  The sql ran was select * from rc.assessments
    reading-comprehension-ws_1  |   at com.connor.reading.dao.AssessmentDao.getAllAssessments(AssessmentDao.java:42)
    reading-comprehension-ws_1  |   at com.connor.reading.dao.AssessmentDao_Subclass.getAllAssessments$$superaccessor2(AssessmentDao_Subclass.zig:368)
    reading-comprehension-ws_1  |   at com.connor.reading.dao.AssessmentDao_Subclass$$function$$2.apply(AssessmentDao_Subclass$$function$$2.zig:29)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54)
    reading-comprehension-ws_1  |   at com.connor.reading.interceptor.DebugInterceptor.handleAroundInvoke(DebugInterceptor.java:33)
    reading-comprehension-ws_1  |   at com.connor.reading.interceptor.DebugInterceptor_Bean.intercept(DebugInterceptor_Bean.zig:385)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
    reading-comprehension-ws_1  |   at com.connor.reading.dao.AssessmentDao_Subclass.getAllAssessments(AssessmentDao_Subclass.zig:326)
    reading-comprehension-ws_1  |   at com.connor.reading.service.AssessmentService.getAssessments(AssessmentService.java:32)
    reading-comprehension-ws_1  |   at com.connor.reading.service.AssessmentService_Subclass.getAssessments$$superaccessor1(AssessmentService_Subclass.zig:241)
    reading-comprehension-ws_1  |   at com.connor.reading.service.AssessmentService_Subclass$$function$$1.apply(AssessmentService_Subclass$$function$$1.zig:41)
reading-comprehension-ws_1  |   at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54)
    reading-comprehension-ws_1  |   at com.connor.reading.interceptor.DebugInterceptor.handleAroundInvoke(DebugInterceptor.java:33)
    reading-comprehension-ws_1  |   at com.connor.reading.interceptor.DebugInterceptor_Bean.intercept(DebugInterceptor_Bean.zig:385)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
    reading-comprehension-ws_1  |   at com.connor.reading.service.AssessmentService_Subclass.getAssessments(AssessmentService_Subclass.zig:196)
    reading-comprehension-ws_1  |   at com.connor.reading.controller.AssessmentsApiImpl.getAssessments(AssessmentsApiImpl.java:28)
    reading-comprehension-ws_1  |   at com.connor.reading.controller.AssessmentsApiImpl_Subclass.getAssessments$$superaccessor1(AssessmentsApiImpl_Subclass.zig:211)
    reading-comprehension-ws_1  |   at com.connor.reading.controller.AssessmentsApiImpl_Subclass$$function$$1.apply(AssessmentsApiImpl_Subclass$$function$$1.zig:41)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54)
    reading-comprehension-ws_1  |   at com.connor.reading.interceptor.DebugInterceptor.handleAroundInvoke(DebugInterceptor.java:33)
    reading-comprehension-ws_1  |   at com.connor.reading.interceptor.DebugInterceptor_Bean.intercept(DebugInterceptor_Bean.zig:385)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41)
    reading-comprehension-ws_1  |   at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32)
    reading-comprehension-ws_1  |   at com.connor.reading.controller.AssessmentsApiImpl_Subclass.getAssessments(AssessmentsApiImpl_Subclass.zig:166)
    reading-comprehension-ws_1  |   at com.connor.reading.controller.AssessmentsApiImpl_ClientProxy.getAssessments(AssessmentsApiImpl_ClientProxy.zig:195)
    reading-comprehension-ws_1  |   at java.lang.reflect.Method.invoke(Method.java:566)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:167)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:638)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:504)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:454)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:456)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:417)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:391)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:68)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:488)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:259)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:160)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:163)
    reading-comprehension-ws_1  |   at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:245)
    reading-comprehension-ws_1  |   at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:73)
    reading-comprehension-ws_1  |   at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:132)
    reading-comprehension-ws_1  |   at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.access$000(VertxRequestHandler.java:37)
    reading-comprehension-ws_1  |   at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:94)
reading-comprehension-ws_1  |   at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    reading-comprehension-ws_1  |   at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2046)
    reading-comprehension-ws_1  |   at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1578)
    reading-comprehension-ws_1  |   at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
    reading-comprehension-ws_1  |   at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
    reading-comprehension-ws_1  |   at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
    reading-comprehension-ws_1  |   at java.lang.Thread.run(Thread.java:834)
    reading-comprehension-ws_1  |   at org.jboss.threads.JBossThread.run(JBossThread.java:479)
    reading-comprehension-ws_1  |   at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
    reading-comprehension-ws_1  |   at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193)
    reading-comprehension-ws_1  | Caused by: com.connor.quarkus.jdbc.QuarkusDataAccessException: An error occurred
    reading-comprehension-ws_1  |   at com.connor.quarkus.jdbc.QuarkusJdbcTemplate.query(QuarkusJdbcTemplate.java:31)
    reading-comprehension-ws_1  |   at com.connor.reading.dao.AssessmentDao.getAllAssessments(AssessmentDao.java:39)
    reading-comprehension-ws_1  |   ... 61 more
    reading-comprehension-ws_1  | Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
    reading-comprehension-ws_1  | 
    reading-comprehension-ws_1  | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    reading-comprehension-ws_1  |   at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
    reading-comprehension-ws_1  |   at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
    reading-comprehension-ws_1  |   at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
    reading-comprehension-ws_1  |   at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
    reading-comprehension-ws_1  |   at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
    reading-comprehension-ws_1  |   at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
    reading-comprehension-ws_1  |   at io.agroal.pool.ConnectionFactory.createConnection(ConnectionFactory.java:200)
    reading-comprehension-ws_1  |   at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:419)
    reading-comprehension-ws_1  |   at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:401)
    reading-comprehension-ws_1  |   at java.util.concurrent.FutureTask.run(FutureTask.java:264)
reading-comprehension-ws_1  |   at io.agroal.pool.util.PriorityScheduledExecutor.beforeExecute(PriorityScheduledExecutor.java:65)
    reading-comprehension-ws_1  |   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1126)
    reading-comprehension-ws_1  |   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    reading-comprehension-ws_1  |   at java.lang.Thread.run(Thread.java:834)
    reading-comprehension-ws_1  |   ... 2 more
    reading-comprehension-ws_1  | Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
    reading-comprehension-ws_1  | 
    reading-comprehension-ws_1  | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    reading-comprehension-ws_1  |   at java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    reading-comprehension-ws_1  |   at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
    reading-comprehension-ws_1  |   at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
    reading-comprehension-ws_1  |   at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
    reading-comprehension-ws_1  |   at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
    reading-comprehension-ws_1  |   at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91)
    reading-comprehension-ws_1  |   at com.mysql.cj.NativeSession.connect(NativeSession.java:144)
    reading-comprehension-ws_1  |   at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956)
    reading-comprehension-ws_1  |   at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
    reading-comprehension-ws_1  |   ... 13 more
    reading-comprehension-ws_1  | Caused by: java.net.ConnectException: Connection timed out (Connection timed out)
    reading-comprehension-ws_1  |   at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_VA_LIST:Ljava_net_ConnectException_2_0002e_0003cinit_0003e_00028Ljava_lang_String_2_00029V(JNIJavaCallWrappers.java:0)
    reading-comprehension-ws_1  |   at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java)
    reading-comprehension-ws_1  |   at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    reading-comprehension-ws_1  |   at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    reading-comprehension-ws_1  |   at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    reading-comprehension-ws_1  |   at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
    reading-comprehension-ws_1  |   at java.net.Socket.connect(Socket.java:609)
    reading-comprehension-ws_1  |   at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
    reading-comprehension-ws_1  |   at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
    reading-comprehension-ws_1  |   ... 16 more

存储库链接:https://gitlab.com/connorbutch/reading-comprehension(在分支上9-list-all-assessments

Docker compose 文件(用于运行数据库和应用程序)的内容可以在这里找到:https://gitlab.com/connorbutch/reading-comprehension/-/blob/9-list-all-assessments/reading-comprehension-server-quarkus-impl/infrastructure/docker-compose.yml。为方便起见,请查看以下内容:

#This file is NOT ever intended for use in production.  Docker-compose is a great tool for running
#database with our application for acceptance testing.
version: '3.3'

#Assign a static ip to the database so that it runs the same on gitlab ci server (as the localhost alias does not work with docker:dind as a service)
networks:
  network:
    ipam:
      driver: default
      config:
        - subnet: 192.168.0.0/24
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'rc'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - my-db:/var/lib/mysql
    networks:
      network:
        ipv4_address: 192.168.0.4
  reading-comprehension-ws:
    image: registry.gitlab.com/connorbutch/reading-comprehension
    restart: on-failure
    ports:
      - 8080:8080
    expose:
      - 8080
volumes:
  my-db:

对于不熟悉 quarkus 的人来说,它的工作原理类似于 spring,因为它会根据 application.properties 中设置的值自动连接/注入数据源。你可以在这里找到这个文件:https://gitlab.com/connorbutch/reading-comprehension/-/blob/9-list-all-assessments/reading-comprehension-server-quarkus-impl/src/main/resources/application.properties,我还在下面提供了源代码:

#Adding reflection config for generated models as well as properties file containing sql -> https://quarkus.io/guides/writing-native-applications-tips
quarkus.native.additional-build-args =-H:ReflectionConfigurationFiles=reflection-config.json, -H:ResourceConfigurationFiles=resources-config.json

#database (mysql) stuff -> https://quarkus.io/guides/datasource
quarkus.datasource.db-kind=mysql
quarkus.datasource.username=root
quarkus.datasource.password=password
quarkus.datasource.jdbc.url=jdbc:mysql://192.168.0.4:3306/rc
#the below doesn't seem to execute on startup, which makes me think it can't connect at all
#quarkus.datasource.new-connection-sql=CREATE DATABASE IF NOT EXISTS RC

要运行应用程序,请使用此文件:https://gitlab.com/connorbutch/reading-comprehension/-/blob/9-list-all-assessments/run-it.sh

关于查看什么(application.yaml、build.gradle 等)有什么想法吗? 谢谢, 康纳 [1]:https://i.stack.imgur.com/5Hmry.jpg [2]:https://i.stack.imgur.com/9nHip.png

【问题讨论】:

    标签: mysql jdbc docker-compose quarkus


    【解决方案1】:

    您的服务无法连接到您的数据库,请尝试将以下内容添加到您的服务“reading-comprehension-ws”:

    environment:
      quarkus.datasource.url: "jdbc:mysql://db:3306/{your-schema name}"
    

    您需要将 {your-schema name} 替换为您的真实架构名称。

    由于它们在同一个 docker-compose 网络中运行,您的服务应该能够通过服务名称查找您的数据库。

    【讨论】:

    • 感谢您的建议。我还在 application.properties 中添加了架构名称作为 url 的一部分,但它仍然不起作用。是否需要引号或环境变量?
    • 您能否发布完整的 docker-compose 以及您的 quarkus 应用使用的连接字符串。
    • 感谢您的持续帮助;我很感激!我更新了我的答案以显示 jdbc 连接字符串,以及 application.properties 的其余部分。值得注意的是,如果我在 jdbc 字符串中输入了错误的主机,我会得到一个完全不同的错误(根本无法连接),而不是我目前得到的超时。再次感谢。
    • 尝试从您的服务容器执行批处理命令并尝试远程登录到数据库以检查它是否可以访问。要从容器执行批处理: docker exec -it {container-id or container-name} /bin/bash.
    • 我再次验证我可以连接到容器(通过使用 docker exec 执行命令,以及使用本地计算机上的 mysql 和 mysqladmin 进行连接,两者都可以)。如果我不得不猜测,我相信这是我需要调整的特定于农业的东西。您对此有什么建议吗?
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2021-08-02
    • 2017-11-18
    • 1970-01-01
    • 2019-10-19
    • 2019-08-28
    • 1970-01-01
    • 2020-11-14
    相关资源
    最近更新 更多