在实际开发中,使用JDBC连接数据库的情况时有出现,在多层结构的应用中,使用DriverManager获取连接时,一个需要连接的操作对应一个数据库物理连接,每一次操作都会重新打开一个连接,在使用完毕后立即关闭。而频繁打开、关闭连接会造成系统及其不稳定,并发操作时经常会出现连接不足甚至是根本无法获取连接的情况。
c3p0连接池很好地解决了这个问题,解决思路是:在应用程序启动时,即建立足够的数据库连接用于待命,并将这些连接存放在池中等待使用。每次其它服务请求数据库连接时,不需要重新打开数据库连接,而是从池中取出已有的连接,使用完毕后,这个连接也不会被关闭,而是重新放入连接池。JDBC2.0引入了数据库连接池技术以解决共享连接问题,使用java.sql.DataSource接口实现,而c3p0是一个开源的实现,商用服务器也提供连接池实现(如WebLogic、WebSphere)。
本文使用一个工具类来读取配置文件,具体代码如下:
package com.any.util; import java.util.ArrayList; import java.util.Enumeration; import java.util.Locale; import java.util.ResourceBundle; /** * @ClassName: ConfigUtil * @author Helen * @date 2015年8月13日 上午10:46:39 */ public class ConfigUtil { private String resourcePath = "com.any.config"; private ResourceBundle bundle; private ArrayList<String> keyList; private ConfigUtil(){ loadFile(); } public static ConfigUtil getInstanceConfig(){ return new ConfigUtil(); } protected void loadFile(){ bundle = ResourceBundle.getBundle(resourcePath, Locale.CHINA); if(bundle!=null){ Enumeration<String> eumObj = bundle.getKeys(); keyList = new ArrayList<String>(); while (eumObj.hasMoreElements()) { keyList.add(eumObj.nextElement()); } } else { System.out.println("Config file not exists!"); System.exit(2); } } private boolean isKeyExists(String key){ return keyList.contains(key); } public String getString(String key){ if(isKeyExists(key)){ return bundle.getString(key); } return null; } public int getInt(String key){ if(isKeyExists(key)){ return Integer.valueOf(bundle.getString(key)); } return 0; } }
该工具类仅用于从properties文件中读取数据,该文件中通常会存放应用系统的常用配置参数:如数据库信息、资源路径信息、国际化资源等。使用C3P0获取连接池的关键代码如下:
package com.any.util; import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; /** * @ClassName: DBPool * @author Helen * @date 2015年8月13日 上午10:19:44 */ public class DBPool { public static Connection getConnection(){ ComboPooledDataSource ds = new ComboPooledDataSource(); ConfigUtil config = ConfigUtil.getInstanceConfig(); try { ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl(config.getString("url")); ds.setUser(config.getString("user")); ds.setPassword(config.getString("password")); ds.setMaxPoolSize(60); ds.setMinPoolSize(3); ds.setInitialPoolSize(10); ds.setMaxStatements(200); return ds.getConnection(); } catch (PropertyVetoException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return null; } }
注意,需要引入C3P0对应版本的jar包,通过设置最大连接数、最小连接数等,即可创建一个连接池,C3P0还能很好地管理连接池,也能自动清理不再使用的Statement和ResultSet。
使用以下代码测试:
package com.any; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.any.util.DBPool; /** * @ClassName: TestPool * @Description: (这里用一句话描述这个类的作用) * @author Helen * @date 2015年8月13日 上午10:30:43 */ public class TestPool { public static void main(String[] args) { Connection conn = DBPool.getConnection(); try { PreparedStatement psmt=conn.prepareStatement("select * from emp"); ResultSet rs = psmt.executeQuery(); while(rs.next()){ System.out.println("result:"+rs.getString("ename")); } } catch (SQLException e) { e.printStackTrace(); } } }
由于引入了日志组件,因此运行时可以看到控制台打印出的如下日志信息:
八月 13, 2015 11:05:48 上午 com.mchange.v2.log.MLog <clinit> INFO: MLog clients using java 1.4+ standard logging. 八月 13, 2015 11:05:48 上午 com.mchange.v2.c3p0.C3P0Registry banner INFO: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10] 八月 13, 2015 11:05:48 上午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1hge48x9ba9sf7i1qnzmj8|4544c134, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge48x9ba9sf7i1qnzmj8|4544c134, idleConnectionTestPeriod -> 0, initialPoolSize -> 10, jdbcUrl -> jdbc:mysql://127.0.0.1:3306/test, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 60, maxStatements -> 200, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ] result:abc
相关推荐
下面我们将详细探讨C3P0连接池的使用以及所需的jar包。 首先,C3P0连接池的主要功能包括: 1. **连接管理**:C3P0可以自动创建、测试、回收和关闭数据库连接,避免了手动管理连接的繁琐工作,降低了系统资源的消耗...
在本教程中,我们将深入探讨“day18 17.c3p0连接池使用”的相关知识点,包括C3P0的基本概念、配置、优势以及如何在实际项目中应用。 首先,理解C3P0的核心功能。C3P0连接池的主要任务是管理和复用数据库连接,避免...
**c3p0连接池使用方法** c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用c3p0连接池可以有效地管理和优化数据库连接,提高系统的性能和稳定性。以下是关于c3p0连接池...
C3P0连接池是Java应用中常用的数据库连接池组件,它允许程序在不关闭物理连接的情况下,管理和重用数据库连接,从而提高了应用程序的性能和效率。C3P0库依赖于其他几个JAR包来实现其功能,包括`c3p0-0.9.2.1.jar`、`...
4. **C3P0使用**: - 添加依赖:在项目中引入C3P0的JAR包,如`lib/c3p0-*.jar`,同时可能需要包含其他的依赖,如`lib/mchange-commons-java-*.jar`。 - 创建数据源:通过`...
1. **连接池管理**:C3P0可以创建并维护一定数量的数据库连接,当应用程序需要时,可以从连接池中获取连接,用完后归还,而不是每次使用都创建新的连接,这大大减少了数据库连接的创建和销毁开销。 2. **自动检测与...
C3P0数据库连接池是Java开发中广泛使用的开源组件,用于管理数据库连接,提高数据库访问效率并降低系统资源消耗。源代码分析可以帮助我们深入理解其内部机制,从而更好地优化和配置C3P0,提升应用程序性能。 1. **...
总之,c3p0连接池是Java应用中管理数据库连接的有效工具,通过合理配置和使用,可以显著提高系统的运行效率和稳定性。在实际开发中,应结合具体项目需求选择合适的连接池,并进行持续监控和优化。
在Java应用中,尤其是在Web应用中,频繁的数据库连接创建和关闭会消耗大量的系统资源,而通过使用C3P0这样的连接池,可以预先配置并创建一定数量的数据库连接,供多个请求共享,从而减少了数据库连接的创建和销毁...
**C3P0连接池配置详解** C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特点是轻量级、高效且稳定,广泛应用于各种Java Web应用中。在本文中,我们将深入探讨...
C3P0数据库连接池和jar包,因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉。而每次新建连接都需要140毫秒左右的时间,所以耗费时间比较多。若使用C3P0连接池来池化...
**c3p0连接池配置使用** c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用c3p0连接池可以有效地管理和优化数据库连接,提高系统的性能和稳定性。下面将详细介绍c3p0的...
`c3p0-0.9.1.2.jar`是C3P0的jar包文件,包含了C3P0的所有类和方法,导入此库后,我们可以在项目中直接使用C3P0连接池。 C3P0的官方开发文档详细介绍了C3P0的配置、使用方法、API接口及常见问题解答,对于开发者来说...
JDBC中C3p0连接池使用方法 (个人总结综合教程,适合新入门的朋友阅读)
c3p0连接池JAR包c3p0连接池JAR包c3p0连接池JAR包c3p0连接池JAR包c3p0连接池JAR包
总之,c3p0作为一款成熟的数据库连接池,通过合理的配置和使用,可以在保证应用性能的同时,有效地管理和维护数据库连接,降低资源消耗。在实际项目中,选择适合的连接池需要综合考虑项目的特性和需求。