2013-06-07 3 views
4

Мне удалось настроить базу данных MySQL на OpenShift с помощью phpMyAdmin и всех. мне сказали, имя хоста и порт моей для моей базы данных $ OPENSHIFT_MYSQL_DB_HOST и $ OPENSHIFT_MYSQL_DB_PORT соответственно, которые я положил в мой файл context.xml так:JDBC не может подключиться к базе данных mysql на openshift

<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

Спасибо за помощь :)

Update

Я изменил код подключения следующим образом:

{ 
    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") являются нулевыми.

+0

Я думаю, что модифицированный пример также будет работать, если бы знаки доллара были удалены из операторов getenv(). Как отмечено в принятом ответе, знак доллара указывает на замещение. Фактическое имя среды не включает знак доллара. – Thierry

ответ

4

Это неверно:

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

Это знак доллара предполагает, что вы думаете, правильный хост и имя базы данных будет заменен, но это не так.

Введите имя хоста и базы данных, чтобы увидеть, что он работает, а затем узнайте о файлах .properties, чтобы их экрнализировать.

+0

Извините, я немного смущен: в.файл свойств - могу ли я написать '$ OPEN_MYSQL_DB_HOST', или я должен использовать' System.getenv ($ OPENSHIFT_MYSQL_DB_HOST) 'в классе conneciton для поиска правильного имени хоста? –

+1

Держите его простым, пока он не заработает: просто получите значение, на которое указывает эта переменная, и введите его. Тогда беспокойтесь об экстернализации. Кто-то знает правильное имя хоста и базы данных. Я бы понял. – duffymo

+0

Я сделал то, что вы предложили, но значения, которые я получаю, являются нулевыми, а соединение не работает. –

0

Не могли бы вы сначала начать переадресацию портов.

rhc port-forward -a your-app-name

После запуска не убить этого ЦМД & просто использовать сгенерированные локальные адреса/порты.

2

Снимите доллар признаки:

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

И это будет работать отлично (я проверил это на моей машине и на моем OpenShift).

+0

Я получаю нулевое значение. Можете ли вы рассказать мне причину, по которой я получаю нулевое значение. – AnonymousDev

0

Если вы используете картридж 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); 

jbossas в строке URL является схемой. Измените свою схему (burgerjoint).

+0

. Я получаю нулевое значение при выполнении String host = System.getenv («OPENSHIFT_MYSQL_DB_HOST»); Строковый порт = System.getenv ("OPENSHIFT_MYSQL_DB_PORT"); String username = System.getenv ("OPENSHIFT_MYSQL_DB_USERNAME"); String password = System.getenv ("OPENSHIFT_MYSQL_DB_PASSWORD"); – AnonymousDev

Смежные вопросы