简体   繁体   English

当 Docker 容器中的 Java MVC 应用程序尝试连接到另一个容器中的 MySQL 时,表不存在错误

[英]Table Doesn't Exist Error When Java MVC app in Docker Container Try to Connect to MySQL in Another Container

I have a Java-Hibernate MVC web application that uses a mySql database.我有一个使用 mySql 数据库的 Java-Hibernate MVC Web 应用程序。 It works fine on my computer but doesn't work when I try to run it using docker containers.它在我的计算机上运行良好,但当我尝试使用 docker 容器运行它时不起作用。 I am using Docker Toolbox on Windows Home because the latest version of Docker requires Windows Professional.我在 Windows Home 上使用 Docker Toolbox,因为最新版本的 Docker 需要 Windows Professional。

-------Please ignore class and function and database names in my code snippets below, I quickly changed the names to retain anonymity. -------请忽略下面代码片段中的类和函数以及数据库名称,我迅速更改了名称以保持匿名。 I have carefully verified that in reality all the names are correct.我已经仔细验证过,实际上所有的名字都是正确的。 ---------- ----------

I have an MVC web application running on Tomcat in one container and a mySql database running in the other.我在一个容器中的 Tomcat 上运行了一个 MVC Web 应用程序,另一个容器中运行了一个 mySql 数据库。 I think my application can connect to the database because I am able to load the home page in my web application in one of the Docker containers without error.我认为我的应用程序可以连接到数据库,因为我能够在我的 Web 应用程序中的一个 Docker 容器中加载主页而不会出错。 But when I try to put something in one of the MySql tables I get the following error:但是,当我尝试将某些内容放入 MySql 表之一时,出现以下错误:

 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'no_visits.visitors' doesn't exist
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:423)
com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
com.mysql.jdbc.Util.getInstance(Util.java:408)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484)
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966)
com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:353)
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60)
org.hibernate.loader.Loader.getResultSet(Loader.java:2168)
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1931)
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1893)
org.hibernate.loader.Loader.doQuery(Loader.java:938)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
org.hibernate.loader.Loader.doList(Loader.java:2692)
org.hibernate.loader.Loader.doList(Loader.java:2675)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507)
org.hibernate.loader.Loader.list(Loader.java:2502)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:392)
org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
org.hibernate.internal.SessionImpl.list(SessionImpl.java:1489)
org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445)
org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
org.hibernate.query.Query.getResultList(Query.java:146)
com.horse.novisit.dao.VisitDAOImpl.isVisit(isVisitImpl.java:79)
com.horse.novisit.service.VisitServiceImpl.isVisit(isVisitImpl.java:67)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
com.sun.proxy.$Proxy52.isLongUrlInDB(Unknown Source)
com.horse.noToVisit.controller.visitController.postBigVisit(VisitController.java:47)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

This isn't a direct answer, yet.这还不是一个直接的答案。 Just a way to help you troubleshoot.只是一种帮助您解决问题的方法。

When the container is running:当容器运行时:

docker ps

Find the process id查找进程ID

docker exec -it theidgoeshere bash

That will get you a bash shell into the running docker process.这将使您进入正在运行的 docker 进程中的 bash shell。 From there you can examine the log files of the running processes.从那里您可以检查正在运行的进程的日志文件。 You might not have bash available but that command is very useful.您可能没有可用的 bash,但该命令非常有用。 Read here: https://docs.docker.com/engine/reference/commandline/exec/在这里阅读: https : //docs.docker.com/engine/reference/commandline/exec/

If this is all greek then I can point you to some more online material.如果这都是希腊语,那么我可以为您提供更多在线资料。

Try this :尝试这个 :

docker network create -d bridge my-network

docker build -t my-mysqldb .

docker run -p 3306:3306 --network=my-network --name no-visit -itd my-mysqldb

docker build -t spring-mvc-image .

docker run -p 8080:8080 --network=my-network --name spring-mvc-container -itd -e DATABASE_HOST=no-visit -e DATABASE_PORT=3306 -e DATABASE_NAME=no_visit -e DATABASE_USER=visitor -e DATABASE_PASSWORD=visitor spring-mvc-image

And after this when you run docker ps it should show you both the containers in running state.在此之后,当您运行docker ps它应该向您显示两个处于运行状态的容器。

If problem still persists check the logs docker logs no-visit .如果问题仍然存在,请检查日志docker logs no-visit

Problem solved.问题解决了。 The name of the database in the .sql script I was running turned out to be wrong.我正在运行的 .sql 脚本中的数据库名称原来是错误的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM