Использовать весенний сеанс JDBC с существующей базой данных (не Springboot)

У меня есть приложение, работающее с фреймворком Spring Web MVC без загрузки Spring. Теперь я хочу использовать JDBC весеннего сеанса для сохранения сеанса в базе данных, используемой приложением. Все примеры, которые я нашел в Интернете, используют весеннюю загрузку, и если не использовать весеннюю загрузку, они используют конфигурацию источника данных EmbeddedDatabase следующим образом:

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

У меня есть конфигурация источника данных с использованием HikariCP, и я хочу, чтобы весенний сеанс использовал эту конфигурацию источника данных.

@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;
}

Как я могу использовать мою текущую конфигурацию для интеграции с весенней сессией?


person Muhammad Kholid B    schedule 01.02.2019    source источник


Ответы (2)


Насколько я понимаю, пример весенней сессии javaconfig-jdbc / doc, вам" просто "необходимо:

  1. Добавьте аннотацию к "вашему классу конфигурации" (YourConfig) с помощью org.springframework.session.jdbc.config.annotation.web.http.EnableJdbcHttpSession.

  2. Назовите свой DataSource "источник данных". (сделано!;)

  3. Предоставьте компонент PlatformTransactionManager на основе dataSource в YourConfig.

  4. (в среде сервлетов - как у вас) Введите AbstractHttpSessionApplicationInitializer (в пути к классам), ссылаясь на YourConfig:

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

Если вы хотите установить схему базы данных вручную или с помощью внешнего инструмента, сценарии SQL находятся в файле spring -ession.jar (! Org /springframework/session/jdbc/schema-@@platform@@.sql) или соответственно в репозитории исходного кода.


Эти (application.) Свойства допускают дальнейшую настройку:

# 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 вы также найдете скрипты "очистки" (-drop)
  • и в настоящее время предоставленные платформы:

    db2
    derby
    h2
    hsqldb
    mysql
    oracle
    postgresql
    sqlite
    sqlserver
    sybase
    
person xerx593    schedule 01.02.2019
comment
да, я пропустил эту часть Initializer. Но он не создал таблицу SPRING_SESSION с моей текущей конфигурацией. Как выполнить SQL, предоставленный весенней сессией? - person Muhammad Kholid B; 02.02.2019
comment
см. редактировать (5. + 6.)! Я думаю, особенно. важно 5. и (если вы хотите, чтобы схема сеанса была инициализирована при весенней загрузке): spring.session.jdbc.initialize-schema=always и spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql (где @@ platform @@ относится к поставщику / типу вашей базы данных). - person xerx593; 02.02.2019
comment
пункты 5 и 6 относятся к весенней загрузке, поэтому я не использую эту конфигурацию. Итак, я запускаю сценарий для создания таблиц весенних сеансов с помощью Liquibase. - person Muhammad Kholid B; 02.02.2019
comment
да, это альтернатива, @MuhammadKholidB, вы можете найти файлы sql в банке (spring-session) соответственно в github - person xerx593; 02.02.2019
comment
... но 5. все еще может понадобиться .... и установите initialize-schema=never (для Liquibase) - person xerx593; 02.02.2019
comment
Я не думаю, что мне нужно добавлять настройки в свой application.properties, потому что это не проект весенней загрузки. Ничто не прочитает эти настройки, если я все равно добавлю их. - person Muhammad Kholid B; 02.02.2019
comment
Можете ли вы обновить свой ответ, чтобы я мог отметить его как принятый? Требуется обновление о том, как создавать таблицы, необходимые для весенних сессий, что является моим основным вопросом здесь. - person Muhammad Kholid B; 02.02.2019
comment
avec plaisir! :) - person xerx593; 02.02.2019
comment
Эта ссылка github.com/spring-projects/spring -session / blob / master / samples / мертв. есть ли еще ссылка на пример фрагмента? - person Sulthan; 28.02.2020
comment
Привет, @Sulthan. Это текущая ссылка на spring-session-javaconfig-jdbc-sample: github.com/spring-projects/spring-session/tree/master/ ... я также обновился в сообщении;) - person xerx593; 28.02.2020
comment
Спасибо @ xerx593. Но в ссылке есть пример со встроенной (H2) базой данных. Есть ли какой-нибудь пример с MySQL или любой другой базой данных? - person Sulthan; 29.02.2020
comment
Единственное (2-3), что вам нужно сделать, чтобы переключить этот пример с h2 на mysql: 1. изменить зависимость h2 на (соответствующую) mysql в .gradle файле. 2. В Configclass замените определение dataSource желаемым. 3. Удалить класс H2ConsoleInitializer. (учтите, что это конкретный пример весенней сессии (см. родственные проекты)). Руководство по весенней загрузке для MySQL можно найти здесь, это может помочь вам перейти к шагу 2. - person xerx593; 29.02.2020

@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;
    }


Это вам определенно поможет.

person Muhammad Waqas    schedule 01.02.2019
comment
Где вы используете весеннюю сессию в этой конфигурации? - person Muhammad Kholid B; 02.02.2019