怎么理解mybatis,mybatis百度百科

  怎么理解mybatis,mybatis百度百科

  

目录

前言PooledConnectionPooledDataSource的pushConnection()方法总结

 

  

前言

上篇爪哇巴蒂斯数据源之工厂模式文章中我们介绍了框架的数据源模块的数据源接口和它对应的实现类取消池化数据源、池化数据源,这篇文章详细介绍一下池化数据源使用了数据库连接池可以实现数据库连接池的重复利用,还能控制连接数据库的连接上限,实现数据库连接的统一管理,缓存数据连接信息还能防止流量突发连接数据库不及时

 

  池化数据源有个池状态状态,池状态里保存着数据库连接信息池化连接,池化连接实现动态代理接口,重写引起方法,显然这是一个代理类,使用了爪哇岛开发工具包的动态代理

  

PooledConnection

类池化的实现调用处理程序{私有静态最终类?[]iface=新类?[]{连接。class };公共池连接(连接Connection,PooledDataSource数据源){ this。hashcode=连接。hashcode();这个。真实连接=连接;这个。数据源=数据源;这个。createdtimestamp=system。当前时间毫秒();这个。上次使用的时间戳=系统。当前时间毫秒();this.valid=truethis。代理连接=(连接)代理。newproxyinstance(连接。班级。getclass loader()、IFACES、this);} @覆盖公共对象调用(对象代理、方法方法、对象[]参数)抛出Throwable { String方法名=方法。getname();如果(关闭。equals(方法名)){数据源。推送连接(这个);返回null}试试{如果(!对象。班级。等于(方法。getdeclaringclass()){检查连接();}返回方法。invoke(真实连接,args);} catch(Throwable t){ throw exception util。不可超越的(t);} }}我们看一看到构造方法中调用了Proxy.newProxyInstance()方法来生成代理类,而重写引起方法中如果是关闭()就调用pushConnection()方法直接把它放入连接池而不是关闭连接,其他情况调用检查连接()检查连接信息,代理类调用realConnection()方法,下面就看一下pushConnection()方法

 

  

PooledDataSource的pushConnection()方法

方法的功能就是把数据库连接放入连接池中:

 

  受保护的无效推动连接(汇集连接连接器)抛出SQLException { synchronized(state){ state。活动连接。移除(连接);if (conn.isValid()) { if

   (state.idleConnections.size() < poolMaximumIdleConnections && conn.getConnectionTypeCode() == expectedConnectionTypeCode) { state.accumulatedCheckoutTime += conn.getCheckoutTime(); if (!conn.getRealConnection().getAutoCommit()) { conn.getRealConnection().rollback(); } PooledConnection newConn = new PooledConnection(conn.getRealConnection(), this); state.idleConnections.add(newConn); newConn.setCreatedTimestamp(conn.getCreatedTimestamp()); newConn.setLastUsedTimestamp(conn.getLastUsedTimestamp()); conn.invalidate(); if (log.isDebugEnabled()) { log.debug("Returned connection " + newConn.getRealHashCode() + " to pool."); } state.notifyAll(); } else { state.accumulatedCheckoutTime += conn.getCheckoutTime(); if (!conn.getRealConnection().getAutoCommit()) { conn.getRealConnection().rollback(); } conn.getRealConnection().close(); if (log.isDebugEnabled()) { log.debug("Closed connection " + conn.getRealHashCode() + "."); } conn.invalidate(); } } else { if (log.isDebugEnabled()) { log.debug("A bad connection (" + conn.getRealHashCode() + ") attempted to return to the pool, discarding connection."); } state.badConnectionCount++; } } }从活跃连接集合中删除该连接如果PooledConnection有效,并且空闲连接数小于最大空闲连接数,就利用当前PooledConnection创建PooledConnection,放入空闲连接数集合中,方便下次使用,关闭当前PooledConnection对象的数据库连接,并对当前PooledConnection对象设置无效,最后唤醒其他等待的线程。如果空闲连接数大于最大空闲连接数了就关闭连接,设置当前连接无效如果PooledConnection无效,badConnectionCount加一,这个badConnectionCount是记录无效的数据库连接信息的

 

  

总结

本篇文章主要介绍了PooledConnection和PooledDataSource的pushConnection()方法,PooledConnection用到了jdk的动态代理,生成Connection的实现类的代理类,拦截的逻辑中对于close()方法没有真正关闭,而是把数据库连接信息放入连接池中供下次再使用,数据库连接信息放入连接池的过程是通过调用PooledDataSource的pushConnection()来完成的,具体就是从活跃连接集合中删除这个连接,然后放入空闲连接数集合中并把当前连接设置为无效。

 

  到此这篇关于详解Mybatis中的PooledDataSource的文章就介绍到这了,更多相关Mybatis PooledDataSource内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: