使用Java连接到heroku Postgres db

时间:2016-04-21 13:19:51

标签: java spring hibernate postgresql heroku

我无法连接到heroku数据库,当我将我的应用程序部署到heroku时,我将其记录在日志中:

  

[localhost-startStop-1] WARN org.springframework.web.context.support.AnnotationConfigWebApplicationContext - 在上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建名为'entityManagerFactory的bean时出错'在类路径资源中定义[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:password@Host: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;
}
}

我做错了什么?

3 个答案:

答案 0 :(得分:1)

Heroku使用DATABASE_URL环境变量来存储主数据库的位置。所以替换:

System.getenv("jdbc:postgresql://user:password@Host:5432/databaseName")

使用:

System.getenv("DATABASE_URL")

答案 1 :(得分: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;

有关详细信息,请参阅Connecting to Relational Databases on Heroku with Java

上的Heroku文档

答案 2 :(得分:0)

好像你正在使用Spring!这个答案适用于Spring Boot用户

除了始终存在的DATABASE_URL之外,Heroku在运行时创建了3个环境变量。他们是:

JDBC_DATABASE_URL
JDBC_DATABASE_USERNAME
JDBC_DATABASE_PASSWORD

您可能知道,如果在spring.datasource.*文件中找到application.properties属性,Spring Boot将自动配置您的数据库。这是我的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')
}