@Vadimayer

В Windows tomcat подключается к MySQL без проблем. Когда переношу проект на удаленный сервер, под управлением Ubuntu — не работает, почему?

Мучаюсь уже две недели...
На ноутбуке все работает локально - проект запускается. Как только создаю .war для tomcat, чтобы развернуть его на удаленном сервере, на сервере получаю исключение.

localhost.2024-02-11.log
11-Feb-2024 12:53:49.771 SEVERE [main] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
            org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jdbc.datasource.init.DataSourceInitializer#0': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.UncategorizedScriptException: Failed to execute database script; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.


catalina.2024-02-11.log
11-Feb-2024 12:53:27.715 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    11-Feb-2024 12:53:38.232 SEVERE [main] org.apache.tomcat.jdbc.pool.ConnectionPool.init Unable to create initial connections of pool.
            java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.


На удаленном сервере:
1. ubuntu 20.04 LTS, была установлена 22.04, все та же ошибка.
2. установлен openjdk-17.0.9 (так как делал на ноутбуке). Протестировал его отдельно, чтобы запустить .jar на spring-boot, все запускается на удаленном сервере.
3. Установил mysql 8.0.36, до этого была 5.7.42, разницы нет, все равно не работает. Сама база работает. Могу добавлять пользователей, создавать таблицы и так далее, но не могу подружиться с tomcat.
4. Установил mysql-connector-java_8.0.31 отдельно, он добавлен в зависимостях pom.xml (сначала пробовал без него, думал, что он автоматически подтягивается через pom.xml зависимости, но с ним тоже не работает)
5. Установлен Tomcat 9.0.59 (так делал на ноутбуке). Контейнер сервлета запускается, работает, но не подключается к mysql.

pom.xml
<dependencies>
    		<!--DataBase-->
    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    			<version>8.0.31</version>
    		</dependency>
    		<dependency>
    			<groupId>org.hibernate.validator</groupId>
    			<artifactId>hibernate-validator</artifactId>
    			<version>${hibernate-validator.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.hibernate</groupId>
    			<artifactId>hibernate-core</artifactId>
    			<version>${hibernate.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.glassfish</groupId>
    			<artifactId>javax.el</artifactId>
    			<version>${javax-el.version}</version>
    			<scope>provided</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.tomcat</groupId>
    			<artifactId>tomcat-jdbc</artifactId>
    			<version>${tomcat.version}</version>
    			<scope>provided</scope>
    		</dependency>
    		<!--Web-->
    		<dependency>
    			<groupId>org.apache.tomcat</groupId>
    			<artifactId>tomcat-servlet-api</artifactId>
    			<version>${tomcat.version}</version>
    			<scope>provided</scope>
    		</dependency>
    		<dependency>
    			<groupId>javax.servlet</groupId>
    			<artifactId>jstl</artifactId>
    			<version>${jstl.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-webmvc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>javax.annotation</groupId>
    			<artifactId>javax.annotation-api</artifactId>
    			<version>1.3.2</version>
    		</dependency>
    		<!-- Spring -->
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context-support</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.data</groupId>
    			<artifactId>spring-data-jpa</artifactId>
    			<version>${spring-data-jpa.version}</version>
    		</dependency>
    </project>


application.properties
database.url=jdbc:mysql://localhost:3306/topdom?autoReconnect=true&serverTimezone=Europe/Moscow
    database.username=root
    database.password=root
    
    spring.jpa.hibernate.ddl-auto=create
    #spring.jpa.show-sql: false
    
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    database.init=true
    jpa.showSql=true
    jdbc.initLocation=classpath:db/initDB.sql
    hibernate.format_sql=true
    hibernate.use_sql_comments=true


tomcat.properties
database.init=false
    jdbc.initLocation=initDB.sql
    jpa.showSql=true
    hibernate.format_sql=true
    hibernate.use_sql_comments=true


context.xml
<Context>
    
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    
        <Resource name="jdbc/application"
                  auth="Container"
                  type="javax.sql.DataSource"
                  url="jdbc:mysql://localhost:3306/topdom"
                  username="root"
                  password="root"
                  driverClassName="com.mysql.jdbc.Driver"
                  validationQuery="SELECT 1"
                  maxTotal="10"
                  minIdle="2"
                  maxWaitMillis="20000"
                  initialSize="2"
                  maxIdle="5"
                  testOnBorrow="true"
                  removeAbandonedOnBorrow="true"
                  testWhileIdle="true"/>
    </Context>


spring-db.xml
<jdbc:initialize-database data-source="dataSource" enabled="${database.init}">
            <jdbc:script encoding="utf-8" location="${jdbc.initLocation}"/>
            <jdbc:script encoding="utf-8" location="classpath:db/populateDB.sql"/>
        </jdbc:initialize-database>
    
        <tx:annotation-driven/>

        <beans>
            <context:property-placeholder location="classpath:db/application.properties" system-properties-mode="OVERRIDE"/>
            <bean id="dataSource"
                  class="org.apache.tomcat.jdbc.pool.DataSource"
                  p:driverClassName="${spring.datasource.driver-class-name}"
                  p:url="${database.url}"
                  p:username="${database.username}"
                  p:password="${database.password}"/>
        </beans>
    
        <beans profile="tomcat">
            <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/application"/>
            <context:property-placeholder location="classpath:db/tomcat.properties" system-properties-mode="OVERRIDE"/>
        </beans>
    
        <!-- EntityManagerFactory -->
        <beans>
            <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
                  p:dataSource-ref="dataSource"
                  p:packagesToScan="com.example.**.model">
    
                <property name="jpaPropertyMap">
                    <map>
                        <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
                        <entry key="#{T(org.hibernate.cfg.AvailableSettings).FORMAT_SQL}" value="${hibernate.format_sql}"/>
                        <entry key="#{T(org.hibernate.cfg.AvailableSettings).USE_SQL_COMMENTS}" value="${hibernate.use_sql_comments}"/>
                        <entry key="#{T(org.hibernate.cfg.AvailableSettings).JPA_PROXY_COMPLIANCE}" value="false"/>
                    </map>
                </property>

                <property name="jpaVendorAdapter">
                    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" p:showSql="${jpa.showSql}"/>
                </property>
            </bean>

            <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
                  p:entityManagerFactory-ref="entityManagerFactory"/>
        </beans>

        <beans>
            <context:component-scan base-package="com.example.**.repository.datajpa"/>
            <jpa:repositories base-package="com.example.**.repository.datajpa"/>
        </beans>
    </beans>
  • Вопрос задан
  • 327 просмотров
Решения вопроса 1
@Vadimayer Автор вопроса
Решений в итоге было несколько они все в комментариях.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ky0
@ky0
Миллиардер, филантроп, патологический лгун
"База работает" - это значит, что вы на Убунте можете сделать mysql -h 127.0.0.1 -u root -p - и вас пустит в консоль с паролем root?

Вообще, так как вы, уже не делают. "Локально работает" сто лет как означает, что разработчик запускает тот же самый docker-compose.yaml на своём компе - вот тогда имеет смысл говорить о работоспособности. А когда разные ОС, разные версии библиотек и так далее - это баловство. Причина может быть в ста местах.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы