我无法连接到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;
}
}
我做错了什么?
答案 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')
}