dblink问题
Q1:
我现在有两个生产库,A库的部分表通过DBLINK提供给B库使用,B库的应用访问B库,并通过B库查询A库的这些DBLINK链接的表,现在有一个问题:
检查发现 B库的连接数比较多,进一步检查发现有50多个连接是来自A库,即使不用这些DBLINK的表,但连接还是建立的,通过DBLINK建立了8个表的连接,但实际上有50个连接,
是否应用不访问,那么DBLINK的表就没有连接?
A1:
1. 是长连接, 一般, 不用的不会释放
2. 跟会话有关, 不同会话之间不共享数据库连接
3. 可调整open_links参数, 控制打开的连接数
Q2:
奶奶的,会不会出问题? 生产A 上通过DBLINK建立了 B库一个表,并建立同义词, A上一直往这个同义词上插入数据,导致如下的SQL建立的连接达到50多个,全部都是一样的,现在都停止插入了,但进程依然存在,刚才查了open_links参赛,都是4,但为什么会有这么多连接呢?怎么去控制?插入进程应该早就停止了并释放连接,但两个数据库之间的连接到底什么时候释放呢?
INSERT INTO "SM_SEND_SM_LIST" ("SERIALNO","SERVICEID","SMCONTEN T","SENDTARGET","PRIORITY","RCOMPLETETIMEBEGIN","RCOMPLETETIMEEN D","RCOMPLETEHOURBEGIN","RCOMPLETEHOUREND","REQUESTTIME","ROADBY ","SENDTARGETDESC","FEEVALUE","LINKID","PAD1","PAD2","PAD3","PAD 4","PAD5") VALUES (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:1 4,:15,:16,:17,:18,:19)
刚才了解了一下,是应用程序往这个同义词插入数据,应用程序通过WEBLOGIC的连接池处理,是不是连接池的连接不释放,导致dblink连接不释放?
这玩意会不会增长到几百甚至更多?
A2:
1. 你的weblogic的连接池创建了50个会话连接到数据库上, 应用程序访问数据库, 会被随机分配一个连接, 可能是50个中的任何一个, 所以50个会话可能都被用到了, 所以数据库连接就会有50个
2. 程序退出, 连接池不释放连接, 会话依然存在, 所以数据库连接数不变
3. 只要会话数一定, 数据库连接数就一定, 所以不会涨到几百
4. open_links能够限制每个会话最大打开的数据库连接数, 没有系统全局的限制
Q3:
1,我的应用有7个呢,每个WEBLOGIC都设置有50个连接
2,检查发现大部分插入都是一个SQL,采用绑定变量方式;
3,难道就没有别的方式可以降低连接数量
4,Open_links这个参数好像对这个没有效果,每个进程肯定只建立一个连接,处理完成后进程消失,但连接不消失,而且从这个案例来说,不可能出现一个进程产生多个连接的现象
我考虑将这个表从B库迁移到A库,A库德插入可能是不同的进程,但B库扫描这个表的进程应该一直是一个,那么这样就应该只有一个连接了!
A3:
1. 你有7个weblogic, 每个的连接池有50个连接? 还是7个应用使用同一个weblogic, 一共有50个连接?
第一种情况: 如果7个weblogic, 连接池中每个连接都用到了你那个数据库连接, 那么应该最多看到350个连接
第二种情况, 如果连接池中每个连接都用到了数据库连接, 那么应该最多看到50个连接
上述任何一种情况, 如果不是每个连接都用到了数据库连接, 则看到的连接数应当更小
2. 跟这个没关, 即使用到了n个表, 连接也只有1个
3.
1)在本地数据库端只有open_links的限制
2)前面说过了回话退出时会释放连接
3)第一条指出了可能的最大连接数
4)alter session close database link可手工关闭连接, 但这么做没意义, 下次还会自动创建
4.用到了几个数据库连接, 建立的链接就是几个, 可建立的最大值由open_links确定
因为虽然程序(进程)退出了, 但连接池创建的会话不会退出, 所以连接不消失
因为连接池创建了50个连接(会话)到数据库,每个会话都用到了数据库连接, 所以你看到的连接数是50个
外部链接:
30 Managing a Distributed Database
OPEN_LINKS
-fin-
No comments:
Post a Comment