【问题标题】:JDBC can't connect to mysql database on openshiftJDBC无法连接到openshift上的mysql数据库
【发布时间】:2013-06-03 20:37:20
【问题描述】:

我设法使用 phpMyAdmin 等在 OpenShift 上设置 MySQL 数据库。 有人告诉我,我的数据库的主机名和端口分别是 $OPENSHIFT_MYSQL_DB_HOST 和 $OPENSHIFT_MYSQL_DB_PORT,我将它们放在我的 context.xml 文件中,如下所示:

<context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://$OPENSHIFT_MYSQL_DB_HOST:$OPENSHIFT_MYSQL_DB_PORT/burgerjoint</param-value>
    </context-param>
    <context-param>
        <param-name>user</param-name>
        <param-value>admin******</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>*********</param-value>
    </context-param>

建立连接的代码是:

public void contextInitialized(ServletContextEvent event) {
    // Connect
    String driver = event.getServletContext().getInitParameter(PARAM_DRIVER);
    String url = event.getServletContext().getInitParameter(PARAM_URL);
    String username = event.getServletContext().getInitParameter(PARAM_USERNAME);
    String password = event.getServletContext()
        .getInitParameter(PARAM_PASSWORD);

    try {
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(url, username,
            password);

        event.getServletContext().setAttribute(ATTR_CONNECTION, connection);


    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    }

但问题是服务器上的连接为空,我不明白为什么。我做错什么了吗?当我在 localhost 上尝试时,该代码有效。据我所知,我拥有所有必要的库:

感谢您的帮助:)

更新

我已将连接代码修改如下:

{
    if (connection != null) return connection;

    try
    {
        Properties dbProperties = new Properties();
        InputStream input = DatabaseUtil.class.getClassLoader().getResourceAsStream(DB_PROPERTIES_FILE);
        dbProperties.load(input);
        String url = "";
        if (appIsDeployed)
        {
        String host = System.getenv("$OPENSHIFT_MYSQL_DB_HOST");
        String port = System.getenv("$OPENSHIFT_MYSQL_DB_PORT");
        String name = "burgerjoint";
        url = "jdbc:mysql://" + host + ":" + port + "/" + name;
        } else
        {
        url = dbProperties.getProperty(PARAM_URL);
        }
        String driver = dbProperties.getProperty(PARAM_DRIVER);
        String username = dbProperties.getProperty(PARAM_USERNAME);
        String password = dbProperties.getProperty(PARAM_PASSWORD);

        Class.forName(driver);
        connection = DriverManager.getConnection(url, username, password);

但它仍然提供空连接。 System.getenv("$OPENSHIFT_MYSQL_DB_HOST")System.getenv("$OPENSHIFT_MYSQL_DB_PORT") 的值为 null。

【问题讨论】:

  • 我认为如果从 getenv() 语句中删除美元符号,修改后的示例也可以工作。如已接受的答案中所述,美元符号表示替换。实际环境名称不包含美元符号。

标签: java mysql tomcat jdbc openshift


【解决方案1】:

这是不正确的:

jdbc:mysql://$OPENSHIFT_MYSQL_DB_HOST:$OPENSHIFT_MYSQL_DB_PORT/burgerjoint

该美元符号表明您认为将替换正确的主机和数据库名称,但事实并非如此。

对主机和数据库名称进行编码以查看其是否有效,然后了解 .properties 文件以将其外部化。

【讨论】:

  • 抱歉,我有点困惑:在 .properties 文件中 - 我可以写 $OPEN_MYSQL_DB_HOST 还是应该在连接类中使用 System.getenv($OPENSHIFT_MYSQL_DB_HOST) 来找到正确的主机名?
  • 保持简单直到它起作用:只需获取变量指向的值并输入它。然后担心将其外部化。有人知道正确的主机和数据库名称。我会明白的。
  • 我按照你的建议做了,但我得到的值为 null 并且连接不起作用。
  • 我设法通过在 Termian 上运行此命令找出实际值:rhc app ssh -a {app-name}
  • 如果您仍然获得与正确主机、数据库和端口的空连接,那么您可能没有被授予从该 IP 地址访问服务器的权限。 MySQL 允许在该级别进行控制。在这种情况下,您唯一的办法是与 DBA 所有者交谈并获取货物。
【解决方案2】:

去掉美元符号:

   String host = System.getenv("OPENSHIFT_MYSQL_DB_HOST");
   String port = System.getenv("OPENSHIFT_MYSQL_DB_PORT");

而且效果很好(我在我的机器和我的 OpenShift 上对其进行了测试)。

【讨论】:

  • 我得到空值你能告诉我我得到空值的原因吗
【解决方案3】:

请您先尝试开始端口转发。

rhc port-forward -a your-app-name

一旦开始,不要杀死这个 cmd,只需使用生成的本地地址/端口。

【讨论】:

    【解决方案4】:

    如果您使用 MySQL 插件,连接数据库的信息位于应用程序的环境变量中。如果您使用的是 JDBC pure ,则需要先检索值。例如:

    String host = System.getenv("OPENSHIFT_MYSQL_DB_HOST");
    String port = System.getenv("OPENSHIFT_MYSQL_DB_PORT");
    String username = System.getenv("OPENSHIFT_MYSQL_DB_USERNAME");
    String password = System.getenv("OPENSHIFT_MYSQL_DB_PASSWORD");
    
    String url = String.format(":mysql://%s:%s/jbossas", host, port);
    Connection conn = DriverManager.getConnection(url, username, password);
    

    字符串 url 中的 jbossas 是架构。更改您的架构 (burgerjoint)。

    【讨论】:

    • 我在执行 String host = System.getenv("OPENSHIFT_MYSQL_DB_HOST"); 时得到空值字符串端口 = System.getenv("OPENSHIFT_MYSQL_DB_PORT");字符串用户名 = System.getenv("OPENSHIFT_MYSQL_DB_USERNAME");字符串密码 = System.getenv("OPENSHIFT_MYSQL_DB_PASSWORD");
    猜你喜欢
    • 2014-12-09
    • 2023-04-07
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2015-04-01
    相关资源
    最近更新 更多