Spring Boot DataSourceBuilder с HikariDataSource выдает ошибку

Я пытаюсь изучить различные способы создания источника данных. В этом примере https://github.com/ivoronline/springboot_db_datasource_create_DataSourceBuilder Я использовал DriverManagerDataSource.class для успешного создания источника данных, как показано ниже.

application.properties

# ORACLE DB
my.spring.datasource.url      = jdbc:oracle:thin:@localhost:1522/orcl
my.spring.datasource.username = TEST
my.spring.datasource.password = LETMEIN

Моя база данныхконфиг

@Configuration
public class MyDatabaseConfig {

  //=========================================================================================================
  // DATA SOURCE
  //=========================================================================================================
  @Bean
  @ConfigurationProperties("my.spring.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().type(DriverManagerDataSource.class).build();
  }

}

Но когда я пытаюсь заменить DriverManagerDataSource.class на HikariDataSource.class, я получаю ошибку. Я в замешательстве, потому что в другом https://github.com/ivoronline/springboot_db_datasource_SaveSameEntityToDifferetnSchema более сложном проекте это работало.

Ошибка

Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) 

Также правильно ли я понял, что DriverManagerDataSource не использует пул соединений и что Spring Boot по умолчанию использует HikariDataSource с пулом соединений за ним? Таким образом, этот подход будет вручную делать то, что Spring Boot делает автоматически?

И ошибка, которую вы получаете?

M. Deinum 08.08.2024 08:07

Невозможно определить диалект без метаданных JDBC (пожалуйста, установите «jakarta.persistence.jdbc.url» для распространенных случаев или «hibernate.dialect», если необходимо предоставить собственную реализацию диалекта). Я думаю, что это больше похоже на общую ошибку, когда источник данных не был создан.

ivoronline 08.08.2024 11:13

Пожалуйста, добавьте это в свой вопрос вместо комментариев.

M. Deinum 08.08.2024 11:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы правы, Spring Boot сначала автоматически выберет HikariDataSource (https://docs.spring.io/spring-boot/reference/data/sql.html#data.sql.datasource.connection-pool), но он должен быть зависимостью вашего проекта. Обычно вы можете автоматически подключить Хикари, включив зависимость spring-boot-starter-jdbc. При этом вы можете изменить свой код следующим образом:

  @Bean
  @ConfigurationProperties("my.spring.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }

Предоставленные вами ссылки мне не помогли, поэтому я не могу просмотреть ваш конкретный проект, но я предполагаю, что вам не хватает зависимости.

Спасибо, что сообщили мне, что мои репозитории являются частными. Я исправил это сейчас. Эта линия не сработала. Я получаю ту же ошибку. У меня был «spring-boot-starter-data-jpa». Это не работает, даже когда я добавляю «spring-boot-starter-jdbc».

ivoronline 08.08.2024 11:15
Ответ принят как подходящий

Способ создания источника данных немного неправильный. Сначала вам следует создать bean-компонент для типа DataSourceProperties и использовать его для привязки свойств для my.spring.datasource.

Затем используйте этот компонент для создания DataSource.

@Bean
@ConfigurationProperties("my.spring.datasource")
public DataSourceProperties myDataSourceProperties() {
  return new DataSourceProperties();
}

@Bean
@ConfigurationProperties("my.spring.datasource.hikari")
public DataSource myDataSource(DataSourceProperties myDataSourceProperties) {
  return myDataSourceProperties.initializeDataSourceBuilder().build();
}

В чем разница, наверное, спросите вы.

Ваше решение свяжет свойства с результирующим DataSource, что довольно зависит от поставщика в отношении того, как создавать свойства. В то время как это решение использует более распространенные имена и имеет некоторую логику для адаптации к хорошо известному решению пула соединений (например, Hikari, Tomcat, Commons DBCP и т. д.). Затем конкретный my.spring.datasource.hikari привязывается к результирующему источнику данных и содержит свойства, специфичные для поставщика.

Хорошо, если я просто использую my.spring.datasource.url внутри application.properties и разрешаю Spring Boot все делать самостоятельно, это будет работать, и будет использоваться HikariCP. И если я использую DataSourceProperties, это тоже будет работать. Потому что в этих двух апрачах происходит какая-то дополнительная магия, которая сопоставляет URL-адрес с реальным jdbc-ur. Потому что эти два подхода не настолько специфичны для реализации.

ivoronline 08.08.2024 13:02

Другие вопросы по теме