将Spring Session JDBC与现有数据库一起使用(而非Spring Boot)

Use spring session JDBC with existing database (not springboot)

我的应用程序在没有Spring Boot的情况下与Spring Web MVC框架一起运行。 现在,我想使用spring session JDBC将会话存储到应用程序使用的数据库中。 我在网上找到的所有示例都使用Spring Boot,如果不使用Spring Boot,则它们使用的数据源配置为EmbeddedDatabase,如下所示:

1
2
3
4
5
6
    @Bean
    public EmbeddedDatabase dataSource() {
            return new EmbeddedDatabaseBuilder()
                            .setType(EmbeddedDatabaseType.H2)
                            .addScript("org/springframework/session/jdbc/schema-h2.sql").build();
    }

我有使用HikariCP的数据源配置,并且我希望Spring会话使用此数据源配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Bean
public DataSource dataSource() {
    HikariConfig config = new HikariConfig();
    config.setDriverClassName(env.getRequiredProperty("jdbc.driver"));
    config.setJdbcUrl(env.getRequiredProperty("jdbc.url"));
    config.setUsername(env.getRequiredProperty("jdbc.username"));
    config.setPassword(env.getRequiredProperty("jdbc.password"));
    config.setMinimumIdle(env.getRequiredProperty("jdbc.pool.minimumIdle", Integer.class));
    config.setMaximumPoolSize(env.getRequiredProperty("jdbc.pool.maximumPoolSize", Integer.class));
    config.addDataSourceProperty("cachePrepStmts", env.getRequiredProperty("jdbc.prop.cachePrepStmts"));
    config.addDataSourceProperty("prepStmtCacheSize", env.getRequiredProperty("jdbc.prop.prepStmtCacheSize"));
    config.addDataSourceProperty("prepStmtCacheSqlLimit", env.getRequiredProperty("jdbc.prop.prepStmtCacheSqlLimit"));
    HikariDataSource ds = new HikariDataSource(config);
    return ds;
}

如何使用当前配置与Spring Session集成?


据我了解spring-session javaconfig-jdbc示例/文档,您"只是"需要:

  • org.springframework.session.jdbc.config.annotation.web.http.EnableJdbcHttpSession注释"您的配置类"(YourConfig)。

  • 将您的DataSource命名为" dataSource"。 (完成!;)

  • 根据YourConfig中的DataSource提供一个PlatformTransactionManager bean。

  • (在servlet环境中-如您所愿)引入AbstractHttpSessionApplicationInitializer(在类路径中)引用YourConfig

    1
    2
    3
    4
    5
    6
    public class Initializer extends org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer { // <1>

      public Initializer() {
        super(YourConfig.class); // <2>
      }
    }
  • 如果您希望手动或使用外部工具安装数据库模式,则SQL脚本位于spring-session.jar(!org / springframework / session / jdbc / schema-@@ platform @@。sql)文件中,或者分别位于源代码存储库。

    这些(application。)属性允许进一步定制:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Session store type. [jdbc|redis|hazelcast|mongodb]
    spring.session.store-type=jdbc
    # Session timeout. If a duration suffix is not specified, seconds will be used.
    server.servlet.session.timeout=
    # Database schema initialization mode. [alwys | never | embedded]
    spring.session.jdbc.initialize-schema=always
    # Path to the SQL file to use to initialize the database schema.(see: https://github.com/spring-projects/spring-session/tree/master/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc)
    spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql
    # custom spring session table name (see : https://github.com/spring-projects/spring-session/issues/1230)
    spring.session.jdbc.table-name=SPRING_SESSION
    • 在jar /源代码分发中,您还将找到"清理"(-drop)脚本
    • 当前提供的平台是:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      db2
      derby
      h2
      hsqldb
      mysql
      oracle
      postgresql
      sqlite
      sqlserver
      sybase


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    @Autowired
        private Environment env;

    @Bean
        public PlatformTransactionManager transactionManager () {

            EntityManagerFactory factory = entityManagerFactory();
            return new JpaTransactionManager(factory);
        }


    @Bean
        public EntityManagerFactory entityManagerFactory () {
            HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            vendorAdapter.setShowSql(Boolean.TRUE);
            LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
            factory.setJpaVendorAdapter(vendorAdapter);
            factory.setPackagesToScan("com.your.domain.project");
            factory.setDataSource(dataSource());
            factory.setJpaProperties(additionalProperties()); // any addtional properties of your ORM
            factory.afterPropertiesSet();
            factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
            return factory.getObject();
        }


    @Bean
        public DataSource dataSource () {

            final com.mchange.v2.c3p0.ComboPooledDataSource comboDataSource = new ComboPooledDataSource();

            try {
                comboDataSource.setDriverClass(env.getProperty("jdbc.driver"));
                comboDataSource.setJdbcUrl(env.getProperty("jdbc.url"));
                comboDataSource.setUser(env.getProperty("jdbc.user"));
                comboDataSource.setPassword(env.getProperty("jdbc.properties"));

            } catch (PropertyVetoException e) {
                e.printStackTrace();
            }
            return comboDataSource;
        }

    这一定会对您有帮助。