带有JDBC的Spring会话-如何将单独的数据库用作会话存储

时间:2019-01-03 22:32:22

标签: java spring-boot spring-session

我正在开发一个使用Spring Session JDBC的应用程序。我还将Spring JPA用于其他实体。我的问题是,如何配置Spring Boot应用程序以允许将单独的数据库用于会话存储?

我已经引用了这个question,但是答案中提到的JdbcHttpSessionConfiguration构造函数似乎不再有效(我正在使用Spring Boot 2.1.1)。除此之外,我找不到有关该主题的任何文档。我找到了有关如何使用JDBC支持配置Spring Session的信息,以及如何在Spring中使用多个数据源的信息,但没有找到如何结合两者的信息。我认为这可能涉及扩展JdbcHttpSessionConfiguration,但不幸的是,我无法弄清楚如何正确进行扩展。

这是我到目前为止所拥有的:

    @Configuration
class SessionConfig extends JdbcHttpSessionConfiguration {

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

}

但是,以上方法也尝试在H2商店中创建我的所有实体表。

我的application.properties中指定了我的主要数据源(PostgreSQL)。

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 :(得分:2)

从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注释bean。以下是对我有用的配置。

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();
    }
}