当前位置: 首页 > 知识库问答 >
问题:

对现有数据库使用spring会话JDBC(非springboot)

段弘和
2023-03-14

我的应用程序使用SpringWebMVC框架运行,没有Spring Boot。现在,我想使用spring会话JDBC将会话存储到应用程序使用的数据库中。我在网上找到的所有示例都使用spring boot,如果没有使用spring boot,那么他们使用的数据源配置是嵌入式数据库,如下所示:

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

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

@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会话集成?

共有2个答案

洪成济
2023-03-14
@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;
    }


这肯定会对你有所帮助。

柴赞
2023-03-14

正如我所理解的Spring-会话javaconfig-jdbc示例/doc,您“只”需要:

>

  • 注释"your config class"(YourConfig),org.springframework.session.jdbc.config.annotation.web.http.EnableJdbcHttpSession

    将您的数据源命名为“数据源”。(完成!;)

    基于您的配置中的数据源,提供一个PlatformTransactionManager bean。

    (在servlet环境中-就像您的环境一样)引入一个抽象HttpSessionApplicationInitializer(在类路径中)引用您的配置:

    public class Initializer extends org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer { // <1>
    
      public Initializer() {
        super(YourConfig.class); // <2>
      }
    }
    

    如果您希望手动或使用外部工具安装db模式,SQL脚本位于spring-session.jar(! org/springFramework/text/jdbc/Schema-@@Platform@@. sql)文件中或分别位于源代码存储库中。

    这些(应用程序。)属性允许进一步自定义:

    # 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/source分布中,还可以找到“cleanup”(-drop)脚本
  • 目前提供的平台有:

    db2
    derby
    h2
    hsqldb
    mysql
    oracle
    postgresql
    sqlite
    sqlserver
    sybase
    

  •  类似资料:
    • 我需要在代码中实现JDBC会话。为此,我按照https://www.baeldung.com/spring-session-jdbc. 我导入了maven依赖项并添加了spring。一场应用程序中的存储类型=jdbc。属性文件。然后我运行程序,它抛出了一系列错误。我不能确切地理解它在尖叫什么。如果有人能帮助我,我真的很感激。 这是我得到的错误:

    • 为了将会话保存在数据库中,我在这里使用这个示例实现了Spring会话JDBC。我在使用@Autow的会话范围时遇到问题:我JavaClass如下: 然后我在会话\u范围内注册这个bean,如下所示: 在控制器中,我正在对其进行布线并尝试使用: 当我尝试运行时,出现以下错误:

    • 我使用的是Spring会话JDBC,并注意到当用户进行身份验证后数据库关闭时,下一个请求将导致嵌入的Tomcat白色错误页(500)。Spring Boot允许我们使用@ControllerAdvice或ErrorController自定义错误页面。我无法使用这些机制,因为我认为异常发生在请求处理周期的早期。我在控制器通知和ErrorController中都设置了断点,没有中断发生。 堆栈跟踪显示

    • 问题内容: 我有一个spring / jdbc / oracle 10g应用程序。Oracle服务器数据库时区设置为GMT + 2 JVM时区设置为GMT + 2(即使对于我而言这无关紧要)。 我有一个执行某些日期操作的存储过程。问题是,即使我未在代码/配置中明确设置会话时区,会话时区也不同于数据库时区(GMT)。 据我所知,会话时区默认情况下等于数据库时区。知道为什么会话时区与数据库时区不同,或

    • 当您使用spring-sesion-jdbc时,会话在DB中以字节的形式序列化,这意味着每次将Spring升级到具有不兼容的Session.serialVersionUUID的版本时,您都必须删除所有会话。 我想用JSON格式存储会话,但在谷歌上搜索了一下之后,似乎没有人这样做过。 当您认为使用JSON在Redis中存储会话是常见的做法时,这很奇怪。 为什么没有一种标准的方法以JSON格式在JDB

    • 我使用Spring Boot和Spring会话来控制一个使用ReactJS作为前端的应用程序。我的问题很简单,我尝试了几种方法来处理,但都没有成功。 React部分使用AJAX在登录后调用Spring REST服务(我也使用Spring Security),这至少需要30分钟。之后,会话停止,所有调用都会收到一个302,并以登录页面作为响应。这是意料之中的。 但我的问题是:有什么更好的方法来延长后