2013-12-05 4 views
2

Я использую play framework 1.2.7, gae module 1.6.0 и siena module 2.0.7 (также проверен 2.0.6). Это простой проект, который должен запускаться в игре, развернутой в App Engine, и подключаться к базе данных MySQL в Google Cloud SQL. Мой проект работает нормально локально, но не удается подключиться к базе данных в процессе производства. Глядя на журналы, похоже, что вместо него используется драйвер postgresql вместо mysql.Play Siena не удается подключиться к MySQL на GAE

Application.conf

# db=mem 
db.url=jdbc:google:mysql://PROJECT_ID:sienatest/sienatest 
db.driver=com.mysql.jdbc.GoogleDriver 
db.user=root 
db.pass=root 

Это стек аварии след

play.Logger niceThrowable: Cannot connected to the database : null 
java.lang.NullPointerException 
    at com.google.appengine.runtime.Request.process-a3b6145d1dbbd04d(Request.java) 
    at java.util.Hashtable.put(Hashtable.java:432) 
    at java.util.Properties.setProperty(Properties.java:161) 
    at org.postgresql.Driver.loadDefaultProperties(Driver.java:121) 
    at org.postgresql.Driver.access$000(Driver.java:47) 
    at org.postgresql.Driver$1.run(Driver.java:88) 
    at java.security.AccessController.doPrivileged(AccessController.java:63) 
    at org.postgresql.Driver.getDefaultProperties(Driver.java:85) 
    at org.postgresql.Driver.connect(Driver.java:231) 
    at java.sql.DriverManager.getConnection(DriverManager.java:571) 
    at java.sql.DriverManager.getConnection(DriverManager.java:215) 
    at play.modules.siena.GoogleSqlDBPlugin.onApplicationStart(GoogleSqlDBPlugin.java:103) 
    at play.plugins.PluginCollection.onApplicationStart(PluginCollection.java:525) 
    at play.Play.start(Play.java:533) 
    at play.Play.init(Play.java:305) 

Что здесь происходит? Я указываю правильную схему драйвера и url, и она использует драйвер postgresql. Доступ к Google Cloud SQL API включен, приложение разрешено подключаться к экземпляру mysql, я не использую db = mem, ... Я застрял и не могу понять, как двигаться вперед! : -.. ((

UPDATE: Я думал, что я нашел решение, но это было не так, если я держу %prod префикс и создать войну нормально (или просто не определяет никаких свойств БД), то приложение будет использовать Google DataStore вместо Cloud SQL.Если я создаю файл войны, добавив --%prod в конец (или просто удаляю префикс %prod.exe в application.conf), он будет продолжать отказываться от подключения к базе данных, отображающей тот же начальная ошибка.

Любые идеи, пожалуйста?

ответ

0

В конце концов я закончил небольшую модификацию исходного кода игры siena и перекомпилировал его.

В случае, если кто-то интересно, то вам нужно удалить/комментарий исключение/улов в этом коде вокруг линии 97 в классе GoogleSqlDBPlugin:

// Try the connection 
       Connection fake = null; 
       try { 
        if (p.getProperty("db.user") == null) { 
         fake = DriverManager.getConnection(p.getProperty("db.url")); 
        } else { 
         fake = DriverManager.getConnection(p.getProperty("db.url"), p.getProperty("db.user"), p.getProperty("db.pass")); 
        } 
       } finally { 
        if (fake != null) { 
         fake.close(); 
        } 
       } 

По какой-то причине не удается установить соединение, когда инициируется DriverManager.getConnection(), но это работает при запуске с basicDatasource.getConnection();, который, по-видимому, используется модулем в остальной части кода. Поэтому, если вы удалите вышеупомянутый блок и перекомпилируете модуль, все будет работать так, как ожидалось. Если вы компилируете JDK 7, вам также необходимо реализовать public Logger getParentLogger() throws SQLFeatureNotSupportedException в внутреннем классе ProxyDriver в конце файла GoogleSqlDBPlugin.

Как ни странно, я выкопал в DriverManager.getConnection(), и это выглядело как некоторые драйвера PostgreSQL зарегистрирован как-то, потому что иначе я не могу понять, почему DriverManager.getConnection() бы позвонить в org.postgresql.Driver.connect().

0

После того, как застрял так долго на это я сразу нашел решение сразу после публикации вопроса. Довольно глупо.

Свойствам производственной среды в файле application.conf должно предшествовать% prod. поэтому конфигурацию базы данных следует читать

%prod.db.url=jdbc:google:mysql://PROJECT_ID:sienatest/sienatest 
%prod.db.driver=com.mysql.jdbc.GoogleDriver 
%prod.db.user=root 
%prod.db.pass=root 

И все работает нормально.

EDIT: Это НЕ РЕШЕНИЕ. Проблема исчезла, но приложение использует DataStore вместо Cloud SQL.

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