簡體   English   中英

使用JDBC的Spring會話 - 如何將單獨的數據庫用作會話存儲

[英]Spring Session with JDBC - How to Use a Separate DB as a Session Store

我正在使用一個使用Spring Session JDBC的應用程序。 我也將Spring JPA用於其他實體。 我的問題是,如何配置Spring Boot應用程序以允許將單獨的數據庫用於會話存儲?

我已經引用了這個問題 ,但似乎答案中提到的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

謝謝你的指導。

從Spring Boot 2.0.0開始,您可以使用注釋@SpringSessionDataSource指定Spring Session應該使用的DataSource

要在JdbcOperationsSessionRepository中注入的DataSource的限定符注釋。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM