Пулы локальных и удаленных подключений, Java DBCP - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть следующий вариант использования: у меня есть система, которая должна использовать два разных пула соединений, один для «локальной» базы данных (имеется в виду база данных, работающая на локальном компьютере), а другой - «удаленный»база данных.(Имеется в виду база данных, которая работает на другом удаленном сервере)

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

Я создал дваклассы для подключения к этой базе данных:

public class ConnectionPool {

    private static BasicDataSource ds = createNewDatasource();

    private static BasicDataSource createNewDatasource() {
        BasicDataSource ds = new BasicDataSource();

        String url = "jdbc:mysql://127.0.0.1:3306/SOME_DB"
        ds.setUrl(url);
        ds.setUsername(...);
        ds.setPassword(...);

        return ds;
    }

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

}

Другой класс выглядит точно так же, только он называется RemoteConnection, а URL-адрес изменяется на:

String url = "jdbc:mysql://<REMOTE_IP>:3306/SOME_DB_2"

Запуск вышеуказанных классовЯ продолжаю получать следующее сообщение в своих журналах:

ERROR (RemoteConnection.java:40) - Failed on getConnection
java.sql.SQLException: Cannot create PoolableConnectionFactory (Access denied for user '...'@'<MACHINE_LOCAL_IP>' (using password: YES))
at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2291)
at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2038)
at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1533)
at Censored.RemoteConnection.getConnection(RemoteConnection.java:59)
...
Caused by: java.sql.SQLException: Access denied for user '...'@'<MACHINE_LOCAL_IP>' (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:873)
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1710)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2188)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2219)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2014)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:776)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.GeneratedConstructorAccessor31.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
at java.lang.reflect.Constructor.newInstance(Constructor.java:437)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
at org.apache.commons.dbcp2.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:39)
at org.apache.commons.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:256)
at org.apache.commons.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2301)
at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2287)
...

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

mysql -u'...' -p'...' -h <REMOTE_IP> SOME_DB_2

И он успешно подключился.Мне кажется, что это проблема с драйвером JDBC или определением соединения, но я не могу найти проблемное место.

Есть идеи, что я делаю неправильно?

1 Ответ

0 голосов
/ 28 февраля 2019

Я нашел проблему.Это была проблема с SSL.Пользователь, которого я использовал, должен был подключиться с помощью SSL-сертификата.

Это также причина, по которой я увидел IP-адрес локального компьютера в ошибке.

Способ проверки:

Select * from mysql.user where user='...';

Я обнаружил, что:

ssl_type != ''

Поэтому мне пришлось определить:

jdbc:mysql://<REMOTE_IP>:3306/SOME_DB_2&useSSL=true

Настроить соответствующие сертификаты, и все было хорошо.

...