发表于: 2018-03-27 19:06:16

1 523


今天完成的事情

 

先完成任务,不关闭数据库连接池的时候,在Main函数里写1000个循环调用会出现什么情况。

我的理解是在使用数据库连接池的情况下,在main函数里循环申请1000次对数据库连接的请求。

找到之前做的用Mybatis连接数据库的工程,根据我的学习,先去看配置文件config.xml这是获得数据源的配置文件

注意箭头所指处就代表已经使用了数据库连接池,说明我之前配置的时候就已经使用了数据库连接池了。

去主函数中写与数据库建立1000次连接,然后发现并没有发生什么,程序就打印了1000次结果,而且速度很快。所以不太确定到底步骤是不是这样做。按理说应该发生什么不可控事件?先当它是这样好啦。还有注意一下这里我是把查询放在了循环中,这是有道理的,因为在网上学习数据库连接池的时候,我知道了真正与数据库连接的操作就是在查询的时候而不是一般人会以为的openSession这个函数。这个函数只是开启了一个会话,并没有真正的与数据库连接,这在多份资料中都有提到。

 

因为数据库连接池是为了提高性能的,所以我也想做个实验看看到底提高了多少。

于是我把type改成UNPOOLED,我本来也是尝试了一下,字面意思就是不使用连接池,结果真的执行成功了,说明的确有这个属性,而且肯定就是不使用连接池的意思吧。

结果发生了意料之外的事,经过多次执行的结果,发现后面的情况比前面执行还快。我想,可能是因为次数太少?于是将次数改多,但也还是后面的快。我想,可能本身我的测试程序就有问题。又想,可能数据库连接池是应用在并发,也就是多线程的情况。于是我试着去创建并发的环境

创建3require类,实现Runnable接口

让这3个线程分别去执行搜索,也就是连接数据库,结果发现还是后面的快。去网上搜了搜好像并没有这样的案例。遂只能暂时把这个问题放一放。数据库连接池肯定是有用的,应该是我这种只是练习用的demo不能很好的反应出来吧。水平有限也就暂时不深究这个问题了。

还有今天在学习的过程当中看到一个不认识的名词“事务回滚”,搜索资料后明白了“事务提交”和“事务回滚”是什么意思。

其实就是一项功能里面有很多步骤,当每一个步骤都正确的执行后,就会“事务提交”,若进行到中间的哪一个步骤出错了,就可以“事务回滚”,回到操作前的状态,防止程序发生不可避免的错误,很好理解。

学习过程中还碰到一种设计模式,代理模式,之前也经常碰到有啥代理代理的。不过之前去看的时候都没怎么弄懂,这次看的时候发现有一篇好博客https://blog.csdn.net/crave_shy/article/details/21000887,例子很好一下就看懂了。不过我暂时只是把静态代理搞清楚了,动态代理要配合上反射的知识,还有点难啃透。我也尝试着自己实现了一下静态代理,加深印象。

先写一个接口,里面有一个run方法,作为所有能跑的动物的接口。

写一个dog类实现接口的功能。

写一个Clinet作为main函数调用,可以看出程序可以执行。这个时候问题来了,若我们想给这个方法加上时间标识,该怎么办?

这或许是一个办法,但这种办法也仅仅局限于我这个简单的小程序。而实际应用中往往我们调用别人的函数,是已经打包成jar包的,源代码都看不到。而且这样去修改别人的源码是不好的。这个时候我们就应该用到代理模式了,我这里使用静态代理来实现一下。

写一个时间代理类,可以给所有的RunnableAnimal代理。

可以看到,通过执行代理类的方法,成功给原来的功能加上了时间标识。若我们还想给它加上日志信息怎么办?很简单。

再写一个日志代理类.

很成功的执行了。这个设计模式巧妙的运用了java的多态,也让我对多态有了不一样的认识,以前只知道多态可以通过一个变量传入不同的参数,原来多态还可以通过这样来给一个对象添加功能。而且有没有觉得执行结果很熟悉?对,之前学习过的Springaop就是运用了这种设计模式。学习的知识感觉有点联系起来了,这种感觉很好。其实静态代理也挺麻烦的,动态代理能省去我们更多事情,不过还需深入学习。

明天计划的事情

继续接下来的步骤

遇到的困难

不知道数据库连接池那算不算困难,可能demo不对?也可能数据量小的时候本来就体现不出来性能的差异。

收获

数据库连接池更深入的了解,对静态代理的掌握,动态代理初步了解,对多态运用更深刻的体会。



返回列表 返回列表
评论

    分享到