使用JDBC连接到Openshift数据库

时间:2015-12-31 13:43:09

标签: java mysql jdbc javafx openshift

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

environment variables with Ruby or PuTTY terminal

问题在于JDBC,我收到ERROR通信链接失败...我在Eclipse中使用jdbc登录信息,请参阅下面的内容:

patientid  |   admitdate    | status   |    guid   |  Filter
1          |  2013-09-25   |  1       |     50    | update
1          |  2014-03-25   |  1       |     11    | insert
1          |  2014-04-09   |  1       |     51    | update
1          |  2015-01-22   |  1       |     52    | update
2          |  2015-12-13   |  1       |     53    | update
2          |  2014-10-10   |  1       |     15    | insert
3          |  2015-10-11   |  1       |     55    | update
3          |  2015-12-27   |  1       |     17    | insert
4          |  2011-01-01   |  1       |     27    | update
4          |  2011-01-01   |  1       |     20    | insert

最后:

SELECT  p.patientid , p.admitdate, p.status,
        CASE WHEN datediff(day, p.admitdate, ps.startdate) < 30
             THEN 'Update'
             ELSE 'Insert'
        END AS filter, 
        CASE WHEN datediff(day, p.admitdate, ps.startdate) < 30
             THEN ps.guid
             ELSE p.guid
        END AS guid
FROM    (SELECT , row_number() OVER(PARTITION BY patientid  ORDER BY flag) AS rowno
         FROM patient) AS p
OUTER   APPLY (SELECT TOP 1 ps.*
               FROM   patientstatus ps
               WHERE  ps.patientid=p.patientid

                 AND  ps.startdate >= p.admitdate
                 AND  ps.status = 2
               ORDER  BY  ps.check) AS ps
WHERE   p.status = 1
  AND   p.rowno = 1

我的代码在UwAmp localhost上工作,但无法连接到Openshift。请帮助我,这是错的。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

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

现在回答您的问题,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>]

其中<app-name>表示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个参数。

修改

编辑了几个部分以消除混淆并完成答案。

答案 2 :(得分:0)

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

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

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