通过hibernate将tomcat容器上的web应用程序连接到mysql容器

通过hibernate将tomcat容器上的web应用程序连接到mysql容器,mysql,hibernate,tomcat,jdbc,docker,Mysql,Hibernate,Tomcat,Jdbc,Docker,我正在尝试将我的web应用程序从windows(使用xampp for apache+mysql)移植到ubuntu(使用docker容器,所以我有两个容器:一个是tomcat,另一个是mysql。它们是链接的) 与此相关,我无法访问我的sql容器。这是从中国进口的 Tomcat容器是从官方的Tomcat:8.0图像创建的 这两个容器通过创建的桥接docker网络链接 这是一个web应用程序,提供登录+注册服务,检查用户在数据库中的状态 我得说在windows上一切都很好 这是我的hiberna

我正在尝试将我的web应用程序从windows(使用xampp for apache+mysql)移植到ubuntu(使用docker容器,所以我有两个容器:一个是tomcat,另一个是mysql。它们是链接的)

与此相关,我无法访问我的sql容器。这是从中国进口的

Tomcat容器是从官方的Tomcat:8.0图像创建的

这两个容器通过创建的桥接docker网络链接

这是一个web应用程序,提供登录+注册服务,检查用户在数据库中的状态

我得说在windows上一切都很好

这是我的hibernate.cfg文件:

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>

<!-- queste configurazioni sono per il testing in locale  -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:49162/AT_DB</property>

<property name="hibernate.connection.username">root</property>
<property name="connection.password">lxit</property>

<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

<property name="show_sql">false</property>
<!--<property name="hibernate.hbm2ddl.auto">create-drop</property>  se al posto di update metto create, mi cancella il db e lo rifa -->
<property name="hbm2ddl.auto">update</property>
        <!-- Entity -->

<mapping class="com.ATBoscoCastellano.Entity.ClientUser" />
<mapping class="com.ATBoscoCastellano.Entity.GenericUser" />
<mapping class="com.ATBoscoCastellano.SessionManagement.SessionToken" />
<mapping class="com.ATBoscoCastellano.Entity.Post" />
<!-- <mapping class="it.boscus.StarFoods.entity.ExampleEmbeddableIDClass2" /> -->


    </session-factory>
</hibernate-configuration>
但所有这些类都存在于opt/tomcat/webapps/AtApplicazione1/WEB-INF/classes/com/AtBoscoCastellano/some/path下

我不得不说,我没有从官方映像(tomcat:8.0)修改我的tomcat容器,所以我不知道它是否配置为hibernate

我的war结构如下:三个文件夹(META-INF、WEB-INF、模板)和一个文件(.DS_存储)。因为我的异常是:
java.lang.NoClassDefFoundError:无法初始化类com.atboscocastelano.Util.HibernateUtil.HibernateUtil
,在战争中,该类位于WEB-INF/classes/com/atboscocastelano/Util/HibernateUtil/。。。其中有HibernateUtil.class和.java

在tomcat容器上输入cmd java/javac-version时,其输出为:

root@a26ff8018f3f:/opt/tomcat# java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

root@a26ff8018f3f:/opt/tomcat# javac -version
javac "1.8.0_111"
[重新编辑]:在我的第一个请求中,catalina日志显示
java.net.ConnectException:连接被拒绝
;然后,从第二个请求开始,它总是对我说同样的错误

[编辑]现在我正在使用一个新的mysql容器,名为
mysql phpmyadmin
from image。我已经将tomcat容器链接到这个(新)容器,;如果我在hibernate.cfg.xml中指向
localhost:PORT\u MYSQL/AT\u DB
-->tomcat日志中的连接被拒绝。如果我指向mysql phpmyadmin:PORT/AT_DB,tomcat日志会显示:

17-Feb-2017 08:31:25.649 SEVERE [http-apr-8080-exec-2] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [com.ATBoscoCastellano.servlets.UserSessionServlet] in context with path [/AtApplicazione1] threw exception [Servlet execution threw an e
xception] with root cause
 java.sql.SQLException: null,  message from server: "Host '172.17.0.9' is not allowed to connect to this MySQL server"
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:959)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1038)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
2017年2月17日08:31:25.649严重[http-apr-8080-exec-2]org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service(),用于路径为[AtApplicazione1]的上下文中的Servlet[com.ATBoscoCastellano.servlets.UserSessionServlet]引发异常[Servlet执行引发了一个异常]
异常]具有根本原因
java.sql.SQLException:null,来自服务器的消息:“不允许主机'172.17.0.9'连接到此MySQL服务器”
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:959)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
位于com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1038)
位于com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254)
位于com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285)
位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084)
位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:795)
位于com.mysql.jdbc.JDBC4Connection(JDBC4Connection.java:44)

