Как установить jdb c ClientInfo в MySQL источник данных - PullRequest
3 голосов
/ 30 марта 2020

В Java с MySQL мы хотим добавить jdb c ClientInfo, чтобы определить источник каждого запроса. В настоящее время мы можем сделать что-то вроде:

    try(Connection connection = dataSource.getConnection()){
        connection.setClientInfo("ApplicationName", "MyApp");
    }

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

До сих пор у меня работает расширение DataSource с помощью пользовательского переопределенного метода getConnection, который вызывает setClientInfo. Это не только грязный обходной путь, но и спецификация источника данных c.

Я видел, что драйвер mysql имеет ClientInfoProviders , как по умолчанию com. mysql .cj.jdb c .CommentClientInfoProvider . Пользовательский ClientInfoProvider может быть настроен следующим образом:

    Properties properties = new Properties();
    properties.setProperty(PropertyKey.clientInfoProvider.getKeyName(), "foo.bar.CustomClientInfoProvider");
    properties.setProperty(APPLICATION_NAME, "MyApp");

    HikariConfig dataSourceConfig = new HikariConfig();
    dataSourceConfig.setDataSourceProperties(properties);
    ...

Но он вызывается только в том случае, если кто-то вызывает getClientInfo в соединении в любом случае.

Итак, я хотел бы знать:

  • Есть ли поддержка в драйвере MySql для установки clientInfo в DataSource просто путем установки свойств?
  • Если есть выход. Как это можно сделать?

1 Ответ

4 голосов
/ 03 апреля 2020

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

...