-
关于数据库连接池C3P0的警告问题20
系统在启动的时候c3p0报警告信息“A C3P0Registry mbean is already registered. This probably means that an application using c3p0 was undeployed, but not all PooledDataSources were closed prior to undeployment. This may lead to resource leaks over time. Please take care to close all PooledDataSources.”
请问这是什么问题?
运行境是多个系统访问共同的数据库,每个系统里有自己的连接池c3p0,c3p0的一些参数都是默认参数。其中一个系统重启的时候报以上警告信息。
问题补充:gdfloyd 写道翻译下,不准确不要怪:
c3p0的托管bean已经注册了,意味着应用程序当反部署(取消部署?)的时候,并非所有数据源都在取消部署时关闭。时间一长,这会导致资源泄漏。请注意关闭所有连接池~~~~~
用spring管理的话,服务器关闭会自动释放db连接
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
</bean>
连接池是spring来管理的,不过忘记加destroy-method="close",但是tomcat在关闭的时候数据库中检测到链接已经断开。
问题补充:警告原因已找到。当一个tomcat下启动两个或两个以上使用了C3P0的系统时,就会出现以上警告信息。
有源代码可以看出问题(attemptManageC3P0Registry方法),也就是c3p0的托管bean已经注册l,再次注册的时候就会警告。/* * Distributed as part of c3p0 v.0.9.1.2 * * Copyright (C) 2005 Machinery For Change, Inc. * * Author: Steve Waldman <swaldman@mchange.com> * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1, as * published by the Free Software Foundation. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this software; see the file LICENSE. If not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ package com.mchange.v2.c3p0.management; import java.lang.management.*; import javax.management.*; import com.mchange.v2.log.*; import com.mchange.v2.c3p0.*; public class ActiveManagementCoordinator implements ManagementCoordinator { private final static String C3P0_REGISTRY_NAME = "com.mchange.v2.c3p0:type=C3P0Registry"; //MT: thread-safe final static MLogger logger = MLog.getLogger( ActiveManagementCoordinator.class ); MBeanServer mbs; public ActiveManagementCoordinator() throws Exception { this.mbs = ManagementFactory.getPlatformMBeanServer(); } public void attemptManageC3P0Registry() { try { ObjectName name = new ObjectName(C3P0_REGISTRY_NAME ); C3P0RegistryManager mbean = new C3P0RegistryManager(); if (mbs.isRegistered(name)) { if (logger.isLoggable(MLevel.WARNING)) { logger.warning("A C3P0Registry mbean is already registered. " + "This probably means that an application using c3p0 was undeployed, " + "but not all PooledDataSources were closed prior to undeployment. " + "This may lead to resource leaks over time. Please take care to close " + "all PooledDataSources."); } mbs.unregisterMBean(name); } mbs.registerMBean(mbean, name); } catch (Exception e) { if ( logger.isLoggable( MLevel.WARNING ) ) logger.log( MLevel.WARNING, "Failed to set up C3P0RegistryManager mBean. " + "[c3p0 will still function normally, but management via JMX may not be possible.]", e); } } public void attemptUnmanageC3P0Registry() { try { ObjectName name = new ObjectName(C3P0_REGISTRY_NAME ); if (mbs.isRegistered(name)) { mbs.unregisterMBean(name); if (logger.isLoggable(MLevel.FINER)) logger.log(MLevel.FINER, "C3P0Registry mbean unregistered."); } else if (logger.isLoggable(MLevel.FINE)) logger.fine("The C3P0Registry mbean was not found in the registry, so could not be unregistered."); } catch (Exception e) { if ( logger.isLoggable( MLevel.WARNING ) ) logger.log( MLevel.WARNING, "An Exception occurred while trying to unregister the C3P0RegistryManager mBean." + e); } } public void attemptManagePooledDataSource(PooledDataSource pds) { String name = getPdsObjectNameStr( pds ); try { //PooledDataSourceManager mbean = new PooledDataSourceManager( pds ); //mbs.registerMBean(mbean, ObjectName.getInstance(name)); //if (logger.isLoggable(MLevel.FINER)) // logger.log(MLevel.FINER, "MBean: " + name + " registered."); // DynamicPooledDataSourceManagerMBean registers itself on construction (and logs its own registration) DynamicPooledDataSourceManagerMBean mbean = new DynamicPooledDataSourceManagerMBean( pds, name, mbs ); } catch (Exception e) { if ( logger.isLoggable( MLevel.WARNING ) ) logger.log( MLevel.WARNING, "Failed to set up a PooledDataSourceManager mBean. [" + name + "] " + "[c3p0 will still functioning normally, but management via JMX may not be possible.]", e); } } public void attemptUnmanagePooledDataSource(PooledDataSource pds) { String nameStr = getPdsObjectNameStr( pds ); try { ObjectName name = new ObjectName( nameStr ); if (mbs.isRegistered(name)) { mbs.unregisterMBean(name); if (logger.isLoggable(MLevel.FINER)) logger.log(MLevel.FINER, "MBean: " + nameStr + " unregistered."); } else if (logger.isLoggable(MLevel.FINE)) logger.fine("The mbean " + nameStr + " was not found in the registry, so could not be unregistered."); } catch (Exception e) { if ( logger.isLoggable( MLevel.WARNING ) ) logger.log( MLevel.WARNING, "An Exception occurred while unregistering mBean. [" + nameStr + "] " + e); } } private String getPdsObjectNameStr(PooledDataSource pds) { return "com.mchange.v2.c3p0:type=PooledDataSource[" + pds.getIdentityToken() + "]"; } }
2010年3月11日 13:01
4个答案 按时间排序 按投票排序
-
好像是参数问题,看看下面的配置能解决不
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${dataSource.driverClassName}" /> <property name="jdbcUrl" value="${dataSource.url}" /> <property name="user" value="${dataSource.username}" /> <property name="password" value="${dataSource.password}" /> <!--连接池中保留的最小连接数。--> <property name="minPoolSize" value="1" /> <!--连接池中保留的最大连接数。Default: 15 --> <property name="maxPoolSize" value="30" /> <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize" value="2" /> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement" value="2" /> <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="1800" /> <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0--> <property name="maxStatements" value="0" /> <!--每1800秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod" value="1800" /> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAttempts" value="30" /> <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false--> <property name="breakAfterAcquireFailure" value="true" /> <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。Default: false --> <property name="testConnectionOnCheckout" value="false " /> <!--连接关闭时默认将所有未提交的操作回滚。Default: false --> <property name="autoCommitOnClose" value="true"></property> </bean>
2010年3月12日 13:46
-
引用
连接池是spring来管理的,不过忘记加destroy-method="close",但是tomcat在关闭的时候数据库中检测到链接已经断开。
我想:
关闭时没有调用释放资源的方法,万一那时候还有连接处于活动状态,可能就资源泄漏,如警告的说2010年3月12日 12:33
-
翻译下,不准确不要怪:
c3p0的托管bean已经注册了,意味着应用程序当反部署(取消部署?)的时候,并非所有数据源都在取消部署时关闭。时间一长,这会导致资源泄漏。请注意关闭所有连接池~~~~~
用spring管理的话,服务器关闭会自动释放db连接
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
</bean>
2010年3月11日 17:58
相关推荐
在Java开发中,数据库连接管理是一项重要的任务,它涉及到资源的有效...C3P0连接池提供了自动管理数据库连接的能力,避免了频繁创建和关闭连接的开销,而log4j则帮助我们在开发和维护过程中更好地理解程序的运行状态。
总结来说,C3P0是一个强大的数据库连接池工具,它提供了丰富的配置选项和自动管理功能,使得在Java应用中管理数据库连接变得更加便捷和高效。理解并正确使用C3P0,能够极大地优化数据库访问性能,提高系统的可伸缩性...
### DBCP数据库连接池详解 #### 一、概述 **DBCP**(Database Connection Pool)是一种用于管理数据库连接的开源工具包,它属于Apache Commons Pool的一部分。DBCP通过复用预建立的数据库连接来提高应用程序的性能。...
在Java开发中,常用的数据库连接池工具有C3P0、DBCP、HikariCP等,每个都有其特点和适用场景。例如,C3P0以其丰富的配置选项和良好的兼容性著称,而HikariCP则以其极快的性能和低资源占用受到青睐。 综上所述,这个...
数据连接池,如Apache的Commons DBCP、C3P0或HikariCP,它们预先创建一定数量的数据库连接,并存储在一个“池”中。当应用需要连接数据库时,可以从池中获取一个已经存在的连接,用完后不是立即关闭,而是归还到池中...
在SQL Server 2000中,如果使用`c3p0`作为数据库连接池,可能会遇到警告问题。`c3p0`是一个流行的开源Java连接池,它提供了数据库连接的自动管理,包括连接的创建、释放和维护。然而,`c3p0`在特定配置或特定数据库...
因此,项目可能采用了数据库连接池技术,如C3P0、HikariCP或Druid,以复用数据库连接,提高性能和效率。 7. **异常处理**:在处理网络通信和数据库操作时,可能会遇到各种异常,如网络中断、数据格式错误或数据库...
在实际项目中,为了提高性能和减少资源消耗,通常会使用连接池(如C3P0、HikariCP、DBCP等)来管理数据库连接。 8. **异常处理**: JDBC操作中可能会出现SQLException,应该适当地捕获和处理这些异常,以确保程序...
在生产环境中,使用连接池如HikariCP、C3P0或Apache DBCP可以提高性能和资源管理。配置不当可能导致连接泄漏或性能瓶颈。 9. **权限和认证问题**: 提供错误的用户名、密码,或者数据库权限不足,都会导致连接...
C3P0 是一个开源的JDBC连接池,它为数据库连接提供了高效的管理。在高并发的Web应用中,如登录系统,连接池能有效地管理数据库连接,避免频繁创建和销毁连接带来的性能开销。C3P0 提供了自动测试、空闲连接检测和...
这通常通过数据库连接池实现,例如Apache的DBCP或C3P0,它们能自动检测数据库类型并加载对应的JDBC驱动。系统会根据配置信息(如URL、用户名、密码)来识别并连接到相应的数据库。 接着,注册驱动是连接数据库的...
4. **连接池支持**:与常见的Java连接池库如C3P0、HikariCP、Apache DBCP等集成,有效管理数据库连接,提高资源利用率。 5. **零配置连接**:使用“jdbc:mysql://<hostname>:<port>/”格式的URL,可以实现无配置...
- 数据库连接池配置优化:在Java的DBCP或C3P0等连接池中,调整`testWhileIdle`为`false`,`minIdle`为5,`maxAge`为30000,`initialSize`为1,`timeBetweenEvictionRunsMillis`为5000。这确保连接池始终有5个空闲...
6. **连接池支持**:可以与各种流行的Java连接池(如C3P0、Apache DBCP、HikariCP等)配合使用,优化数据库连接的创建和管理,提升系统性能。 7. **SSL加密**:支持通过安全套接层(SSL)进行加密通信,增强数据库...
4. **连接池支持**:与流行的 Java 连接池如 C3P0、HikariCP、Apache DBCP 等无缝集成,提供更高效和稳定的数据库连接管理。 5. **多线程支持**:在多线程环境中,MySQL Connector/J 可以处理并发的数据库请求,...
6. **连接池支持**:可与流行的Java连接池组件如C3P0、DBCP、HikariCP等配合使用,提高数据库资源的复用率。 7. **支持JTA(Java Transaction API)**:使得在分布式环境中进行事务处理成为可能。 8. **支持XA事务...
1. **连接管理**:提供多种连接池策略,如C3P0和DBCP,帮助管理和复用数据库连接,减少资源消耗。 2. **自动重连**:在网络故障或其他异常情况下,能够自动检测并尝试重新建立与数据库的连接,保持应用的连续性。 3....
- 对于大型生产环境,应考虑使用连接池管理数据库连接,如C3P0、HikariCP等。 - 正确处理数据库连接关闭,避免资源泄露。 7. **安全性**: 尽管5.1.46是一个稳定版本,但随着MySQL版本的更新,新版本的驱动可能...
5. 根据应用程序的需求,选择合适的连接池实现,如C3P0、Apache DBCP或HikariCP。 总结来说,SQL Server 2005、2008和MySQL 5.1.7的JDBC驱动包为Java开发者提供了与数据库进行交互的桥梁,通过标准的JDBC接口,可以...
2. **连接池支持**:为了提高性能和资源管理,Connector/J支持连接池,如C3P0、HikariCP或Apache DBCP等,这可以有效地复用数据库连接,减少创建和关闭连接的开销。 3. **事务处理**:支持JDBC的事务特性,包括读未...