[英]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.