Spring Boot: установка параметра времени выполнения PostgreSQL при открытом соединении с базой данных - PullRequest
0 голосов
/ 11 октября 2018

Я ищу правильный способ установить параметр времени выполнения , когда соединение с базой данных открыто.Мой параметр времени выполнения на самом деле является часовым поясом, но я думаю, что это должно работать для произвольного параметра.

Я нашел следующие решения, но я чувствую, что ни одно из них не является правильным .

  1. JdbcInterceptor

    Поскольку Spring Boot по умолчанию имеет пул соединений Apache Tomcat, я могу использовать org.apache.tomcat.jdbc.pool.JdbcInterceptorдля перехвата соединений.

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

  2. свойство initSQL

    Apache's pooledсоединение имеет встроенную возможность инициализировать себя оператором, предоставленным параметром PoolProperties.initSQL.Это выполняется методом ConnectionPool.createConnection(...).

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

    Я имею в видуЯ все еще могу использовать построитель источника данных, как в примере ниже, и затем взломать свойство в пул соединений, но это не очень хорошее решение.

    // Thank's to property binders used while creating custom datasource,
    // the datasource.initSQL parameter will be passed to an underlying connection pool.
    @Bean
    @ConfigurationProperties(prefix = "datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
    

    Обновление

    Iтестировал это в приложении Spring Boot 1.x.Вышеприведенные операторы больше не действительны для приложений Spring Boot 2, поскольку:

    1. Источник данных Tomcat по умолчанию заменен на Hikari, который поддерживает свойство spring.datasource.hikari.connection-init-sql.Документация гласит: Получите строку SQL, которая будет выполняться на всех новых соединениях при их создании, прежде чем они будут добавлены в пул.

    2. Кажется, что подобноесвойство источника данных Tomcat было повторно введено как spring.datasource.tomcat.init-s-q-l.

  3. ConnectionPreparer & AOP

    Это не является действительным решением,Это больше похоже на вдохновение.Средство подготовки соединений было механизмом, используемым для инициализации соединений Oracle в проекте Spring Data JDBC Extensions .Эта вещь имеет своих собственных проблем и больше не поддерживается, но, возможно, может быть использована в качестве основы для аналогичного решения.

1 Ответ

0 голосов
/ 11 октября 2018

Если ваш параметр на самом деле является часовым поясом, почему бы вам не найти способ установить это свойство.

Например, если вы хотите сохранить или прочитать DateTime спредопределенная временная метка правильный способ сделать это состоит в том, чтобы установить свойство hibernate.jdbc.time_zone в спящем режиме entityManager или spring.jpa.properties.hibernate.jdbc.time_zone в application.properties

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...