2014-12-23 3 views
0

У меня возникла очень странная проблема, когда мой сервер App Engine не смог загрузить GoogleDriver своего Cloud SQL, вот ошибка (происходит сразу после запуска «mvn» AppEngine: обновление ").Не удается загрузить класс драйвера JDBC «com.mysql.jdbc.GoogleDriver»

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection 
     at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:596) 
     ... 
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.GoogleDriver' 
     at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1429) 
     at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371) 
     at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
     at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81) 
     at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) 
     ... 48 more 
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.GoogleDriver 

appengine.properties

################### MySQL Configuration - Google Cloud App Engine ########################## 
jdbc.driverClassName=com.mysql.jdbc.GoogleDriver 
jdbc.url=jdbc:google:mysql://mytestapp:testdb?user=someuser 
jdbc.username=someuser 
jdbc.password=****** 
jdbc.dialect=org.hibernate.dialect.MySQLDialect 

В моей весны контекста файла у меня есть:

<context:property-placeholder location="classpath:appengine.properties" /> 
<bean 
    id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" > 

    <property 
     name="driverClassName" 
     value="${jdbc.driverClassName}" /> 
    <property 
     name="url" 
     value="${jdbc.url}" /> 
    ... 

Любые идеи?

==

Просто, чтобы подтвердить, что я уже настроил мой Appengine-web.xml и это не помогает:

<?xml version="1.0" encoding="utf-8"?> 
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 
    <application>mytestapp</application> 
    <version>1</version> 
    <threadsafe>true</threadsafe> 
    <sessions-enabled>true</sessions-enabled> 

    <system-properties> 
     <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/> 
    </system-properties> 

    <use-google-connector-j>true</use-google-connector-j> 
</appengine-web-app> 

-

Я не мог двигаться вперед из-за некоторой несовместимости между версиями jibernate jar, поэтому я продолжал пробовать фактический конвейер выпуска (Jenkins + Maven + build + test + deploy), мне пришлось добавить IP-адрес VM Compute Engine в список разрешенных IP-адресов Cloud SQL-экземпляр для запуска моих модульных тестов и отладки (но, если я придерживаюсь этого подхода, я могу использовать только драйвер MySQL и URL вместо GoogleDriver и URL. Так что это становится сложно ...).

У меня есть эти свойства в файле Production.properties, который загружается мой Spring MVC конфигурационный файл:

################### MySQL Configuration - Google Cloud App Engine ########################## 
jdbc.driverClassName=com.mysql.jdbc.GoogleDriver 
jdbc.url=jdbc:google:mysql://*******testapp:testsqldb?user=root 
jdbc.username=root 
jdbc.password=***** 
jdbc.dialect=org.hibernate.dialect.MySQLDialect 

Есть простой способ динамически переключаться между внешними и GAE Cloud SQL деталей соединения без использования этого подход?

if (SystemProperty.environment.value() == 
SystemProperty.Environment.Value.Production) { 
    // Connecting from App Engine. 

Любые идеи?

+1

JAR-драйвер JDBC MySQL не должен содержать класс GoogleDriver. – duffymo

+0

Только что проверено, и в баночке нет этого класса. Я использую «mysql-connector-java-5.1.14» (указанный в моем pom.xml), и он отлично работает с «mvn appengine: devserver», но я понимаю, что он будет использовать совершенно другой диск, если он развертывается в реальном (удаленном) приложении в облаке Google (т. е. com.mysql.jdbc.GoogleDriver), я получил эту информацию из инструкций в своей консоли Google Cloud Developer - Cloud SQL. – theMarceloR

+0

Ну, похоже, что вы пропускаете какую-то библиотеку в своем пути к классу проектов. Ошибка очень специфична: ** java.lang.ClassNotFoundException: com.mysql.jdbc.GoogleDriver ** –

ответ

2
  • Этот класс не доступен автоматически во время работы приложения. Вы должны включить его, добавив <use-google-connector-j>true</use-google-connector-j> к вашему appengine-web.xml. Это отражено в: https://cloud.google.com/appengine/docs/java/cloud-sql/#enable_connector_j

отредактирован добавить (из комментариев ниже):

  • Кроме того, при подключении к Cloud SQL с GAE вы должны оставить поле пароля пустым.
  • Вы также должны убедиться, что, если ваш код работает за пределами GAE (например, на вашей рабочей станции, на GCE, на сборке Jenkins), он использует штепсель MySQL MySQL, поскольку соединитель Google доступен только в GAE.
  • Возможно, вам также понадобится изучить внешний драйвер MySQL, который работает как от GAE, так и от других подключений. Существует демонстрация этого на https://github.com/GoogleCloudPlatform/appengine-cloudsql-native-mysql-hibernate-jpa-demo-java
+0

Спасибо за ваш ответ Дэвид, это уже было настроено, и это не помогло, даже после развертывания с помощью «mvn appengine: update» и через релиз, я получаю ту же ошибку: «Не могу загрузить класс драйвера JDBC« com.mysql.jdbc.GoogleDriver », есть ли у вас какие-либо другие предложения? Есть ли способ для меня ssh в поле appengine для устранения некоторых проблем? – theMarceloR

+0

(1) Вы не можете использовать SSH для App Engine. (2) Пожалуйста, подтвердите, что это ошибка, которую вы получаете на GAE, а не на сервере dev. (3) Попробуйте явно вызвать 'Class.forName (« com.mysql.jdbc.GoogleDriver »)' перед танцем весна/спящий режим. (4) Можете ли вы получить более полную обратную трассировку, чтобы я мог видеть, как ваш стек пытается загрузить класс? – David

+0

(1) ОК. (2) Я не мог видеть эту ошибку при запуске «mvn appengine: update -DenvTarget = Production -DskipTests», я получал странную «java.lang.NoSuchFieldError: INSTANCE» (что было связано с некоторой несовместимостью с версиями jibernate jar), Я решил это после введения «mvn clean ..» в команду (я думал, что appengine: update косвенно сделает это для меня). (3) Я установил драйвер и, кажется, загрузил его правильно, но у меня появляется новая ошибка: «org.apache.commons.dbcp.SQLNestedException: не удается создать PoolableConnectionFactory (доступ запрещен для пользователя« root ») @ localhost – theMarceloR

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