【问题标题】:Spring Session with JDBC - How to Use a Separate DB as a Session StoreSpring Session with JDBC - 如何使用单独的数据库作为会话存储
【发布时间】:2019-05-30 12:57:34
【问题描述】:

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

我已经引用了这个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 存储中创建我的所有实体表。

我的主数据源 (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

感谢您的指导。

【问题讨论】:

    标签: java spring-boot spring-session


    【解决方案1】:

    从 Spring Boot 2.0.0 开始,您可以使用注解 @SpringSessionDataSource 指定 Spring Session 应使用的 DataSource

    要注入的 DataSource 的限定符注释 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 数据库进行会话管理,您可以从您的 application.properties 中删除 session.datasource... 并按如下方式配置您的数据源。

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

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 2018-01-27
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2020-11-25
      • 2014-06-24
      • 1970-01-01
      • 2014-09-28
      相关资源
      最近更新 更多