池化连接本身是不会立即断开与数据库服务器的物理连接,这是正常的,不过我们的程序或容器(比如 Spring, EJB)应该跟踪程序是否没有正确的完成当前绑定在这个连接上的事务(提交和回滚都算是完成了事务),在未正确完成事务时要报告错误。
J2EE 规范中是有些要求的,比如一个完整的发起自容器(比如 web 程序或 ejb 程序)内的请求在完成后应该把它的事务也同时完成并逻辑上关闭连接(池化连接中物理连接一般不会立即关闭,这是由服务器的资源管理器来决定的),所以这时我们的程序正确的调用了 connectionclose() (这是逻辑连接),但通过进程观察 netstat 依然能看到应用服务器还连接在数据库上面(这时物理连接),这个逻辑连接这时相当于时分复用一个物理连接。
断开连接:
EXEC ('KILL ' + @spid )断开某个数据库的全部链接:
USE masterDECLARE @spid int
DECLARE CUR CURSOR
FOR SELECT spid FROM sysprocesses WHERE dbid = 5
FETCH NEXT FROM CUR INTO @spid
WHILE @@FETCH_STATUS = 0
BEGIN
--EXEC ('KILL ' + cast(@spid as nvarchar(50)))
FETCH NEXT FROM CUR INTO @spid
END
CLOSE CUR
DEALLOCATE CUR
处理方式:
1请检查您服务器的并发连接和进程数是否有异常。
2请检查您的iis或者php-cgi等参数是否配置有问题。
3检查您的网站程序和数据库,是否存在数据库慢查询等问题,看下是否是数据库连接后未释放连接。
4建议您检查您的web服务器和数据库服务器日志检查是否有异常情况。
由于创建连接的代价是很高的, 我们每次访问数据库都重新创建连接的话是非常消耗性的
我们可以再程序启动的时候先创建出一些连接, 放在一个集合中, 访问数据库的时候从集合中获取, 使用结束再放回集合中
这样做只是在程序启动的时候消耗性能去创建连接, 每次访问数据库的时候都是从内存中获取连接, 可以大大提升效率
注意事项:
由于池中增删非常频繁, 使用集合LinkedList效率较高
集合中所有连接都被占用时创建新连接, 但需要注意连接总数
使用组合模式/动态代理处理释放连接的方法, 当运行close方法时, 将连接放回池中
关于数据库连接池:
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库 *** 作的性能。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被 使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超 过最大连接数量时,这些请求将被加入到等待队列中。
数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库 *** 作。
3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
调用:客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为 忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。
释放:当使用的池连接调用完成后,池驱动程序将此连接表记为空闲, 其他调用就可以使用这个连接
可能的原因是你的数据库连接已经满了
也就是你的代码中可能有没释放连接的地方
比如数据库连接支持100个
那么你每次 *** 作都有1或者2个未释放的连接
久而久之就会发现连接数在减少
那么就导致连接不上了
1)如果是宽带本身的问题,首先直接联接宽带网线测试,如果是宽带的问题,联系宽带客服解决。
2)如果是路由器的问题,如果原来可以用,暂时不能用了,我自己的实践是一个是断掉路由器的电源在插上,等会看看。在有就是恢复出厂设置,从新严格按说明书设置就可以用了,自己不懂,不建议自己随意设置(这是在物理连接正确的前提下,有时是路由器寻IP地址慢或失败引起的,并不是说路由器坏了)。
如果总是不能解决,建议给路由器的客服打电话,他们有电话在线指导,我遇到自己不能解决的问题,咨询他们给的建议是很有用的,他们会针对你的设置或 *** 作给出正确建议的。
3)如果关闭了无线开关开启就是了,如果是用软件连接的无线,软件不好用又经常出问题是很正常的,没有更好的方法,用路由器吧。另外就是网卡驱动没有或不合适引起的,网线接口或网线是不是有问题等。
4)如果是系统问题引起的,建议还原系统或重装。
使用系统自带的系统还原的方法:
系统自带的系统还原:“开始”/“程序”/“附件”/“系统工具”/“系统还原”,点选“恢复我的计算机到一个较早的时间”,按下一步,你会看到日期页面有深色的日期,那就是还原点,你选择后,点击下一步还原(Win7810还原系统,右击计算机选属性,在右侧选系统保护,系统还原,按步骤做就是了,如果有还原软件,自带的映像备份,并且进行了备份,也可以用软件、映像备份还原系统)。
以上就是关于spring配置jndi不能释放数据库连接全部的内容,包括:spring配置jndi不能释放数据库连接、sql server查询到的没有释放的连接 如图,如何现在就释放了、服务器网站502错误怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)