我正在寻找使用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();
// …Run Code Online (Sandbox Code Playgroud) 我开发了一个小的Heroku + Grails + Postreg应用程序.部署后20分钟它会工作正常,之后我总是得到:
This connection has been closed.. Stacktrace follows: Heroku/myapp
- org.postgresql.util.PSQLException: This connection has been closed. Heroku/myapp
- at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:837) Heroku/myapp
- at org.postgresql.jdbc2.AbstractJdbc2Connection.getAutoCommit(AbstractJdbc2Connection.java:798) Heroku/myapp
- at org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2.doCall(GormStaticApi.groovy:102) Heroku/myapp
- at com.myapp.WorkspaceController.list(WorkspaceController.groovy:18) Heroku/myapp
- at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198) Heroku/myapp
- at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) Heroku/myapp
- at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53) Heroku/myapp
- at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:53) Heroku/myapp
- at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:62) Heroku/myapp
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) Heroku/myapp
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) Heroku/myapp
- at java.lang.Thread.run(Thread.java:745) Heroku/myapp
- 2015-08-07 15:11:10,685 [http-nio-20850-exec-5] ERROR spi.SqlExceptionHelper - This connection has been …Run Code Online (Sandbox Code Playgroud) 当我PSQLException: This connection has been closed尝试访问 AWS RDS 中的 Postgres 数据库时,出现以下错误消息:异常是随机发生的(并非每次运行代码时都会发生),如果执行到以下代码之前需要一段时间,则更有可能发生:
@Transactional
public void revokeChanges(ArrayList<Integer> changeIds) {
jdbcTemplate.batchUpdate(sqlUpdate,
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setStuff..
...
}
@Override
public int getBatchSize() {
return changeIds.size();
}
});
jdbcTemplate.batchUpdate(sqlInsert,
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setStuff...
}
@Override
public int getBatchSize() {
return changeIds.size();
}
});
Run Code Online (Sandbox Code Playgroud)
连接东西:
spring.datasource.url=jdbc:postgresql://my-url:port/dbName?tcpKeepAlive=true&autoReconnect=true
spring.datasource.driver-class-name=org.postgresql.Driver
相关POM:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.9.RELEASE</version>
</parent>
<dependencies> …Run Code Online (Sandbox Code Playgroud) postgresql ×3
heroku ×2
java ×2
spring ×2
grails ×1
grails-orm ×1
jdbc ×1
spring-boot ×1
spring-jdbc ×1