Cordapp - класс пула подключений Hikari не найден для MySql ConnectionPoolDataSource

Я строю рабочий процесс для Corda. Я хочу использовать библиотеку пула соединений Hikari для подключения к базе данных MySql. Я НЕ пытаюсь заменить базу данных реестра H2. Эта база данных предназначена для хранения / извлечения некоторой информации, которая не нужна в реестре. Я могу подключиться к MySql БЕЗ Hikari. Однако когда я использую Hikari, я получаю сообщение об ошибке. java.lang.ClassNotFoundException: com.mysql.cj.jdbc.MysqlConnectionPoolDataSource

Я протестировал код Hikari как отдельный файл jar. Работает нормально. Это комбинация способа, которым Corda загружает и запускает файлы jar внутри каталога cordapps, что вызывает проблему. Поскольку класс является частью jar. Кажется, это немного не так

Я добавил зависимость MySql в соответствии с тем, что указано в https://docs.corda.net/cordapp-build-systems.html#setting-your-dependencies Я также могу подключиться к базе данных MySql, если я не использую Hikari.

Я исследовал банку cordapp. И я мог видеть, что необходимая банка присутствует внутри банки cordapp.

Зависимости Gradle для CordApp

dependencies {
    testCompile "junit:junit:$junit_version"

    // Corda dependencies.
    cordaCompile "$corda_release_group:corda-core:$corda_release_version"
    cordaRuntime "$corda_release_group:corda:$corda_release_version"

    testCompile "$corda_release_group:corda-node-driver:$corda_release_version"
    runtime "mysql:mysql-connector-java:8.0.11"

    cordaCompile "com.zaxxer:HikariCP:2.5.1"

    // CorDapp dependencies.
    cordapp project(":contracts")
}

Образец кода

public class DataSource {
    private static final Logger logger = LoggerFactory.getLogger(DataSource.class);
    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;

    static {
        try {
            logger.info("Connecting with connection pool datasource");
            config.setDataSourceClassName("com.mysql.cj.jdbc.MysqlConnectionPoolDataSource");
            config.addDataSourceProperty("useSSL", "false");
            config.addDataSourceProperty("user", "username");
            config.addDataSourceProperty("password", "password");
            config.addDataSourceProperty("serverName", "localhost");
            config.addDataSourceProperty("useSSL", "false");
            config.addDataSourceProperty("port",Integer.parseInt("3306"));
            config.addDataSourceProperty("cachePrepStmts", "true");
            config.addDataSourceProperty("prepStmtCacheSize", "250");
            config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
            config.addDataSourceProperty("requireSSL", "false");
            config.addDataSourceProperty("serverTimezone", "UTC");
            config.addDataSourceProperty("useServerPrepStmts", "true");
            config.addDataSourceProperty("allowPublicKeyRetrieval", "true");
            config.addDataSourceProperty("databaseName", "database");
            config.setPoolName("Hikari-MySql Pool Name");
            logger.error("-- Create Hikari Datasource with config {} --", config);
            ds = new HikariDataSource(config);
        } catch (Throwable t) {
            logger.error("Error Occurred during Datasource Initializaiton", t);
            throw t;
        }
    }

    private DataSource() {
    }

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}


public class MySqlConnection {
    static private final Logger logger = LoggerFactory.getLogger(MySqlConnection.class);
    public Connection getMySqlConnection() {
        Connection conn = null;
        try {

            conn = DataSource.getConnection();

            logger.info("------------> Got conne :: " + conn);
        } catch (SQLException e) {
            logger.error("SQLException :: " + e);
        }
        return conn;
    }
}
public class DataSourceTest {
    static private final Logger logger = LoggerFactory.getLogger(DataSourceTest.class);
    public static void main(String[] args) {
        MySqlConnection mySqlConnection = new MySqlConnection();
        Connection conn = null;
        try {

            conn = mySqlConnection.getMySqlConnection();

            logger.info("------------> Got connection :: " + conn);

            Statement statement = conn.createStatement();
            ResultSet rs = statement.executeQuery("{some select statement}");
        } catch (SQLException e) {
            logger.error("SQLException :: " + e);
        }
    }
}

Исключение:

Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
    at com.zaxxer.hikari.util.UtilityElf.createInstance(UtilityElf.java:90) ~[HikariCP-2.5.1.jar:?]
    at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:314) ~[HikariCP-2.5.1.jar:?]
    at com.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:108) ~[HikariCP-2.5.1.jar:?]
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:99) ~[HikariCP-2.5.1.jar:?]
    at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:71) ~[HikariCP-2.5.1.jar:?]

Если я запускаю код из основного класса внутри банки, он работает. Но из шнура не работает


person pointerness    schedule 20.06.2019    source источник
comment
Вместо Hikari я попытался использовать пул соединений dbcp appache commons. Но даже не могу построить банку, когда пытаюсь это сделать. Я получаю сообщение об ошибке, убедитесь, что запись «cordapp.signing.options» содержит правильную конфигурацию хранилища ключей, или отключите подпись с помощью «cordapp.signing.enabled false». Если я изменю зависимость на cordaCompile, он компилируется, но по-прежнему не работает   -  person pointerness    schedule 26.06.2019


Ответы (2)


В MySQL для HikariCP используйте setJdbcUrl вместо setDataSourceClassName

config.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");

Известно, что источник данных MySQL не работает в отношении поддержки тайм-аута сети. Вместо этого используйте конфигурацию jdbcUrl.

person user7294900    schedule 30.06.2019
comment
Это не связано. Код работает при развертывании как приложение Springboot. Это что-то особенное для среды выполнения корды - person pointerness; 04.07.2019

Проверьте свое дерево зависимостей. Я думаю, у вас есть конфликт с зависимостью "mysql-connector-java", которая вызывает беспорядок в загрузчике классов.

person shpitc    schedule 02.07.2019