【问题标题】:Local and Remote connection pools, Java DBCP本地和远程连接池,Java DBCP
【发布时间】:2019-02-26 13:39:52
【问题描述】:

我有以下用例: 我有一个需要使用两个不同连接池的系统,一个用于“本地”数据库(意味着在本地计算机上运行的数据库),另一个是“远程”数据库。 (意思是在远程不同服务器上运行的数据库)

远程数据库是配置共享数据库,而本地是不同类型的数据。

我创建了两个类来连接这些数据库:

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 驱动程序或连接定义问题,但我似乎找不到问题所在。

知道我做错了什么吗?

【问题讨论】:

    标签: java mysql database-connection connection-pooling


    【解决方案1】:

    我发现了问题。这是一个 SSL 问题。 我使用的用户必须使用 SSL 证书连接。

    这也是我在错误中看到本地机器IP的原因。

    一种检查方法是:

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

    我发现的是:

    ssl_type != ''
    

    所以我必须定义:

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

    配置相关证书,一切顺利。

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      相关资源
      最近更新 更多