从Spring Boot连接到Heroku Postgres
我正在寻找使用JPA / Hibernate在Spring Boot应用程序中连接到Heroku Postgres的最简单,最干净的方式。
我在Heroku或Spring Boot文档中都没有看到这个组合的一个好的,完整的示例,所以我想在Stack Overflow上记录这一点。
我正在尝试使用这样的东西:
@Configuration
public class DataSourceConfig {
Logger log = LoggerFactory.getLogger(getClass());
@Bean
@Profile("postgres")
public DataSource postgresDataSource() {
String databaseUrl = System.getenv("DATABASE_URL")
log.info("Initializing PostgreSQL database: {}", databaseUrl);
URI dbUri;
try {
dbUri = new URI(databaseUrl);
}
catch (URISyntaxException e) {
log.error(String.format("Invalid DATABASE_URL: %s", databaseUrl), e);
return null;
}
String username = dbUri.getUserInfo().split(":")[0];
String password = dbUri.getUserInfo().split(":")[1];
String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':'
+ dbUri.getPort() + dbUri.getPath();
// fully-qualified class name to distuinguish from javax.sql.DataSource
org.apache.tomcat.jdbc.pool.DataSource dataSource
= new org.apache.tomcat.jdbc.pool.DataSource();
dataSource.setUrl(dbUrl);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
我正在使用Profiles,这似乎与我想要的很匹配:在Heroku上设置为,而在本地开发中则使用H2内存数据库(此处省略了其配置)。此方法似乎工作正常。SPRING_PROFILES_ACTIVE
postgres
spring.profiles.active
h2
In(特定于配置文件的属性):application-postgres.properties
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.driverClassName=org.postgresql.Driver
DataSource
从Tomcat似乎是一个不错的选择,因为默认依赖项包含它,并且因为Spring Boot参考指南说:
我们更喜欢Tomcat池化数据源的性能和并发性,因此如果可用,我们总是选择它。
(我也从Commons DBCP看到与Spring Boot一起使用。但对我来说,这似乎不是最干净的选择,因为默认的依赖项不包括Commons DBCP。总的来说,我想知道Apache Commons是否真的可以在2015年成为连接到Postgres的推荐方式......Heroku文档也为这种情况提供了“在春天”;我假设这是指Commons DBCP,因为我在Spring本身没有看到这样的类。BasicDataSource
BasicDataSource
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1205-jdbc42</version>
</dependency>
当前状态:失败,并显示“未将 JDBC 驱动程序作为驱动程序类名属性加载为 null”:
eConfig$$EnhancerBySpringCGLIB$$463388c1 : Initializing PostgreSQL database: postgres:[...]
j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found
[...]
o.a.tomcat.jdbc.pool.PooledConnection : Not loading a JDBC driver as driverClassName property is null.
o.a.tomcat.jdbc.pool.PooledConnection : Not loading a JDBC driver as driverClassName property is null.
[...]
org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
在日志中,我看到我的被调用得很好,并且PostgreSQLDialect正在使用中(如果没有这个,它就失败了,因为“当'hibernate.dialect'未设置时,对DialectResolutionInfo的访问不能为空”)。postgresDataSource
我的具体问题
- 那么,如何让它工作?我正在设置,那么为什么“不加载JDBC驱动程序作为驱动程序类名属性为空”?
spring.datasource.driverClassName
- 是使用Tomcat的罚款还是你会推荐其他东西?
DataSource
- 是否必须使用特定版本定义上述依赖项?(如果没有这个,我收到“找不到合适的驱动程序”错误。
postgresql
- 有没有更简单的方法来完成所有这些(同时坚持Java代码和/或属性;请不要使用XML)?