Docker запускает только временный MySQL сервер - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь узнать, как подключить Spring App к MySQL, используя docker -compose.

У меня возникла следующая проблема:

spring-db | 2020-03-24 13:18:50+01:00 [Note] [Entrypoint]: Temporary server started.
spring-db | 2020-03-24T12:18:50.676560Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock'
spring-db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
spring-db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
spring-db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
spring-db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
spring-db | 2020-03-24 13:18:54+01:00 [Note] [Entrypoint]: Creating database spring-db
spring-db | 2020-03-24 13:18:54+01:00 [Note] [Entrypoint]: Creating user spring-db
spring-db | 2020-03-24 13:18:54+01:00 [Note] [Entrypoint]: Giving user spring-db access to schema spring-db
spring-db | 
spring-db | 2020-03-24 13:18:54+01:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/spring-db.sql
spring-db | 
spring-db | 
spring-db | 2020-03-24 13:18:55+01:00 [Note] [Entrypoint]: Stopping temporary server
spring-db | 2020-03-24T12:18:55.410358Z 15 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.19).
spring-db | 2020-03-24T12:18:57.128567Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19)  MySQL Community Server - GPL.
spring-db | 2020-03-24 13:18:57+01:00 [Note] [Entrypoint]: Temporary server stopped
spring-db | 
spring-db | 2020-03-24 13:18:57+01:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.

Поэтому я получил следующую ошибку :

spring-app | 2020-03-24 12:19:11.993 ERROR 1 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection] with root cause
spring-app | 
spring-app | java.net.ConnectException: Connection refused (Connection refused)

Кто-нибудь сталкивался с подобной проблемой?

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 27 марта 2020

Я обнаружил, что сделал много ошибок.

Во-первых, конфигурация

Configuration
@ComponentScan("SpringAndDocker")
@EnableJpaRepositories("SpringAndDocker.repository")
public class ApplicationConfig {

   @Value("${db.driver}")
   private String databaseDriver;

   @Value("${db.password}")
   private String databasePassword;

   @Value("${db.url}")
   private String databaseUrl;

   @Value("${db.username}")
   private String databaseUsername;

   @Value("${hibernate.dialect}")
   private String hibernateDialect;

   @Value("${hibernate.show_sql}")
   private String hibernateShowSql;

   private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";

   @Resource
   private Environment env;

   @Bean
   public DataSource dataSource() 
   {
       DriverManagerDataSource dataSource = new DriverManagerDataSource();
       dataSource.setDriverClassName(databaseDriver);
       dataSource.setUrl(databaseUrl);
       dataSource.setUsername(databaseUsername);
       dataSource.setPassword(databasePassword);

       return dataSource;
   }

   @Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactory() 
   {
       LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
       entityManagerFactoryBean.setDataSource(dataSource());
       entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
       entityManagerFactoryBean.setJpaProperties(hibProperties());

       return entityManagerFactoryBean;
   }

   private Properties hibProperties() 
   {
       Properties properties = new Properties();
       properties.put("hibernate.dialect",  hibernateDialect);
       properties.put("hibernate.show_sql", hibernateShowSql);

       return properties;
   }

   @Bean
   public JpaTransactionManager transactionManager() 
   {
       JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

       return transactionManager;
   }
}

Во-вторых docker -compose.yaml

db:
image: library/postgres:alpine
restart: always
hostname: spring-db
container_name: spring-db
volumes:
  - /etc/localtime:/etc/localtime:ro
  - ./docker/db/spring-db.sql:/docker-entrypoint-initdb.d/spring-db.sql:ro
  - ./docker/db/spring-db.sql:/opt/db/spring-db.sql
environment:
  - MYSQL_ROOT_PASSWORD=none
  - MYSQL_DATABASE=spring-db  
networks:
  - spring

Имя хоста выше - spring-db. Но согласно application.properties

# Database related properties
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:5432/spring-db
db.username=mysql
db.password=none
# Hibernate related properties
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql=false
entitymanager.packages.to.scan=pl.insudi.model

spring.main.allow-bean-definition-overriding=true

я пытался подключиться к localhost вместо spring-db.

Это было причиной - мне следовало использовать то же имя хоста, что и в docker -compose.

Также для правильного подключения Hibernate мне нужно было использовать

db.url=jdbc:mysql://insudi-db:3306/insudi-db?allowPublicKeyRetrieval=true&useSSL=false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...