Спящий режим в Google Cloud SQL: первое поколение -> второе поколение

Я некоторое время запускаю приложение Java + Hibernate на Google App Engine. База данных MySQL является экземпляром Google Cloud SQL (первого поколения). Теперь я хочу обновить его до экземпляра "Второго поколения".

Если я это сделаю, EntityManager не может быть инициализирован, и он говорит, что некоторые классы не определены. Нужно ли вносить какие-либо изменения в конфигурацию?

Первое поколение использует MySQL 5.5, второе - MySQL 5.7.

1 ответ

Я бы посоветовал вам проверить имена и классы пакетов в файле конфигурации persistence.xml.

<persistence-unit name="Jondow">
<class>com.example.appengine.cloudsql.ClassName</class>

Затем где-нибудь в вашем коде вы получите этот класс, например, с помощью функции doGet:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("Jondow", properties);
EntityManager em = emf.createEntityManager();

Убедитесь, что вы определили все таблицы в вашей базе данных в этом файле и что где-то определен класс, который правильно отображает таблицу в базе данных. Я попытался перейти с первого поколения MySQL 5.5 на второе поколение MySQL 5.7, и мне просто нужно было изменить доступ к базе данных в pom.xml (имя экземпляра, пользователь, пароль). Затем Hibernate создал все таблицы в базе данных. Убедитесь, что у вас есть минимальное количество данных, заполняемых для вашего App Engine, потому что Hibernate создает таблицы, которые вы определили для вас, и у вас может возникнуть проблема с получением пустых таблиц. Также убедитесь, что пользователь, которого вы используете, имеет правильные разрешения для управления базой данных так, как вам нужно, потому что HIbernate не будет создавать таблицы, если у пользователя нет правильных разрешений

Проверьте следующие ссылки для примера проекта в Hibernate[1] и документации по Cloud SQL[2], я смешал их и имею оба способа работы с одним и тем же pom.xml. Я поделился кодом для функции init(), которую вы можете заменить на примере [3], функция doGet остается неизменной, убедитесь, что вы используете правильные имена строк.

Map<String, String> properties;
@Override
public void init() throws ServletException {

try {
  ApiProxy.Environment env = ApiProxy.getCurrentEnvironment();
  Map<String,Object> attr = env.getAttributes();
  String hostname = (String) attr.get("com.google.appengine.runtime.default_version_hostname");
  String url = hostname.contains("localhost:") ? System.getProperty("cloudsql-local") : System.getProperty("cloudsql");
  properties = new HashMap();
  if (!hostname.contains("localhost:")) {
     properties.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.GoogleDriver");

  } else {
     properties.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.Driver");

  }
  properties.put("javax.persistence.jdbc.url", url);
  log("connecting to: " + url);
  try {
    conn = DriverManager.getConnection(url);

  } catch (SQLException e) {
    throw new ServletException("Unable to connect to Cloud SQL", e);

  }
} finally {

}

}

Также вы можете проверить [4] и [5] для получения дополнительной информации о Hibernate. Здесь [6] вы можете найти некоторую полезную информацию для миграции с экземпляра SQL первого поколения в облако.

[1] https://github.com/GoogleCloudPlatform/appengine-cloudsql-native-mysql-hibernate-jpa-demo-java/blob/master/src/main/java/com/google/appengine/demos/HibernateJpaServlet.java

[2] https://cloud.google.com/appengine/docs/standard/java/cloud-sql/

[3] https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/appengine-java8/cloudsql

[4] https://www.tutorialspoint.com/hibernate/hibernate_quick_guide.htm

[5] https://dzone.com/articles/spring-hibernate-google

[6] https://cloud.google.com/sql/docs/mysql/upgrade-db

Другие вопросы по тегам