Druid连接远程ORACLE出现Rest 连接超时等问题
之前项目部署在windows服务器上,出现过该问题,连接长时间空闲会导致连接失效,是因为服务器对不活跃连接会主动断开连接。但是Druid并不知道,查询时会等到连接超时才会重新连接。所以对Druid加了KeepAlive配置解决了该问题。
后来项目部署到了Centos61上,又出现了连接失效 Rest等问题,以为又是Druid的配置问题,调整了很多参数,依旧如此。
后来看见有人说跟熵源”(entropy source)的策略有关系,抱着死马当活马医的心态试了一下。加了如下配置
在tomcat /bin/catalinash 文件第一行中加入
JAVA_OPTS="-Djavasecurityegd=file:/dev//urandom"
该问题确实解决了,但是没理解加快随机数产生与连接失效的关系。。。还得进一步研究。
回想我们上节的内容,有两个地方跳过了,一个是启动创建链接的线程,一个是启动销毁链接的线程,我们这次就来详细的探究一番这两个的用途。
首先我们需要回头介绍之前没有讲解的三个 connection 数组的概念:
其主要流程如下:
我们来看一下主要流程:
销毁线程主要做两件事情,一个是销毁超过最大空闲连接数量的链接,一个是回收超时的链接。我们先来看一下第一个:
其主要步骤如下:
这里的逻辑比较简单,首先是遍历所有活动的链接,假如连接在运行就跳到下一个,假如不在运行,检查是否超时,假如是就将连接放入丢弃队列中,然后遍历丢弃队列,将连接关闭。
在DruidDataSource创建后,调用init()方法进行连接池初始化的时候会创建一个销毁线程
通过设置 destroyScheduler 来区分创建方式,一种是通过定时任务机制去执行配置的 destroyTask ,另外中是直接创建默认销毁线程任务
线程里睡眠60s,并且调用了 DestoryTask
真正回收连接的任务
判断连接池中对象是否存活,如果不满足则剔除
mybatis是警察
druid是武器库(有很多q)
jdbc是武器商(他们造q给武器库)
当你需要一次"除暴安良"时,你需要去找警察,警察从武器库拿q干活
以往的开发,是你使用jdbc直接造q,然后自己干活
jdbc整合了:加载数据库驱动,创建连接,写原生语句,执行,关闭这些东西
而mybatis是对jdbc的封装,他允许你通过配置的形式,配置数据库参数,并且允许你通过xml来写动态sql语句<if:test>让你可以把sql变得灵活起来并且还能将你的查询结果直接映射到你想要的实体上面
然后你就去配置你的用户名,密码,连接超时,等等
等你下次使用mybatis时,他后面会根据你的配置,帮你加载数据库驱动,创建连接,写原生语句,执行,关闭
但是mybatis发现,在你每次访问都要重新创建创建连接,写,关很麻烦,所以mybatis说,我可以接受你再配置一个连接池,比如druid
mybatis让你指定连接池是谁,如druid之后将原来自己需要搞的东西都交给druid什么账号了,密码了都给他,让druid帮你创建一批连接,在你需要用的时候,mybatis从druid里面拿一个就行
下面是一次简单的访问流程:
controller->service->dao->mapper
1首先项目启动时druid就已经使用jdbc创建好一堆连接了,留待后用
2当请求到mapper时,mybatis框架创建临时类
3然后将动态sql进行替换重写,变成原始的native sql
4从druid拿到一个连接
5将sql通过连接交给数据库执行
6然后获取执行结果
7mybatis进行将结果进行映射,返回数据
说的有点乱,希望能说清楚吧
以上就是关于Druid连接远程ORACLE出现Rest 连接超时等问题全部的内容,包括:Druid连接远程ORACLE出现Rest 连接超时等问题、[druid 源码解析] 3 创建连接&销毁连接、Druid源码分析(八) DestroyThread扫描回收连接等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)