使用简单Java程序(JDBC)连接到Google SQL

使用简单Java程序(JDBC)连接到Google SQL,java,jdbc,google-cloud-sql,Java,Jdbc,Google Cloud Sql,我有一个简单的Java程序(不是web应用程序/Google引擎等)。 我浏览了Google Cloud SQL网站上的所有指南,但我不知道如何连接到服务器 现在我有 Class.forName("com.mysql.jdbc.Driver"); Class.forName("com.mysql.jdbc.Driver"); 及 其中x是实例的IP地址(取自实例的属性),y只是实例ID 我做错什么了吗? 我还为根用户设置了一个密码,这是推荐的教程之一。我应该在代码中的某个地方指定它吗 谢谢

我有一个简单的Java程序(不是web应用程序/Google引擎等)。 我浏览了Google Cloud SQL网站上的所有指南,但我不知道如何连接到服务器

现在我有

Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver");

其中x是实例的IP地址(取自实例的属性),y只是实例ID

我做错什么了吗? 我还为根用户设置了一个密码,这是推荐的教程之一。我应该在代码中的某个地方指定它吗

谢谢

编辑

根据mohan rathour的链接,我获得了以下代码:

我在控制台中获得以下信息:

INFO: Connecting to Cloud SQL instance [instanceName].
com.google.cloud.sql.mysql.SslSocketFactory getInstance
INFO: First Cloud SQL connection, generating RSA key pair.
但我得到了一个例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
解决方案

无需使用“云SQL MySQL套接字工厂”

在Google SQL面板中,转到您的实例面板->访问控制->授权,添加以下网络地址并单击保存

0.0.0.0/0
现在,您可以使用以下代码进行连接:

Class.forName("com.mysql.jdbc.Driver");
...
String url= String.format("jdbc:mysql://x:3306/y");
connection = DriverManager.getConnection(url, z, w);

其中x是您的实例IP(从面板中获取),y是实例名称,z是数据库(而不是帐户)用户名(通常为“root”),w是用户密码(您必须设置它。请查看Google的教程)。

您是否创建了Google mysql的本地实例,或者您可以直接连接。您可以查看下面的链接,或者使用类似Class.forName(“com.mysql.jdbc.GoogleDriver”)的google驱动程序进行检查

默认情况下,云SQL实例不允许在公共IP上进行连接。必须添加要连接的各个子网。 您可以在此处查看完整的文档:

另一种不需要白名单IP地址的方法是使用云SQL套接字库,该库使用具有短期证书的SSL会话:


不推荐使用白名单0.0.0.0/0,因为它可以向全世界打开数据库。

它可以与本地数据库以及其他免费MySQL服务一起使用。如果我使用Google SQL,我应该将连接URL更改为什么?确保没有防火墙阻止对端口3306的访问我应该在哪里检查它?我已经使用3306作为免费MySQL服务的端口,它工作得很好。也许我的url错了?你是否创建了谷歌mysql的本地实例,或者你可以直接连接。您可以查看下面的链接或使用类似Class.forName(“com.mysql.jdbc.GoogleDriver”)的google驱动程序进行检查@mohanrathour您可能应该编辑您的答案,使其与您提供的链接相关,因为这才是真正的问题,而不是连接代码。如果您收到错误消息,则说明您做错了什么。您收到错误消息了吗?是的,我收到了
连接=…
行的SQLException。异常是:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure
好吧,这是你的问题。@Kayaman这不是重复的。我可以用完全相同的方式连接其他MySQL服务。这里的问题与谷歌SQL有关。你读了mohan rathour提供的链接了吗?您需要采取额外的步骤从云外部进行连接。您能否详细说明为什么不建议使用白名单
0.0.0.0/0
?用户仍然需要用户名和密码才能与数据库交互。打开连接,但需要用户名和密码,这正是AWS RDS的工作方式。那么,为什么还要把特定的ip地址列入白名单呢?端口3306经常被许多参与者扫描。如果找到正在运行的数据库,则会探测该数据库的登录名。他们今天可能找不到客户,但他们会继续调查,将来可能会找到。有人可能会添加一个不那么安全的新帐户,而没有意识到DB是向世界开放的。大多数人不希望数据库服务器可以从开放的internet访问。RDS有“安全组”服务于相同的目的。很有趣,谢谢你提供的信息。我想我的困惑是因为RDS“安全组”在默认情况下没有被激活。这是否意味着默认情况下RDS会面临与您刚才描述的相同的风险?我猜这意味着亚马逊认为这是一个可以接受的风险,至少在默认情况下是这样?我很惊讶这些服务没有登录尝试速率限制来解决这个问题。无论如何,再次感谢你的信息+1我没有太多使用RDS,但我很确定默认情况下它也被锁定。归根结底,RDS和云SQL都运行MySQL,并且通常受到MySQL所提供内容的限制。MySQL有一个基于主机的登录尝试限制,但如果您可以不断更改您的源IP,这并不难做到。我们想让新的云SQL实例的默认设置更容易,但还没有准备好。
0.0.0.0/0
Class.forName("com.mysql.jdbc.Driver");
...
String url= String.format("jdbc:mysql://x:3306/y");
connection = DriverManager.getConnection(url, z, w);