我正在尝试在我的Spring Boot(1.2.0.M1)应用程序中设置HikariCP,因此我可以使用它来代替Tomcat DBCP进行测试.我想在我的application.properties文件中配置连接池,就像我在使用Tomcat一样,但我无法弄清楚我应该怎么做.我发现的所有示例都显示了JavaConfig样式,或者使用单独的HikariCP属性文件.有人可以帮我弄清楚在application.properties中配置它的属性名吗?我还想从使用driverClassName方法切换到DataSourceClassName方法,因为它看起来更干净,建议使用.这在我的application.properties文件中也可以吗?
这是我对Tomcat DBCP的看法(只是一些基本的配置,没有完全刷新)
spring.datasource.validation-query=SELECT 1
spring.datasource.max-active=10
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=5
spring.datasource.test-on-borrow=true
spring.datasource.test-on-return=true
Run Code Online (Sandbox Code Playgroud)
我目前正在使用driverClassName和jdbc url来建立连接:
spring.datasource.url=jdbc:mysql://localhost:3306/myDb
spring.datasource.driverClassName=com.mysql.jdbc.Driver
Run Code Online (Sandbox Code Playgroud) 我们的项目中有Spring-boot/Hibernate/PostgreSQL应用程序,并使用Hikari作为连接池.我们继续遇到以下问题:几个小时后,活动连接数量增长到极限,我们得到这样的错误(完整堆栈跟踪在问题的最后):
Caused by: java.sql.SQLTransientConnectionException: HikariPool-0 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:213) ~[HikariCP-2.4.1.jar:na]
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:163) ~[HikariCP-2.4.1.jar:na]
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:85) ~[HikariCP-2.4.1.jar:na]
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:380) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final]
... 126 common frames omitted
Run Code Online (Sandbox Code Playgroud)
这是版本信息:
Spring-boot version: 1.2.3.RELEASE
HikariCP version: 2.4.1
Hibernate version: 4.3.6.Final
Postgresql jdbc: 9.3-1102-jdbc41
Server version: Apache Tomcat/8.0.23
JVM Version: 1.8.0_45-b14
Run Code Online (Sandbox Code Playgroud)
JPA/Hibernate配置:
jpa:
database-platform: org.hibernate.dialect.PostgreSQL82Dialect
database: POSTGRESQL
openInView: false
show_sql: false
generate-ddl: false
hibernate:
ddl-auto: none
naming-strategy: org.hibernate.cfg.EJB3NamingStrategy
properties:
hibernate.cache.use_second_level_cache: true
hibernate.cache.use_query_cache: false …Run Code Online (Sandbox Code Playgroud) 嗨,我正在尝试使用HikariCP与Spring连接池.我正在使用jdbcTempLate和JdbcdaoSupport.
这是我的数据源的spring配置文件:
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="dataSourceClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="dataSource.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="dataSource.user" value="username"/>
<property name="dataSource.password" value="password"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
但不幸的是,生成以下错误消息:
Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.zaxxer.hikari.HikariDataSource]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.zaxxer.hikari.HikariDataSource.<init>()
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何解决这个问题?
我正在使用HiknateCp,Hibernate和我在java中的playframework应用程序.在几分钟的空闲状态之后,似乎播放应用程序死了,当它获得新请求时它再次启动.有时我也看到Db持久性错误,其中sessionfactory不可用,我认为这是此问题的副作用.为什么应用程序在空闲状态下死机,我可以将它配置为不这样做吗?
在几分钟的空闲时间内,每次新请求后,我都会得到以下日志 -
[info] application - Application shutdown...
[info] application - Stopping HikariCP connection pool...
[info] application - Starting HikariCP connection pool...
Run Code Online (Sandbox Code Playgroud)
Persistence.xml: -
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.logSql" value="true"/>
<property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider"/>
<property name="hibernate.hikari.dataSourceClassName" value="com.impossibl.postgres.jdbc.PGDataSource"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
Application.conf: -
# JPA configuration
# ~~~~~
# You can declare as many Ebean servers as you want.
# By convention, …Run Code Online (Sandbox Code Playgroud) 当我们使用 SSL 证书设置 PostgreSQL 服务器后,我们经常会收到此错误。这种情况发生在与数据库有大量交互的流程上(更新大量条目/插入)
HikariPool-1 - Connection marked as broken because of SQLSTATE(08006), ErrorCode(0)
j.n.SocketException: Connection reset by peer (Write failed)
at j.n.SocketOutputStream.socketWrite0(SocketOutputStream.java)
at j.n.SocketOutputStream.socketWrite(SocketOutputStream.java:110)
at j.n.SocketOutputStream.write(SocketOutpu`enter code here`tStream.java:150)
at s.s.s.SSLSocketOutputRecord.deliver(SSLSocketOutputRecord.java:320)
at s.s.s.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:983)
... 63 common frames omitted
Wrapped by: j.n.s.SSLProtocolException: Connection reset by peer (Write failed)
at s.security.ssl.Alert.createSSLException(Alert.java:126)
at s.s.s.TransportContext.fatal(TransportContext.java:321)
at s.s.s.TransportContext.fatal(TransportContext.java:264)
at s.s.s.TransportContext.fatal(TransportContext.java:259)
at s.s.s.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:988)
at j.i.BufferedOutputStream.write(BufferedOutputStream.java:123)
at j.i.FilterOutputStream.write(FilterOutputStream.java:108)
at o.p.core.PGStream.send(PGStream.java:252)
at o.p.c.v.QueryExecutorImpl.sendParse(QueryExecutorImpl.java:1440)
at o.p.c.v.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1767)
at o.p.c.v.QueryExecutorImpl.sendQuery(QueryExecutorImpl.java:1328)
at o.p.c.v.QueryExecutorImpl.execute(QueryExecutorImpl.java:300)
... 56 common frames omitted
Wrapped by: o.p.u.PSQLException: …Run Code Online (Sandbox Code Playgroud) 我正在使用HikariCP 2.4.6并在Tomcat 8启动时收到一条警告消息:
01-Aug-2016 11:18:01.599 INFO [RMI TCP Connection(4)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Initializing Spring FrameworkServlet 'Spring MVC Dispatcher Servlet'
[2016-08-01 11:18:01,654] Artifact blueberry:war exploded: Artifact is deployed successfully
[2016-08-01 11:18:01,655] Artifact blueberry:war exploded: Deploy took 33,985 milliseconds
Aug 01 2016 11:26:52.802 AM [DEV] (HikariPool.java:614)
WARN : com.zaxxer.hikari.pool.HikariPool - 9m13s102ms - Thread starvation or clock leap detected (housekeeper delta=springHikariConnectionPool).
Run Code Online (Sandbox Code Playgroud)
我没有看到任何其他错误或从DB读取/写入的问题.这是值得关注的吗?我试着四处寻找,但没有运气.
我们还使用Hibernate 4.3.8.Final over MySQL 5和MySQL 5.1.39连接器与Spring 4.1.0.RELEASE.我们正在努力升级到Hibernate 5,看看它是否会消失,但不知道这是否重要.
我有一个 docker-compose 设置来启动我的 SpringBoot 应用程序和一个 MySQL 数据库。如果数据库先启动,那么我的应用程序可以成功连接。但是如果我的应用程序先启动,还没有数据库存在,所以应用程序抛出以下异常并退出:
app_1 | 2018-05-27 14:15:03.415 INFO 1 --- [ main]
com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
app_1 | 2018-05-27 14:15:06.770 ERROR 1 --- [ main]
com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization
app_1 | com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
Communications link failure
Run Code Online (Sandbox Code Playgroud)
我可以编辑我的 docker-compose 文件以确保在应用程序启动之前数据库始终处于启动状态,但我希望应用程序能够自己处理这种情况,而不是在无法到达数据库地址时立即退出。
有多种方法可以在 application.properties 文件中配置数据源,以使应用程序重新连接到数据库,如此处和此处所述。但这不适用于到数据源的启动连接。
如何让我的 SpringBoot 应用程序在启动时以给定的时间间隔重试连接到数据库,直到它成功连接到数据库?
我已将我的应用程序推送到cloudfoundry.但是每次我连接到我的postgresql/elephant sql时都会收到此错误
Driver org.postgresql.Driver claims to not accept JDBC URL jdbc:postgres://cwkqmdql:SsVqwdLxQObgaJAYu68O-8gTY1VmS9LX@pellefant.db.elephantsql.com:5432/cwkqmdql/
Run Code Online (Sandbox Code Playgroud)
有什么我错过的吗?
下面的代码块一直在抛出错误.
Timeout after 20000ms of waiting for a connection.","stackTrace":[{"file":"BaseHikariPool.java","line":228,"className":"com.zaxxer.hikari.pool.BaseHikariPool","method":"getConnection"
Run Code Online (Sandbox Code Playgroud)
此外,我的数据库访问看起来太慢,xs.map()的每个元素大约需要1秒.下面,getFutureItem()调用db.run().
xs.map{ x =>
val item: Future[List[Sometype], List(Tables.myRow)] = getFutureItem(x)
Await.valueAfter(item, 100.seconds) match {
case Some(i) => i
case None => println("Timeout getting items after 100 seconds")
}
}
Run Code Online (Sandbox Code Playgroud)
Slick会在每次迭代"x"值时记录此信息:
[akka.actor.default-dispatcher-3] [akka://user/IO-HTTP/listener-0/24] Connection was PeerClosed, awaiting TcpConnection termination...
[akka.actor.default-dispatcher-3] [akka://user/IO-HTTP/listener-0/24] TcpConnection terminated, stopping
[akka.actor.default-dispatcher-3] [akka://system/IO-TCP/selectors/$a/0] New connection accepted
[akka.actor.default-dispatcher-7] [akka://user/IO-HTTP/listener-0/25] Dispatching POST request to http://localhost:8080/progress to handler Actor[akka://system/IO-TCP/selectors/$a/26#-934408297]
Run Code Online (Sandbox Code Playgroud)
我的配置:
"com.zaxxer" % "HikariCP" % "2.3.2"
default_db {
url = ...
user = …Run Code Online (Sandbox Code Playgroud) 我有一个带有 Hibernate 和 Hikari DataSource 的 Spring Boot 项目。如果我有一些注入 SessionFactory 对象的功能来获取会话对象,那么几天后我对与数据库操作相关的任何方法都有这样的例外(只有重新启动才能解决这个问题):
org.springframework.transaction.CannotCreateTransactionException:
Could not open JPA EntityManager for transaction; nested exception is
javax.persistence.PersistenceException:
org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection at
......
Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 -
Connection is not available, request timed out after 30001ms.
Run Code Online (Sandbox Code Playgroud)
似乎手动使用会话会导致此问题。(我有类似的项目,具有相同的配置和功能,但没有注入 SessionFactory 和 Session ......我根本没有这样的问题)
应用程序.yaml :
spring:
jpa:
properties:
hibernate:
dialect : org.hibernate.dialect.PostgreSQLDialect
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
Run Code Online (Sandbox Code Playgroud)
数据源配置
@EnableJpaRepositories("com.my.project.config")
@Configuration
public class DataSourceConfig {
@Inject
private AppProperties properties;
@Bean(name = "dataSource")
public DataSource dataSource() {
AppProperties.DatabaseProperties …Run Code Online (Sandbox Code Playgroud) hikaricp ×10
spring-boot ×4
hibernate ×3
java ×3
postgresql ×3
spring ×3
jdbc ×2
mysql ×2
jdbctemplate ×1
sbt ×1
scala ×1
slick ×1
spring-jdbc ×1