2016-04-21 2 views
1

Я не могу подключиться к базе данных Heroku, когда я раскрываю мое приложение Heroku я получаю это на бревнах:Подключение к Heroku Postgres БД с Java

[локальный-стартстопный-1] WARN org.springframework.web. context.support.AnnotationConfigWebApplicationContext - Исключение, возникающее при инициализации контекста - отмена попытки обновления: org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем «entityManagerFactory», определенным в ресурсе пути к путу [path/DataBaseConfig.class]: вызов init метод не выполнен; вложенное исключение org.hibernate.service.spi.ServiceException: Невозможно создать запрошенную услугу [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

Моя база данных конфигурации:

public class DataBaseConfig { 

@Resource 
private Environment env; 

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws URISyntaxException{ 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 

    em.setDataSource(dataSource()); 
    em.setPackagesToScan(env.getRequiredProperty("db.entity.package")); 
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
    em.setJpaProperties(getHibernateProperties()); 

    return em; 
} 

@Bean 
public BasicDataSource dataSource() throws URISyntaxException { 
    URI dbUri = new URI(System.getenv("jdbc:postgresql://user:[email protected]:5432/databaseName")); 

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

    BasicDataSource basicDataSource = new BasicDataSource(); 
    basicDataSource.setUrl(dbUrl); 
    basicDataSource.setUsername(username); 
    basicDataSource.setPassword(password); 

    return basicDataSource; 
} 
} 

Что я делаю неправильно?

+0

Попробуйте использовать 'System.getenv (" DATABASE_URL ")' –

ответ

1

Heroku использует переменную окружения DATABASE_URL, чтобы сохранить местоположение вашей основной базы данных. Так заменить:

System.getenv("jdbc:postgresql://user:[email protected]:5432/databaseName") 

С:

System.getenv("DATABASE_URL") 
1

Если вы используете стандартный Java buildpack вы можете заменить код в методе dataSource с этим:

String dbUrl = System.getenv("JDBC_DATABASE_URL"); 
String username = System.getenv("JDBC_DATABASE_USERNAME"); 
String password = System.getenv("JDBC_DATABASE_PASSWORD"); 

BasicDataSource basicDataSource = new BasicDataSource(); 
basicDataSource.setUrl(dbUrl); 
basicDataSource.setUsername(username); 
basicDataSource.setPassword(password); 

return basicDataSource; 

Для получения дополнительной информации см документация Heroku по адресу Connecting to Relational Databases on Heroku with Java

0

Кажется, что вы используете Весну! Этот ответ предназначен для пользователей Spring Boot

Помимо DATABASE_URL, который всегда существует, Heroku создает 3 переменных окружения во время выполнения. К ним относятся:

JDBC_DATABASE_URL 
JDBC_DATABASE_USERNAME 
JDBC_DATABASE_PASSWORD 

Как вы можете быть в курсе, весна загрузки будет автоматически настроить базу данных, если он находит spring.datasource.* свойства в файле application.properties. Вот пример из моего application.properties

spring.datasource.url=${JDBC_DATABASE_URL} 
spring.datasource.username=${JDBC_DATABASE_USERNAME} 
spring.datasource.password=${JDBC_DATABASE_PASSWORD} 
spring.jpa.show-sql=false 
spring.jpa.generate-ddl=true 
spring.jpa.hibernate.ddl-auto=update 

Hibernate/Postgres зависимостей

В моем случае я использую Hibernate (в комплекте spring-boot-starter-jpa с PostgreSQL, так что мне нужен правильные зависимости в моем build.gradle :

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-data-jpa") 
    compile('org.postgresql:postgresql:9.4.1212') 
} 
Смежные вопросы