Воспроизведение приложения на Heroku с использованием общей базы данных и обновлений модели

#java #hibernate #heroku #playframework #sql-update

#java #переход в спящий режим #heroku #игровая платформа #sql-обновление

Вопрос:

Я играю с приложением Play 1.2.3 (Java), используя экземпляр Heroku с общей базой данных.

Мой вопрос: как обновить схему базы данных после развертывания приложения? На самом деле, как вообще инициализировать базу данных, поскольку изначально она пуста, а спящий режим ddl в режиме PROD отключен?

О вариантах, которые я пробовал:

  1. Автоматический переход в спящий режим ddl — это большой недостаток в производстве
  2. При использовании гибернации с эволюциями воспроизведения возникает беспорядок, они создают мне слишком много проблем во время разработки, чтобы использовать их или полагаться на них
  3. Общие базы данных Heroku (бесплатный вариант или опция объемом 20 гб) не предоставляют доступ к консоли Psql, поэтому вы не можете сделать это вручную с помощью скриптов (как хотелось бы)

Это проблема, поскольку разница в стоимости между бесплатной базой данных (15 долларов в месяц) и самым дешевым вариантом, предоставляющим доступ к Psql (200 долларов в месяц), огромна, и для загрузочного сайта «тестирования воды» это имеет значение.

У кого-нибудь из вас возникла эта проблема? Как вы решаете эту проблему?

Комментарии:

1. Разве вы не можете просто использовать обновления ddl в DEV и evolutions в PROD?

2. @Marius «проблема» в том, что если я создаю сценарий evolutions, Play также запускает их в DEV. Кроме того, я хочу иметь возможность сначала протестировать изменения в dev, чтобы избежать проблем.

3. Хорошо, тогда, я думаю, решением только для воспроизведения было бы использовать Hibernate DDL, пока ваш код не будет готов к производству. А затем вы создадите новую базу данных с приспособлениями (или восстановите предыдущий снимок), чтобы протестировать свои изменения.

Ответ №1:

Я использую это: https://github.com/ddollar/heroku-sql-console. Оно просто предоставляет вам консоль SQL в вашей настройке — я не пытался выполнять скрипты.

Ответ №2:

Одной из альтернатив общей базе данных Heroku является использование другой базы данных где-нибудь на AWS (ваш собственный сервер EC2 или база данных RDS).

Однако, если вы хотите придерживаться общей базы данных, вам понадобится какой-то способ выполнить скрипт базы данных на Heorku. Для этого есть несколько различных способов. Одним из вариантов являются эволюции воспроизведения, но поскольку вы не хотите их использовать, вы могли бы использовать что-то вроде iBatis ScriptRunner. Создайте простое Java-приложение, которое может запускать sql-скрипт. Вот действительно простой пример:

 String dbUri = System.getenv("DATABASE_URL");
Class.forName("org.postgresql.Driver");
String username = dbUri.getUserInfo().split(":")[0];
String password = dbUri.getUserInfo().split(":")[1];
String dbUrl = "jdbc:postgresql://"   dbUri.getHost()   dbUri.getPath()   "?user="   username   "amp;password="   password;
Connection connection = DriverManager.getConnection(dbUrl);

InputStreamReader inputStreamReader = new InputStreamReader(ClassLoader.getSystemResourceAsStream(sqlFile));

Reader reader = new BufferedReader(inputStreamReader);

ScriptRunner scriptRunner = new ScriptRunner(connection, false, true);
scriptRunner.runScript(reader);
  

Просто поместите что-то вроде этого класса где-нибудь в каталог вашего приложения, а затем запустите его с чем-то вроде:

 heroku run "java -cp lib/postgres.jar:tmp/classes foo.SchemaCreator"
  

Комментарии:

1. Ну, моя главная проблема с Evolutions не в том, что я не хочу их использовать, а в том, что я не могу использовать скрипты в dev mdoe без того, чтобы они не конфликтовали с обновлениями ddl Hibernate. А отключение гибернации ddl в режиме разработки дает вам дополнительную работу. Ваше предложение кажется интересным 🙂