Spring Session с JDBC - Как использовать отдельную БД в качестве хранилища сессий - PullRequest
0 голосов
/ 04 января 2019

Я работаю над приложением, которое использует Spring Session JDBC.Я также использую Spring JPA для других организаций.Мой вопрос заключается в следующем: как настроить приложение Spring Boot, чтобы разрешить использование отдельной базы данных для хранения сеансов?

Я ссылался на этот вопрос , но, похоже, конструктор JdbcHttpSessionConfiguration отметилв ответе больше не действует (я использую Spring Boot 2.1.1).Кроме этого, я не смог найти никакой документации по этому вопросу.Я нашел информацию о том, как настроить Spring Session с поддержкой JDBC и как использовать несколько источников данных в Spring, но не о том, как их объединить.Я считаю, что это может включать расширение JdbcHttpSessionConfiguration, но, к сожалению, я не могу понять, как это сделать правильно.

Это все, что у меня есть до сих пор:

    @Configuration
class SessionConfig extends JdbcHttpSessionConfiguration {

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
    }

}

Однаковышеописанное также пытается создать все мои таблицы сущностей в хранилище H2.

Мой основной источник данных (PostgreSQL) указан в моем application.properties.

spring.session.store-type=jdbc
spring.datasource.url=jdbc:postgresql://localhost/auth
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driverClassName=org.postgresql.Driver
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

Спасибо за любые рекомендации.

1 Ответ

0 голосов
/ 04 января 2019

Начиная с Spring Boot 2.0.0, вы можете указать DataSource, который Spring Session должен использовать, используя аннотацию @SpringSessionDataSource.

Примечание к квалификатору для источника данных, который будет вставлен в JdbcOperationsSessionRepository.

Метод внутри класса Spring JdbcHttpSessionConfiguration, который устанавливает требуемый источник данных.

@Autowired
public void setDataSource(@SpringSessionDataSource ObjectProvider<DataSource> springSessionDataSource, ObjectProvider<DataSource> dataSource)

Для достижения желаемого результата необходимо настроить вторичный источник данных для использования в Spring Session и аннотироватьбоб с @SpringSessionDataSource.Ниже приведена конфигурация, которая работала для меня.

application.properties

session.datasource.url=jdbc:postgresql://localhost:5432/session
session.datasource.driverClassName=org.postgresql.Driver
session.datasource.username=postgres
session.datasource.password=thepassword

primary.datasource.url=jdbc:postgresql://localhost:5432/postgres
primary.datasource.driverClassName=org.postgresql.Driver
primary.datasource.username=postgres
primary.datasource.password=thepassword

Конфигурация базы данных

@Configuration
@EnableTransactionManagement
public class DatabaseConfig {

    @Bean
    @Primary
    @ConfigurationProperties("primary.datasource")
    public DataSourceProperties primaryDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    public DataSource primaryDataSource() {
        return primaryDataSourceProperties().initializeDataSourceBuilder()
                .type(HikariDataSource.class).build();
    }

    @Bean
    @ConfigurationProperties("session.datasource")
    public DataSourceProperties sessionDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @SpringSessionDataSource
    public DataSource springSessionDataSource() {
        return sessionDataSourceProperties().initializeDataSourceBuilder()
                .type(HikariDataSource.class).build();
    }
}

Не забудьте запустить файл схемы org/springframework/session/jdbc/schema-thedbplatform.sql на вашемдБ, если вы не используете встроенную базу данных.В моем случае я запустил org/springframework/session/jdbc/schema-postgresql.sql.

Если вы хотите использовать базу данных H2 для управления сессиями, вы можете удалить session.datasource... из вашего application.properties и настроить источники данных следующим образом.

@Configuration
@EnableTransactionManagement
public class DatabaseConfig {

    @Bean
    @Primary
    @ConfigurationProperties("primary.datasource")
    public DataSourceProperties primaryDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    public DataSource primaryDataSource() {
        return primaryDataSourceProperties().initializeDataSourceBuilder()
                .type(HikariDataSource.class).build();
    }

    @Bean
    @SpringSessionDataSource
    public EmbeddedDatabase springSessionDataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript("org/springframework/session/jdbc/schema-h2.sql").build();
    }
}
...