我在JBoss战中使用Hibernate,使用c3p0进行连接池,都在我的类路径中的hibernate.cfg.xml配置文件中配置
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
我见过server.log生成的行包含有关连接池的有趣信息:
DEBUG [com.mchange.v2.resourcepool.BasicResourcePool] trace com.mchange.v2.resourcepool.BasicResourcePool@63f5e4b6 [managed:10,unused:9,excluded:0]
对于我的监控池(我正在使用nagios),我想提供一个JSP,告诉我们正在使用多少个连接以及有多少个是免费的,就像日志文件所说的那样.
如何询问c3p0有多少托管和未使用的连接?
我最近遇到了这个连接池实现.
http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html
我觉得很有意思.
有没有人试过这个?我认为它看起来很棒,除了它不支持自动重试和语句缓存,如c3p0.
有没有人知道它与c3p0相比如何?
直到现在我使用了c3p0,但我发现它在多线程环境中的连接处理存在问题.与应用程序线程数相比,它打开了太多连接.
谢谢.
我正在使用c3p0 - ComboPooledDataSource.我正在初始化一次,如下所示.
private void init() {
cpds = new ComboPooledDataSource();
cpds.setDriverClass(driverName);
cpds.setJdbcUrl(url);
cpds.setUser(userName);
cpds.setPassword(pwd);
}
Run Code Online (Sandbox Code Playgroud)
我从池中获得如下连接
public synchronized Connection getLocalConnection(String ipAddr)
throws SQLException {
return cpds.getConnection();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我完成执行查询时,我不确定它是否是将连接返回池的正确方法.我想是的
conn.close()
Run Code Online (Sandbox Code Playgroud)
只是将连接返回到池而不是真正关闭连接.我是正确的还是有其他方法吗?请帮忙.
我们正在使用JPA2.0和Hibernate3.0实现Web应用程序.连接池配置在位于META-INF文件夹中的persistence.xml中设置.
persistence.xml中:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="MyPU" transaction-type="RESOURCE_LOCAL">
<!-- Entity Classes-->
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="bytecode.provider" value="org.hibernate.bytecode.javassist.BytecodeProviderImpl"/>
<property name="hibernate.connection.username" value="{username}"/>
<property name="hibernate.connection.password" value="{password}"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.connection.url" value="{jdbc url}"/>
<property name="hibernate.c3p0.min_size" value="1"/>
<property name="hibernate.c3p0.timeout" value="1000"/>
<property name="hibernate.c3p0.acquire_increment" value="1"/>
<property name="hibernate.c3p0.idle_test_periods" value="600"/>
<property name="hibernate.c3p0.testConnectionOnCheckin" value="true"/>
<property name="hibernate.c3p0.preferredTestQuery" value="SELECT 1;"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
我们遇到连接池配置问题.似乎配置没有效果,连接将在8小时后中断.我们需要另一个配置文件,如hibernate.cfg.xml或hibernate.properties吗?
欢迎任何帮助.
我的hibernate.cfg.xml
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="show_sql">true</property>
<property name="connection.url">jdbc:postgresql://localhost:5432/pirates</property>
<property name="connection.username">postgres</property>
<property name="connection.password">mmm888</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="show_sql">false</property>
<property name="hbm2ddl.auto">update</property>
<property name="current_session_context_class">thread</property>
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">200</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.generate_statistics">true</property>
Run Code Online (Sandbox Code Playgroud)
我的图书馆:
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.10.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-validator-4.2.0.Final.jar
jbossjta-4.16.4.Final.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
openjdk-6-b14.jar
validation-api-1.0.0.GA.jar
hibernate-c3p0-4.1.10.Final.jar
Run Code Online (Sandbox Code Playgroud)
和我的错误:
29.04.2013 14:02:43 org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator getConfiguredConnectionProviderName
WARN: HHH000208: org.hibernate.connection.C3P0ConnectionProvider has been deprecated in favor of org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider; that provider will be used instead.
29.04.2013 14:02:43 org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator instantiateExplicitConnectionProvider
INFO: HHH000130: Instantiating explicit connection provider: org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
Failed to create sessionFactory …Run Code Online (Sandbox Code Playgroud) 我在Tomcat日志中不断收到此异常:
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1201fd18 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@408f3be4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7ba516d8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@137efe53
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@766b0524
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
java.lang.Thread.sleep(Native Method)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
java.lang.Thread.sleep(Native Method)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
java.lang.Thread.sleep(Native Method)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Run Code Online (Sandbox Code Playgroud)
我正在使用Hibernate 3.6.2和C3P0 0.9.1.2与MySQL.经过几个小时的Google搜索,这个APPARENT DEADLOCK异常似乎通常与准备好的语句缓存相关联.这是我的hibernate.cfg.xml中的C3P0配置:
<propertyname="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">60</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.timeout">180</property>
<property name="hibernate.c3p0.max_statements">0</property>
Run Code Online (Sandbox Code Playgroud)
我没有做任何声明缓存.任何有关错误的提示将不胜感激.
我想配置我的c3p0连接池,以便至少有2个连接始终处于活动状态,最多5个,并且超过前2个的空闲连接将在合理的时间内(比如一小时)到期.
除了文档似乎暗示有职能部门之间没有区别这一切听起来简单maxIdleTime且maxIdleTimeExcessConnections,这是混淆了我.
基本池配置状态:
在minPoolSize和maxPoolSize之间的范围内,池中的连接数根据使用模式而有所不同.每当用户请求连接,没有可用的连接,并且池中尚未达到管理的Connections数量的maxPoolSize时,连接数就会增加.由于连接获取速度非常慢,因此在批量生成中急切地增加连接数量几乎总是有用的,而不是强迫每个客户端等待新连接在负载增加时引发单个获取.acquireIncrement确定当池用完连接时c3p0池将尝试获取的连接数.(无论acquireIncrement如何,池都不会允许超出maxPoolSize.)
和minPoolSize用法:
池在任何给定时间将保持的最小连接数.
好,太棒了.并且用于配置连接时间:
maxIdleTimeExcessConnections用于在池未加载时最小化c3p0池所持有的Connections数.默认情况下,c3p0池在负载下增长,但只有在Connections通过Connection测试失败或通过上述参数过期时才会收缩.一些用户希望他们的池在强制使用大量池大小的使用高峰后快速释放不必要的连接.您可以通过将maxIdleTimeExcessConnections设置为比maxIdleTime短得多的值来实现此目的,如果它们闲置超过一小段时间,则会强制释放超出设置的最小大小的连接.
所以它暗示minPoolSize只有在与之结合使用时才有意义maxIdleTimeExcessConnections,否则,它将完全被忽略.
证实文件maxIdleTime没有提及minPoolSize:
秒可以在丢弃之前保持连接但未使用.零意味着空闲连接永不过期.
而且maxIdleTimeExcessConnections是有道理的:
在剔除之前,应允许超过minPoolSize的连接在池中保持空闲的秒数.适用于希望积极减少打开连接数的应用程序,如果在峰值之后,负载级别减少并且不再需要连接,则将池缩回minPoolSize.如果设置了maxIdleTime,则如果参数有效,则maxIdleTimeExcessConnections应该更小.零意味着没有强制执行,多余的连接不会被闲置.
我觉得很奇怪minPoolSize,一个基本功能,只有在我看来是一个更高级的功能时使用才有意义.这都是正确的吗?
我最近在日志中收到以下消息,然后是JVM崩溃(由于OOME).我不知道该怎么做,并且非常感谢任何指导.
2015-03-19 21:15:02,457 [Timer-0] WARN (ThreadPoolAsynchronousRunner.java [run]:608) - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@6824f21c -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
2015-03-19 21:26:29,543 [Timer-0] WARN (ThreadPoolAsynchronousRunner.java [run]:624) - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@6824f21c -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@15da1b6b (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@b35b08a (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@51cfdd17 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@19397937
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@5c7d3838
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7aea62dd
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@55622ff2
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@74004a8
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:560)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
java.net.SocketOutputStream.socketWrite0(Native Method)
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
java.net.SocketOutputStream.write(SocketOutputStream.java:153)
java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3227)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
com.mysql.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.java:1751)
com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3425)
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2196)
com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
sun.reflect.GeneratedConstructorAccessor306.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:408)
com.mysql.jdbc.Util.handleNewInstance(Util.java:406) …Run Code Online (Sandbox Code Playgroud) 我正在使用Hibernate 4,PostgreSQL和C3P0.
在我的Web应用程序中,经过一段时间后,我SHOW TRANSACTION ISOLATION LEVEL在数据库中收到多个查询,因为我的服务器挂起了.在我的代码中,我的所有连接都已正确关闭.
是否由于连接泄漏?
我正在使用c3p0作为我的连接池运行Spring/Hibernate连接到MySQL设置.由于某些奇怪的原因,当系统处于负载状态时(当然)它会耗尽连接.
在我们开始达到新的流量水平(超过一百个并发用户)之前,该网站非常稳定.此时DB会熔化(固定CPU).我的第一个动作是在应用程序中通过广泛的缓存和查询优化等来提高性能.
现在它将间歇性地耗尽连接.它似乎甚至不依赖于负载.更多准时,这让我觉得这是一个泄漏,但对于我的生活,我无法弄清楚它将来自何处.
WARN [2011-03-07 17:19:42,409] [TP-Processor38] (JDBCExceptionReporter.java:100) - SQL Error: 0, SQLState: null
ERROR [2011-03-07 17:19:42,409] [TP-Processor38] (JDBCExceptionReporter.java:101) - An attempt by a client to checkout a Connection has timed out.
ERROR [2011-03-07 17:19:42,410] [TP-Processor38] (HttpHeadFilter.java:46) - There was a problem passing thru filter:/is-this-guy-crazy-or-just-a-huge-dancing-with-the-stars-fan
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: could not execute query
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:659)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
Caused by: java.sql.SQLException: An attempt by a …Run Code Online (Sandbox Code Playgroud)