Как да създадете и конфигурирате MariaDBDataSource ръчно

Имам проблеми със създаването на необединен източник на данни с клас MariaDBDataSource.

MariaDbDataSource mysqlDs = new MariaDbDataSource(connectionUrl);
mysqlDs.setPassword(password);
mysqlDs.setUser(username);
return wrapWithPool(mysqlDs);

wrapWithPool просто обгръща дадения източник на данни с обединен (c3p0 пул). Но не успявам да проверя връзка от пула. Винаги когато го правя

datasource.getConnection()

взимам

org.mariadb.jdbc.internal.util.dao.QueryException: Could not connect: Access denied for user 'someuser'@'somehost' (using password: NO)

Не знам защо? Зададох парола, която не е празна. Има ли нещо друго, което да зададете на класа MariaDbDatasource, за да го накарате да използва паролата?

редактиране: Добре, така че изглежда, че когато не обвивам MariaDbDataSource, всичко работи добре. Така че c3p0 прекъсва връзката и от debug виждам, че не успява да получи паролата... Методът на обвиване е доста прост

private static DataSource wrapWithPool(DataSource unpooled) throws SQLException {
            unpooled.setLoginTimeout(HOST_REACH_TIMEOUT.getValue());
            Map<String, Object> poolOverrideProps = new HashMap<>();
            poolOverrideProps.put("maxPoolSize", CONNECTION_POOL_SIZE.getValue());
            poolOverrideProps.put("minPoolSize", 1);
            poolOverrideProps.put("checkoutTimeout", HOST_REACH_TIMEOUT.getValue() * 2);
            return DataSources.pooledDataSource(unpooled, poolOverrideProps);

        }

И работи перфектно с други драйвери (oracle, jtds). Защо не с mariaDb?


person Nadir    schedule 24.03.2016    source източник


Отговори (1)


Добре, открих проблема. По някаква причина c3p0, когато създава пула, обвива дадения клас DataSource в собствен клас WrapperConnectionPoolDataSourceBase. След това се опитва да открие параметрите за удостоверяване от него с помощта на отражение. Тъй като MariaDBDataSource не предоставя метода getPassword, откритата стойност е null и следователно съобщението за грешка за неизползване на паролата.

Така че като заобиколно решение направих проста обвивка

private static class MariaDbDExtender extends MariaDbDataSource {

        private String password;

        public MariaDbDExtender(String connectionUrl) throws SQLException {
            super(connectionUrl);
        }


        @Override
        public void setPassword(String pass) {
            this.password = pass;
            super.setPassword(pass);
        }

        //this method is required to allow c3p0 magically use reflection to get correct password for connection
        public String getPassword() {
            return password;
        }
    }

и по-късно

MariaDbDExtender mysqlDs = new MariaDbDExtender(connectionUrl);
mysqlDs.setPassword(password);
mysqlDs.setUser(username);
return wrapWithPool(mysqlDs);

И магически започва да работи. Това е специфичен проблем за драйвера, тъй като източникът на данни на oracle няма метода getPassword, но работи. Така че някои много специфични подробности за изпълнението на тези 2 библиотеки просто го правят несъвместим в моя случай на употреба.

person Nadir    schedule 24.03.2016