- 浏览: 49750 次
文章分类
最新评论
最近在看C3P0的原理,还是将C3P0的源码导入到Ecplise中debug看得清楚多了。下面记录我debug的经历。
1. 下载c3p0的jar和源码,这个百度吧。
2. 导入jar和源码到java工程中,导入后,会发现有些错误的,把junit的类去掉,有的提示没有实现一些方法,就加进去,还有的提示要删除多余的实现方法,就删除掉吧,这样下来,基本上不报错了。
3. debug的过程中,有些类没有源码的,到google上去搜,会有源码的,写一个对应的java类加进工程里去就行了。
1. 写一个连接池的简单的工具类
2. 现在需要debug的代码是
首先进入的是AbstractPoolBackedDataSource中的getConnection方法
其中:getPoolManager().getPool()是获取连接池,它对应的类是C3P0PooledConnectionPoolManager,它管理着连接池的生命周期。
C3P0PooledConnectionPoolManager中有一个内部类PooledConnectionResourcePoolManager,它里面会创建BasicResourcePool,BasicResourcePool才是真正创建连接的地方。
会调用里面的私有方法。
继续跟踪expandPool()方法,这里的expand_count 是初始值10.
进入到AcquireTask()方法里看到如下的代码。
acquireResource()方法会调用一个内部类PooledConnectionResourcePoolManager,它会调用下面的代码。
上面的代码调用下面的代码
至此,初始化的10个连接完成了。
1. 下载c3p0的jar和源码,这个百度吧。
2. 导入jar和源码到java工程中,导入后,会发现有些错误的,把junit的类去掉,有的提示没有实现一些方法,就加进去,还有的提示要删除多余的实现方法,就删除掉吧,这样下来,基本上不报错了。
3. debug的过程中,有些类没有源码的,到google上去搜,会有源码的,写一个对应的java类加进工程里去就行了。
1. 写一个连接池的简单的工具类
public class ConnectionPool { private static ComboPooledDataSource ds; public synchronized static final Connection getConnection() { try { if (ds != null) { return ds.getConnection(); } else{ ds = new ComboPooledDataSource(true); ds.setJdbcUrl("jdbc:mysql://192.168.1.102:3306/S10"); try { ds.setDriverClass("com.mysql.jdbc.Driver"); } catch (PropertyVetoException e) { // TODO Auto-generated catch block e.printStackTrace(); } ds.setUser("root"); ds.setPassword("123456"); ds.setInitialPoolSize(10); ds.setMinPoolSize(10); ds.setMaxPoolSize(20); ds.setMaxIdleTime(30); return ds.getConnection(); } } catch (SQLException e) { e.printStackTrace(); } return null; } }
2. 现在需要debug的代码是
ds.getConnection(),看看它的执行顺序吧。
首先进入的是AbstractPoolBackedDataSource中的getConnection方法
pc = getPoolManager().getPool().checkoutPooledConnection(); return pc.getConnection();
其中:getPoolManager().getPool()是获取连接池,它对应的类是C3P0PooledConnectionPoolManager,它管理着连接池的生命周期。
C3P0PooledConnectionPoolManager中有一个内部类PooledConnectionResourcePoolManager,它里面会创建BasicResourcePool,BasicResourcePool才是真正创建连接的地方。
会调用里面的私有方法。
private void _recheckResizePool() { assert Thread.holdsLock(this); if (! broken) { int msz = managed.size(); int shrink_count; int expand_count; if ((shrink_count = msz - pending_removes - target_pool_size) > 0) shrinkPool( shrink_count ); else if ((expand_count = target_pool_size - (msz + pending_acquires)) > 0) expandPool( expand_count ); } }
继续跟踪expandPool()方法,这里的expand_count 是初始值10.
private void expandPool(int count) { assert Thread.holdsLock(this); // XXX: temporary switch -- assuming no problems appear, we'll get rid of AcquireTask // in favor of ScatteredAcquireTask if ( USE_SCATTERED_ACQUIRE_TASK ) { for (int i = 0; i < count; ++i) taskRunner.postRunnable( new ScatteredAcquireTask() ); } else { for (int i = 0; i < count; ++i) taskRunner.postRunnable( new AcquireTask() ); } }
进入到AcquireTask()方法里看到如下的代码。
BasicResourcePool.this.doAcquire(); Object resc = mgr.acquireResource();
acquireResource()方法会调用一个内部类PooledConnectionResourcePoolManager,它会调用下面的代码。
if ( connectionCustomizer == null) { out = (auth.equals( C3P0ImplUtils.NULL_AUTH ) ? cpds.getPooledConnection() : cpds.getPooledConnection( auth.getUser(), auth.getPassword() ) ); }
上面的代码调用下面的代码
protected PooledConnection getPooledConnection(String user, String password, ConnectionCustomizer cc, String pdsIdt) throws SQLException { // 它里面包含jdbcUrl等信息 DataSource nds = getNestedDataSource(); if (nds == null) throw new SQLException( "No standard DataSource has been set beneath this wrapper! [ nestedDataSource == null ]"); // 这里的代码调用是在DriverManagerDataSource中实现的 Connection conn = nds.getConnection(user, password); if (conn == null) throw new SQLException("An (unpooled) DataSource returned null from its getConnection() method! " + "DataSource: " + getNestedDataSource()); if ( this.isUsesTraditionalReflectiveProxies() ) { //return new C3P0PooledConnection( new com.mchange.v2.c3p0.test.CloseReportingConnection( conn ), return new C3P0PooledConnection( conn, connectionTester, this.isAutoCommitOnClose(), this.isForceIgnoreUnresolvedTransactions(), cc, pdsIdt); } else { return new NewPooledConnection( conn, connectionTester, this.isAutoCommitOnClose(), this.isForceIgnoreUnresolvedTransactions(), this.getPreferredTestQuery(), cc, pdsIdt); } }
public Connection getConnection(String username, String password) throws SQLException { ensureDriverLoaded(); // 这才是真实的物理连接啊 Connection out = driver().connect( jdbcUrl, overrideProps(username, password) ); if (out == null) throw new SQLException("Apparently, jdbc URL '" + jdbcUrl + "' is not valid for the underlying " + "driver [" + driver() + "]."); return out; }
至此,初始化的10个连接完成了。
发表评论
-
Java IO 读文件的各种方法总结
2016-01-01 15:00 662IO分为字节流和字符流,字符就是简单的字符串存储,从理伦上讲, ... -
动态代理的应用
2015-12-22 17:30 689代理模式作为开发人员 ... -
Java Restful
2015-12-19 14:01 393对于两个系统之间交互信息,有两种常见的方式:webservic ... -
request.getInputStream() 只能读一次的解决方法
2015-12-17 12:17 2290我们知道request.getInputStream()只能读 ... -
java Hessian 版本冲突问题解决方法
2015-12-11 19:44 818今天在实际的项目发现了一个问题就是hessian的版本不兼容的 ... -
ThreadPoolExecutor参数讲解
2015-12-10 08:14 7751. 线程池可以节省创建多个线程带来的开销问题。 2. 线程 ... -
Java RSA 加密 解密 签名 验签
2015-12-09 10:01 58641. 加密的作用 1)明文变密文(你不知道密钥是很难解密的) ... -
Java Xstream xml 与bean之间的转换
2015-12-09 08:31 691xml文件如下: <mvc> & ... -
XPATH 解析XML
2015-12-09 08:28 3961. 表达式描述 nodename 选取此节点的所有子节 ... -
Java Dom4j 解析XML
2015-12-09 08:23 326Dom4j和JDom是很相似的,用起来十分方便。 XML文件 ... -
Java JDom 解析xml
2015-12-09 08:22 359JDOM在解析XML在代码量之上比之前的方法(DOM和SAX要 ... -
Java SAX 解析xml
2015-12-08 18:13 360在上一篇中http://gaofulai1988.iteye. ... -
Java XML解析系列
2015-12-08 18:00 678Java解析XML有多种方式,因此需要分为几个不同的系列来讲。 ... -
Java 背包算法计算从数组中找若干个数使其最接近某个数
2015-12-08 17:38 1931背包的算法的动态方式如下: f(i,w) = max{ f(i ... -
微信开发的原理
2015-11-30 10:10 1275微信在现在的生活中,扮演着举足轻重的角色,现在怎么东西都在微信 ... -
JAVA Timestamp 与Data的转化以及BigDecimal 保留两位小数
2015-11-27 14:47 15941. BigDecimal 保留两位小数 今天在项目中遇到这 ... -
java try catch finally return 继续
2015-11-27 13:45 360之前在博客中有一篇文章讨论过异常中return值的情况,有兴趣 ... -
Java JDBC executeBatch 批量操作
2015-11-27 08:05 1545对JDBC 的 CRUD操作,我相信对于每个开发人员来讲,是十 ... -
Java WeakHashMap 分析
2015-11-26 08:17 576昨天在我们的系统中看 ... -
加密与解密
2015-11-18 18:12 438我本身不是学密码出身的,但在工作中经常要使用加密与解密的东东, ...
相关推荐
本文将包含以下内容(因为篇幅范围,可根据需要选择阅读): c3p0的使用方法(入门案例, JDNI使用) c3p0的配置参数详解c3p0主要源码分析使用示例-入门需求使用C3P0连接池获取连接对象,对用户数据进行简单的增删改...
超越(或相当)了c3p0.建议使用DBCP1.4或1.3 + commons pool 1.6 Tomcat7 中保留DBCP连接池,以兼容已有应用。并提供了新的Tomcat JDBC pool作为DBCP的可选替代。新出的Tomcat JDBC pool,据说比DBCP 1.4要好,未...
Spring+IbatIS项目,在案例项目中不只是对CURD的操作,主要是在配置文件中介绍了怎么配置链接迟,这个项目使用的是C3P0连接池,相应的还有.txt文件分析。部署到eclipse或者是myeclipse中修改jdbc.properties文件就...
客户管理案例 1.目的:总结JDBC,和Servlet JSP结合到一起。 2.开发中的一些小技巧。 3.客户管理平台功能 * 添加客户 * 查询所有的客户的信息 * 修改客户信息 ... * c3p0连接池 * c3p0-0.9.1.2.jar
2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持...
2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持...
结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。Druid 是一个分布式的、支持实时多维 OLAP 分析的数据处理系统。它既支持高速的数据实时摄入处理,也支持实时且灵活的多维数据分析查询。 Druid已经在阿里...
3) servlet、c3p0连接池、MySQL数据库的应用 4) TextRank4Keyword 自然语言处理关键词提取 5) ThreadPool 线程池 6) jsonp 爬虫 7) Mail IMAP协议 8)pdfbox PDF2String 9)poi 生成...
代码设计风格基于RESTful,以c3p0作为连接池,Redis数据库为媒介实现高并发技术。其中,对于相关的DAO,Service操作,均添加了Junit单元测试实例。 开发文档 一、业务分析 1.秒杀系统业务流程 2.秒杀业务的核心...
2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持...
2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持...
采用的主要技术栈是: jsp + servlet + Mysql,其中包括 jsp 的三大组件,c3p0 连接池,等技术,运用的开发环境时 Idea9 + Mysql8.0。 ## 二、相关技术: [1、三层架构设计思想]...
c3p0-0.9.1.jar 是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。如果准备用这个连接池,就需要这个jar包. dom4j-1.6.1.jar 用来读写XML文件的 ehcache-1.5.0.jar ehcache缓存 hibernate3.jar hibernate-...
1 0 X 1 1 0 0 0 0 0 0 0 0 0 消隐 1 0 X 1 1 0 1 0 0 0 0 0 0 0 消隐 1 0 X 1 1 1 0 0 0 0 0 0 0 0 消隐 1 0 X 1 1 1 1 0 0 0 0 0 0 0 消隐 0 0 X X X X X 锁存 锁存* 3.1.5 显示电路 显示电路主要共阴LED显示。到...
28_qq消息通信-群聊-手动刷新好友列表-下线通知0 P+ D" ]/ f. q* O! d9 Z& L 29_qq消息通信-群聊-私聊消息' a3 S6 a2 d+ Y6 s( Z 30_qq消息通信-群聊-私聊消息2 31_虚拟机内存结构-反射 32_虚拟机内存结构-JVM-$ j; ...
代码设计风格基于RESTful,以c3p0作为连接池,Redis数据库为中介实现高并发技术。其中,有关的DAO,服务操作,均添加了Junit单元测试实例。 开发文档 一,业务分析 1.秒杀系统业务流程 2.秒杀业务的核心:库存的...
分片JDBC-分片数据库和表的JDBC驱动程序 概述 分片JDBC是JDBC的扩展... 支持DBCP,C3P0,BoneCP,Druid。 理论上,任何数据库都支持。 支持MySQL,Oracle,SQLServer和PostgreSQL。 5.配置 Java配置 Spring命名空间 Y
研究表明:P-WSPI1-S组分由木糖和阿拉伯糖两种糖组成,两者的摩尔比为0.98,相对分子质量为831030,其可能的结构为:D-吡喃木糖以β(1→4)连接为木聚糖主链,侧链为α-呋喃阿拉伯糖,D-吡喃木糖残基可在C-2、C3位...
c3p0连接池 集成开发环境:Idea 2019 web容器:Tomcat 9 需求分析 普通用户: 用户注册:用户进入注册页面,输入相关信息并点击注册,系统将账号信息存入数据库。 用户登录:用户输入用户名和密码,若账号存在则登录...
单片机允许的振荡晶体可在 1.2~24MHz之间选择,一般为 11.0592MHz,电容 C2,C3的取值对振荡频率输出的稳定性、 大小及振荡电路起振速度有一定的影响, 可在20~100pF之间选择,典型值位 30pF (2)计算机每次开始...