我必须告诉大家,在mysql容器中的配置文件中,有一个bind_地址0.0.0.0

我想我知道为什么会出现这个异常。您正在运行2个容器

  • 数据库mysql容器
  • Tomcat容器
  • 当然,您的异常是由于静态变量初始化异常引起的

    public static final SessionFactory sessionFactory = buildSessionFactory();
    
    而且,您的属性文件几乎没有问题

  • 连接。url
    应为
  • 您已经提到您的mysql主机名为localhost,但它正在另一个容器中运行。如果您已将mysql容器命名为“mysql”,则应将其更改为“mysql”


  • 我花了一段时间部署此应用程序。我已经解决了你在这个问题中提出的问题。主要问题是无法从tomcat容器访问mysql。此外,指定的端口也不正确。下面是hibernate.cfg.xml

    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
    
    <!-- queste configurazioni sono per il testing in locale  -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://mysql:3306/AT_DB</property>
    
    <property name="hibernate.connection.username">root</property>
    <property name="connection.password">lxit</property>
    
     ....rest of configuration....      
    
        </session-factory>
    </hibernate-configuration>
    

    和其余的网络命令

    您能在
    com.ATBoscoCastellano.Util.HibernateUtil.HibernateUtil
    中检查静态块中的未修补异常吗?这可能会导致NoClassDefFoundError@GauravJ在这里[这是HibernateUtil.java的主体。我不知道为什么在Tomcat+Mysql容器上它不起作用,在WIndows上,使用Xampp,一切都很好。我无法访问链接。可能是你的静态初始值设定项在这个新组合中失败了。请@GauravJ,现在试试。第一点,1)那么,为什么在WIndows上使用(仅)connection.url?对于第二个,2):我的sql容器正确地命名为“mysql”,但这两个容器没有链接,而是属于同一个网络;我使用cmd“docker network create--driver=bridge mynet”然后将这两个容器附加到mynet。您能先尝试将连接url从localhost更改为mysql吗?我已经在WEB-INF/classes/path中编辑了hibernate.cfg.xml文件;仍然存在相同的错误,但我没有重新启动我的tomcat容器…是吗?或者它无关紧要?您应该在重新启动;第一个块与第一个请求相关(单击登录按钮);以下块与以下请求相关。以下是链接:
    java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:214)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:298)
    
    docker exec tomcat ping mysql  
    
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
    
    <!-- queste configurazioni sono per il testing in locale  -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://mysql:3306/AT_DB</property>
    
    <property name="hibernate.connection.username">root</property>
    <property name="connection.password">lxit</property>
    
     ....rest of configuration....      
    
        </session-factory>
    </hibernate-configuration>
    
    17-Feb-2017 16:07:53.156 INFO [http-nio-8080-exec-1] org.hibernate.dialect.Dialect.<init> HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
    17-Feb-2017 16:07:53.776 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: ClientUser
    17-Feb-2017 16:07:53.777 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: ClientUser
    17-Feb-2017 16:07:53.818 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: Post
    17-Feb-2017 16:07:53.819 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: Post
    17-Feb-2017 16:07:53.828 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: SessionToken
    17-Feb-2017 16:07:53.828 INFO [http-nio-8080-exec-1] org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults HHH000262: Table not found: SessionToken
    17-Feb-2017 16:07:53.830 WARN [http-nio-8080-exec-1] org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl.handleException GenerationTarget encountered exception accepting command : Unable to execut
    
     sudo docker run -ti --rm -p 8888:8080 -p 8009:8009 -v $(pwd):/usr/local/tomcat/webapps/ --name tomcat tomcat:9-jre8 bash
    
     sudo docker run -d --name mysql -p 49162:3306 -p 49161:80 -p 49160:22 lxitgto/mysql-phpmyadmin:v1