【问题标题】:Connect to Openshift database with JDBC使用 JDBC 连接到 Openshift 数据库
【发布时间】:2016-04-05 11:29:56
【问题描述】:

我花了很多时间试图弄清楚如何通过我的 Java 项目连接到 Openshift 的 mysql 数据库。我已经创建了 MySQL 数据库、PhpMyAdmin 和 TomCat 7 墨盒。我配置了Putty,我什至设置了ssh(不知道为什么)并获得了这些信息:

environment variables with Ruby or PuTTY terminal

问题在于 JDBC,我收到 ERROR Communications link failure...我在 Eclipse 中使用 jdbc 的登录信息,请参见下文:

String USERNAME = System.getenv("admixxxxxxxx");
String PASSWORD = System.getenv("gxxxxxxxxxxx");
String DB_NAME = System.getenv("nautxxxx");
String URL = System.getenv("127.x.xxx.x:3306") + "/" + DB_NAME;

最后:

connection = DriverManager.getConnection("jdbc:mysql://" + URL, USERNAME , PASSWORD);

我的代码在 UwAmp localhost 上运行,但无法连接到 Openshift。请帮帮我,有什么问题。

【问题讨论】:

  • 你为什么使用 System.getenv() ?
  • 因为我搜索过,找到了那个代码示例,不知道为什么一定是Sys.getenv(),直接用了。
  • 您应该质疑 Google 为您提供了什么,否则您将成为复制粘贴的受害者。要么研究使用的方法,要么简单地调试或打印字符串值并查看它们包含的内容。
  • 谢谢你的评论,我预计会收到这样的通讯,我这样做只是在我没有时间理解它的真正含义的时候,但我需要我知道。即将在我们学院上课,所以没有太多时间,只是有很多工作......

标签: java mysql jdbc javafx openshift


【解决方案1】:

您错误地(并且不必要地)使用了System.getenv

System.getenv 用于获取环境变量的值。调用System.getenv("gxhaixUc9V94"); 不是给你密码而是null,因为很可能没有名称为gxhaixUc9V94 的环境变量。

你为什么要使用 getenv!?

试试这个:

String USERNAME = "adminwmxLs6V";
String PASSWORD = "gxhaixUc9V94";
String DB_NAME = "nautilius";
String URL = "127.8.238.2:3306" + "/" + DB_NAME;
// [...]
connection = DriverManager.getConnection("jdbc:mysql://" + URL, USERNAME , PASSWORD);

【讨论】:

  • f1sh,我试过很多次,想在浏览器中打开那个链接来检查它是否发送到某个页面,例如:127.8.238.2:3306/nautilius,回答:这个页面不是可用的。也许问题在于,我是否需要通过输入这个凭证从我的数据库中获取一些信息?但我认为不,所有信息都是正确的,错误不可能。
  • 在浏览器中打开该“链接”不会向您显示任何内容,因为端口 3306 上的 sql 实例不使用 http。这不是对任何事情的有效测试......
  • 感谢您的明确回答,是的,我认为类似的东西只是转到该链接不是好主意,在本地主机上是的,但不适用于普通主机。
【解决方案2】:

首先,在您的应用程序12 Factor: Configuration 中包含任何敏感信息(如用户和密码)是一种不好的做法,因此我强烈建议不要在代码中直接使用用户/密码/数据库名称。此外,您不应该在任何地方发布真实凭据,这会带来很大的安全风险。

现在回答您的问题,Openshift 提供了包含这些值的环境变量。我没有在 Openshift 上尝试过 MySQL 数据库,但确实使用了 MongoDB,它给了我以下变量:

$OPENSHIFT_MONGODB_DB_USERNAME
$OPENSHIFT_MONGODB_DB_PASSWORD
$OPENSHIFT_MONGODB_DB_DATABASE
$OPENSHIFT_MONGODB_DB_HOST
$OPENSHIFT_MONGODB_DB_PORT

所以它可能会给你相同的 MySQL 变量,为了确保你可以ssh 进入你的应用程序并检查环境变量,使用 rhc 工具,你可以这样做:

rhc ssh -a <app-name> [-l <username>]

&lt;app-name&gt; 代表您在 openshift 中的应用程序名称,即您第一次创建应用程序时使用的名称。

或者,如果您没有将 rhc 工具配置为使用默认的 openshift 凭据,或者如果您使用多个帐户,则必须提供帐户名称以及 -l 和您的 Openshift 登录名。发出命令后,如果密码未存储在会话中,您也会被要求输入密码。

一旦你有了你的应用程序的shell,.env目录就会存储系统环境变量,作为文件,每个文件代表一个变量,文件名是变量名,文件内容是变量值。

ls .env

将列出所有环境变量,因此请查找以OPENSHIFT_MYSQL_ 开头的所有文件,因为这些文件包含环境变量的值以及连接到数据库的凭据。

最后你可以使用这些变量:

System.getenv('OPENSHIFT_MYSQL_DB_USERNAME') 
System.getenv('OPENSHIFT_MYSQL_DB_PASSWORD')
// and so on with all the variables that you need

更新

还有rhc env-list 命令列出了应用程序中的所有环境变量,这也需要-a-l 参数。

编辑

编辑了一些部分以消除混乱并进一步完成答案。

【讨论】:

  • 我在 Openshift 官方页面上发现我确实可以使用 rhc 工具,但是你能告诉我为什么 rhc ssh -a &lt;app-name&gt; 命令对我有用吗?我在 PuTTY 终端中输入这个,我已经完全配置了它,所有 rhc 工具都安装了link how.ls .env 给了我所有的环境变量,而不是$OPENSHIFT_MYSQL_xxx 它只给了我OPENSHIFT_MYSQL_DB_HOST, OPENSHIFT_MYSQL_DB_PORT 等等......我想是这样,因为没有得到第一个命令,不知道为什么。最后一个通讯未找到:D。我会尝试解决这个问题。
  • 更新: 可能是我错误地输入了命令,这里我是怎么做的:rhc ssh -a nautilius,或rhc ssh -a &lt;nautilius&gt;rhc ssh -a &lt;nautilius-diveserver.rhcloud.com&gt;。 @salvadorjuan,感谢您的建议,即不要在公共场合包含任何敏感信息,例如用户和密码,我很高兴学习并得到您的帮助。当我达到 10 个徽章时,我会编辑帖子,因为我是新来的。
  • 如果你没有配置rhc工具有默认凭据,那么必须添加一个新参数rhc ssh -a &lt;app-name&gt; -l &lt;username&gt;,也许这就是它不起作用的原因,而应用程序名称只是应用程序名称,没有&lt;&gt;,您不需要包含整个域。是的,当我说$OPENSHIFT_MYSQL_xxx xxx 是由于懒惰输入代表所有选项,$ 是为了指出它是一个环境变量
  • 稍微编辑了分析器,试图澄清更多:)
【解决方案3】:

我也有类似的问题。当我在本地机器上测试并连接到我的 localhost mysql 数据库时,一切正常,但当我将其部署到 Openshift 时,它就无法正常工作了。

最终我发现问题在于 Openshift mysql 数据库中的表名以小写字母开头,而在我的 java 代码中,我的查询是用表名的大写首字母编写的,例如。 “用户”,而不是“用户”。我的本地数据库设置与 Openshift 数据库相同,但问题是我的本地是 Windows,并且不区分大小写,而 Openshift 服务器是。见这里:Are table names in MySQL case sensitive?

“数据库和表名在 Windows 中不区分大小写,在大多数 Unix 中区分大小写。”

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多