Spring не видит источник данных на локальном, но развернутый на Horaku работает нормально - PullRequest
1 голос
/ 01 июня 2019

Я делаю учебник по Heroku https://devcenter.heroku.com/articles/getting-started-with-gradle-on-heroku и все было хорошо, пока я не могу запустить базу данных в локальном экземпляре.

Я пробовал это в интелии и через консоль ($ heroku local web после сборки gradlew). Я попытался скопировать базу данных из Heroku в локальную базу данных postgresDb, но также не смог.

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Autowired
    private DataSource dataSource;

    @RequestMapping("/db")
    String db(Map<String, Object> model) {
        try (Connection connection = dataSource.getConnection()) {
            Statement stmt = connection.createStatement();
            stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ticks (tick timestamp)");
            stmt.executeUpdate("INSERT INTO ticks VALUES (now())");
            ResultSet rs = stmt.executeQuery("SELECT tick FROM ticks");

            ArrayList<String> output = new ArrayList<String>();
            while (rs.next()) {
                output.add("Read from DB: " + rs.getTimestamp("tick"));
            }

            model.put("records", output);
            return "db";
        } catch (Exception e) {
            model.put("message", e.getMessage());
            return "error";
        }
    }

    @Bean
    public DataSource dataSource() throws SQLException, URISyntaxException {
        if (dbUrl == null || dbUrl.isEmpty()) {
            return new HikariDataSource();
        } else {
            HikariConfig config = new HikariConfig();
            config.setJdbcUrl(dbUrl);
            return new HikariDataSource(config);
        }
    }

Я также пытался получить dbUrl из конфигурации Heroku

URI dbUri = new URI(System.getenv("DATABASE_URL"));

            String username = dbUri.getUserInfo().split(":")[0];
            String password = dbUri.getUserInfo().split(":")[1];
            String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath() + "?sslmode=require";

После того, как я перехожу на страницу / db, я получаю HikariPool-1 - dataSource or dataSourceClassName or jdbcUrl is required. Что я делаю не так?

1 Ответ

2 голосов
/ 02 июня 2019

Используйте @Bean из учебника. Вы должны скопировать (или просто создать) файл .env из heroku и добавить строку коннекта, потому что она изначально там не хранится, но heroku обрабатывает его так, как будто это было.

  • В консоли получить JDBC_DATABASE_URL по команде (на окнах) heroku run echo $JDBC_DATABASE_URL
  • Копировать строку из вывода
  • Вставьте эту строку в файл .env в вашем проекте как переменную JDBC_DATABASE_URL="your_conecction_string_copied_from_console"
  • консоль: heroku local web
  • прибыль:)

ярлык для Windows:

echo|set /p="JDBC_DATABASE_URL=" | heroku run echo $JDBC_DATABASE_URL >> .env

...