mybatis3中自带的连接池的问题

想在新项目中使用mybatis,于是这几天在看官方问题。

发现mytatis3中自带的连接池,不知道性能如何?

配置了连接池,为了验证连接池返回的连接是否是同一个连接

把poolMaximumActiveConnections这个属性配置为1,那么连接池中最多只有一个活跃连接了

然后用以下代码验证:

while (true) {
	Scanner sc = new Scanner(System.in);
	String str = sc.nextLine();
	if (str.equals("bye")) {
		break;
	}
	SqlSession session = sqlSessionFactory.openSession();
	System.out.println(System.identityHashCode(session.getConnection()));
	session.close();
}
但是方法,每次输出的值都不一样。疑惑。。。

于是跟踪源代码,发现

通过session.getConnection()这个方法返回的connection对象其实并不是原始的connection

而是个代理对象proxyConnection,它动态代理了那个原始Connection对象realConnection,为的是拦截realConnection的close方法

因为连接池中的连接并不应该去关闭,当调用close方法的时候应该是将此连接放回连接池的空闲队列中。

源码如下:

  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    String methodName = method.getName();
    if (CLOSE.hashCode() == methodName.hashCode() && CLOSE.equals(methodName)) {
      dataSource.pushConnection(this);
      return null;
    } else {
      try {
        if (!Object.class.equals(method.getDeclaringClass())) {
          // issue #579 toString() should never fail
          // throw an SQLException instead of a Runtime
          checkConnection();
        }
        return method.invoke(realConnection, args);
      } catch (Throwable t) {
        throw ExceptionUtil.unwrapThrowable(t);
      }
    }
  }

之后通过调试发现realConnection每次都是同一个,终于验证了想法!


另外:我发现PooledDataSource,也就是使用连接池的数据源其实内部持有了一个UnpooledDataSource的对象

基础的数据源操作(getConnection)和属性(username, password, url........)都在UnpooledDataSource中定义了

PooledDataSource只负责自己那块连接池的逻辑,其余的都交给UnpooledDataSource来处理


  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值