我在Java BasicDataSource连接池中遇到问题。
我的ProxySql已在所有DataProc Compute引擎上正确配置,如果我尝试使用sqlclient连接到CloudSql实例,则它可以正常工作。当我尝试从使用以下连接字符串配置的连接池连接到CloudSql时:pooljdbc:mysql://127.0.0.1/my_db?serverTimezone = UTC,出现此错误:
Cannot create PoolableConnectionFactory (Access denied for user 'myuser'@'localhost' (using password: YES))
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Access denied for user 'myuser'@'localhost' (using password: YES))
at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
并且是正确的,因为proxySQL tcp连接位于127.0.0.1而不是localhost(unix套接字)上。
我不明白为什么BasicDataSource尝试在本地主机上而不是在127.0.0.1上进行连接,因为我已在连接字符串中进行了配置。
任何帮助都非常感谢。
该字符串'myuser'@'localhost'
指的是您的登录身份,而不是服务器连接字符串。foo-instance
例如,如果您从一台名为的计算机上运行连接尝试,即使您使用指定了远程IP地址的连接字符串,则登录名也将为'myuser'@'foo-instance'
。虽然使用sqlclient进行的直接连接将根据指定的服务器主机名以不同的方式解析源主机名,但这是不应该依赖的怪癖。特别是在您的情况下,ProxySQL服务将代表您执行操作,因此源主机名将来自ProxySQL实例,而不是来自连接字符串。
您可能希望共享有关ProxySQL配置的更多详细信息,但是如果使用默认值,则PROXYSQL_HOSTNAME将设置为localhost
;。您可以尝试确保将PROXYSQL_HOSTNAME设置为127.0.0.1
。
有趣的是,基于粗略的测试,似乎创建了由标识的用户授权,它对127.0.0.1
登录主机的限制更为严格,而同时为localhost
允许127.0.0.1
和localhost
连接主机名创建授权:
MariaDB [(none)]> create user 'dhuo'@'127.0.0.1' identified by 'dhuopass';
...
$ mysql -h localhost -pdhuopass
ERROR 1045 (28000): Access denied for user 'dhuo'@'localhost' (using password: YES)
$ mysql -h 127.0.0.1 -pdhuopass
Welcome to the MariaDB monitor. Commands end with ; or \g.
...
MariaDB [(none)]> drop user [email protected]
MariaDB [(none)]> create user 'dhuo'@'localhost' identified by 'dhuopass';
...
$ mysql -h localhost -pdhuopass
Welcome to the MariaDB monitor. Commands end with ; or \g.
$ mysql -h 127.0.0.1 -pdhuopass
Welcome to the MariaDB monitor. Commands end with ; or \g.
通常,最好将用户授权配置为被标识为来自,localhost
而不是127.0.0.1
最好地支持任一入站主机名。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句