Spring 与 JDBC 的会话 - 如何使用单独的数据库作为会话存储
Spring Session with JDBC - How to Use a Separate DB as a Session Store
我正在开发一个使用 Spring 会话 JDBC 的应用程序。我还为其他实体使用 Spring JPA。我的问题是,如何配置 Spring 引导应用程序以允许单独的数据库用于会话存储?
我已经引用了这个 question,但答案中提到的 JdbcHttpSessionConfiguration 构造函数似乎不再有效(我使用的是 Spring Boot 2.1.1)。除此之外,我无法找到有关该主题的任何文档。我找到了有关如何使用 JDBC 支持配置 Spring 会话以及如何在 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 会话应使用的 DataSource
Qualifier annotation for a DataSource to be injected in
JdbcOperationsSessionRepository.
Spring JdbcHttpSessionConfiguration
class 中设置所需数据源的方法。
@Autowired
public void setDataSource(@SpringSessionDataSource ObjectProvider<DataSource> springSessionDataSource, ObjectProvider<DataSource> dataSource)
为了达到预期的结果,必须配置一个辅助数据源以供在 Spring 会话中使用,并使用 @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();
}
}
我正在开发一个使用 Spring 会话 JDBC 的应用程序。我还为其他实体使用 Spring JPA。我的问题是,如何配置 Spring 引导应用程序以允许单独的数据库用于会话存储?
我已经引用了这个 question,但答案中提到的 JdbcHttpSessionConfiguration 构造函数似乎不再有效(我使用的是 Spring Boot 2.1.1)。除此之外,我无法找到有关该主题的任何文档。我找到了有关如何使用 JDBC 支持配置 Spring 会话以及如何在 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
.
DataSource
Qualifier annotation for a DataSource to be injected in JdbcOperationsSessionRepository.
Spring JdbcHttpSessionConfiguration
class 中设置所需数据源的方法。
@Autowired
public void setDataSource(@SpringSessionDataSource ObjectProvider<DataSource> springSessionDataSource, ObjectProvider<DataSource> dataSource)
为了达到预期的结果,必须配置一个辅助数据源以供在 Spring 会话中使用,并使用 @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();
}
}