有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JDBC无法连接到openshift上的mysql数据库

我设法用phpMyAdmin和其他工具在OpenShift上建立了MySQL数据库。 我被告知数据库的主机名和端口分别是$OPENSHIFT_MYSQL_DB_host和$OPENSHIFT_MYSQL_DB_port,我把它们放在我的上下文中。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上尝试它时,代码可以工作。据我所知,我有所有必要的图书馆:

enter image description here

谢谢你的帮助:)

更新

我修改了连接代码如下:

{
    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")的值为空


共 (3) 个答案

  1. # 1 楼答案

    如果您使用的是MySQL盒带,则连接到数据库的信息位于应用程序的环境变量中。如果您使用的是JDBCpure,那么首先需要检索这些值​​. e、 g:

    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)进行更改

  2. # 2 楼答案

    这是不正确的:

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

    美元符号表示您认为将替换一个合适的主机和数据库名称,但事实并非如此

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

  3. # 3 楼答案

    删除美元符号:

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

    它会很好地工作(我在我的机器和OpenShift上测试了它)