没有可用的数据库连接 这个问题如何解决 !!!

时间:2022-01-26 21:42:18
  没有可用的数据库连接   这个问题如何解决 !!!   程序部署在别的公司的服务器上,,运行一段时间后就出现这个问题,重启服务又可以了,,,但程序运行一段时间又出现了!!急急!!!求牛人解决下。。。。。。。。。

24 个解决方案

#1


基本上说明有链接泄漏,存在程序Bug,没有释放连接。

排查方式两种:
1、生产环境上,出现无可用连接后,在数据库端检查所有会话最后执行的SQL语句是啥,基本可以定位到模块级别;
2、测试环境上,数据库可用连接和应用的连接池设置很小,比如10个,然后做稳定性测试,检查问题出在哪里。

推荐第一种方式,但需要提前先用工具连上数据库,否则等连接耗尽,你也没法连上数据库去排查问题了。

#2


该回复于2012-12-28 12:00:44被管理员删除

#3


高手呀,围观下

#4


没有可用的数据库连接 这个问题如何解决 !!!圍觀!有點不明白LZ的意思。

#5


一楼大神,围观!

#6


引用 楼主 wenjie4892543 的回复:
没有可用的数据库连接   这个问题如何解决 !!!   程序部署在别的公司的服务器上,,运行一段时间后就出现这个问题,重启服务又可以了,,,但程序运行一段时间又出现了!!急急!!!求牛人解决下。。。。。。。。。


运行一段时间后就出现这个问题
具体是什么问题?

#7


该回复于2012-12-28 13:06:11被管理员删除

#8


数据库连接被占用满了?数据库没关?

#9


引用 1 楼 ldh911 的回复:
基本上说明有链接泄漏,存在程序Bug,没有释放连接。

排查方式两种:
1、生产环境上,出现无可用连接后,在数据库端检查所有会话最后执行的SQL语句是啥,基本可以定位到模块级别;
2、测试环境上,数据库可用连接和应用的连接池设置很小,比如10个,然后做稳定性测试,检查问题出在哪里。

推荐第一种方式,但需要提前先用工具连上数据库,否则等连接耗尽,你也没法连上数……

正解,顶个
如果用的是hibernate会自动帮你关闭
如果是自己手动连接每次用完必须关闭,肯定是某个地方忘记关闭了

#10


1.没释放连接池,一直被占用   2.连接池设置的小了,真的是连接池数目满了。 

#11


连接池满了。 释放掉没?   还是打开的连接 太少了?

#12


有可能程序调用数据库的时候没有释放连接导致!

#13


引用 楼主 wenjie4892543 的回复:
没有可用的数据库连接   这个问题如何解决 !!!   程序部署在别的公司的服务器上,,运行一段时间后就出现这个问题,重启服务又可以了,,,但程序运行一段时间又出现了!!急急!!!求牛人解决下。。。。。。。。。



第一种方式,我应该如何去操作。。不是很了解 ,,有点文档资料没????

#14


和上面说的一样,最大可能就是数据库连接没有释放。

在自己的开发环境,打开数据库的连接监控,模拟一次调用,看看是否是连接数增加后下降?

#15


围观大神。 没有可用的数据库连接 这个问题如何解决 !!!

#16


该回复于2013-01-15 10:45:01被管理员删除

#17


  。。  报错 的 地方 不确定 。。   我报错 后 我 如何 知道 是 哪里的 连接 没 释放      错误: 没有可用的连接数
大牛--文杰:(328897842)  16:44:21
  debug  不用说了。 
大牛--文杰:(328897842)  16:44:49
java.sql.SQLException: 没有可用的数据库连接
14:22:39,961 ERROR [STDERR]  at com.egosystems.apputil.pool.ConnectionFactory.getFreeConnection(ConnectionFactory.java:342)
14:22:39,961 ERROR [STDERR]  at com.egosystems.apputil.pool.DbPool.getFreeConnection(DbPool.java:52)
大牛--文杰:(328897842)  16:45:32
  拿不到 连接数    可能是 哪里的 代码 没释放 连接 但是 我看了下 基本 的 finally  都  有 关闭 连接  。。
大牛--文杰:(328897842)  16:45:53
  所以  我  找不到 这个  错误 是哪里 报的 后台 也是  时有时无的  出现    求大神!!!!!!!!!!

#18


引用 6 楼 jianqiangking 的回复:
引用 楼主 wenjie4892543 的回复:没有可用的数据库连接   这个问题如何解决 !!!   程序部署在别的公司的服务器上,,运行一段时间后就出现这个问题,重启服务又可以了,,,但程序运行一段时间又出现了!!急急!!!求牛人解决下。。。。。。。。。

运行一段时间后就出现这个问题
具体是什么问题?

你还真够笨的,楼主都说了“没有可用的数据库连接”啊,就好比你的jdbc配置不对一个吊样

#19


引用 17 楼 wenjie4892543 的回复:
。。  报错 的 地方 不确定 。。   我报错 后 我 如何 知道 是 哪里的 连接 没 释放      错误: 没有可用的连接数
大牛--文杰:(328897842)  16:44:21
  debug  不用说了。 
大牛--文杰:(328897842)  16:44:49
java.sql.SQLException: 没有可用的数据库连接
14:22……

他会报这个错,证明你确实有没有关闭的资源,我不清楚你是用什么做的dao层,但既然你说finall都关闭了,我给你的建议:会不会是你try里多次会话用的是不同的session,

#20


必须是有的连接一直占用着,没有释放,所以才会连接不够的。

#21


解决:
1:如果你用的jdbc直接连,建议修改成数据库联接池。
2:如果你用的数据库联接池,那么你可以放大数据库默认的连接数,只有基数大了你才可以修改你的配置文件中的连接数。

最后还有建议,最好还要检查一下代码是不是有获取连接没有释放或是获取连接的业务过多而执行较慢,释放的速度赶不上被获取的速度,所以就会造成运行一段时间后不够用。

#22


没有可用连接,大多数情况,是由于,你的程序,用完连接,没有释放连接造成的。
咱们1楼的兄弟,已经给出了排查方案了,很可行的。

如果你的程序,每次用完连接都能及时的释放连接,那么,问题有可能出现在连接池的上面。
比如,你的程序,最多情况下,可能同时需要8个数据库连接来并发完成这个系统的处理流程,而你的连接池,
最多能分配5个连接给应用程序,这时,有的连接池,就会抛出没有可用连接的异常来。
当然,大部分连接池,都不这样配置,所以,最常见的,还是数据库抛出的这个异常。

还是看看程序吧,看看那里没有释放连接,或者由于异常抛出而没有执行释放连接的代码。

#23



import oracle.jdbc.pool.OracleDataSource;

try {
OracleDataSource dataSource = new OracleDataSource();
dataSource.setURL("jdbc:oracle:thin:@localhost:1521:orcl");
dataSource.setUser("system");
dataSource.setPassword("sa");
for (int i = 0; i < 5000; i++) {
System.out.println(dataSource.getConnection());
}
} catch (Exception e) {
e.printStackTrace();
}


试试这个,连续取出5000个Connection,不用关闭,也不会出现你说的那种情况。

#24


[引用 10 楼 scottxzj 的回复:]
1.没释放连接池,一直被占用   2.连接池设置的小了,真的是连接池数目满了
没有可用的数据库连接 这个问题如何解决 !!!顶 一下

#1


基本上说明有链接泄漏,存在程序Bug,没有释放连接。

排查方式两种:
1、生产环境上,出现无可用连接后,在数据库端检查所有会话最后执行的SQL语句是啥,基本可以定位到模块级别;
2、测试环境上,数据库可用连接和应用的连接池设置很小,比如10个,然后做稳定性测试,检查问题出在哪里。

推荐第一种方式,但需要提前先用工具连上数据库,否则等连接耗尽,你也没法连上数据库去排查问题了。

#2


该回复于2012-12-28 12:00:44被管理员删除

#3


高手呀,围观下

#4


没有可用的数据库连接 这个问题如何解决 !!!圍觀!有點不明白LZ的意思。

#5


一楼大神,围观!

#6


引用 楼主 wenjie4892543 的回复:
没有可用的数据库连接   这个问题如何解决 !!!   程序部署在别的公司的服务器上,,运行一段时间后就出现这个问题,重启服务又可以了,,,但程序运行一段时间又出现了!!急急!!!求牛人解决下。。。。。。。。。


运行一段时间后就出现这个问题
具体是什么问题?

#7


该回复于2012-12-28 13:06:11被管理员删除

#8


数据库连接被占用满了?数据库没关?

#9


引用 1 楼 ldh911 的回复:
基本上说明有链接泄漏,存在程序Bug,没有释放连接。

排查方式两种:
1、生产环境上,出现无可用连接后,在数据库端检查所有会话最后执行的SQL语句是啥,基本可以定位到模块级别;
2、测试环境上,数据库可用连接和应用的连接池设置很小,比如10个,然后做稳定性测试,检查问题出在哪里。

推荐第一种方式,但需要提前先用工具连上数据库,否则等连接耗尽,你也没法连上数……

正解,顶个
如果用的是hibernate会自动帮你关闭
如果是自己手动连接每次用完必须关闭,肯定是某个地方忘记关闭了

#10


1.没释放连接池,一直被占用   2.连接池设置的小了,真的是连接池数目满了。 

#11


连接池满了。 释放掉没?   还是打开的连接 太少了?

#12


有可能程序调用数据库的时候没有释放连接导致!

#13


引用 楼主 wenjie4892543 的回复:
没有可用的数据库连接   这个问题如何解决 !!!   程序部署在别的公司的服务器上,,运行一段时间后就出现这个问题,重启服务又可以了,,,但程序运行一段时间又出现了!!急急!!!求牛人解决下。。。。。。。。。



第一种方式,我应该如何去操作。。不是很了解 ,,有点文档资料没????

#14


和上面说的一样,最大可能就是数据库连接没有释放。

在自己的开发环境,打开数据库的连接监控,模拟一次调用,看看是否是连接数增加后下降?

#15


围观大神。 没有可用的数据库连接 这个问题如何解决 !!!

#16


该回复于2013-01-15 10:45:01被管理员删除

#17


  。。  报错 的 地方 不确定 。。   我报错 后 我 如何 知道 是 哪里的 连接 没 释放      错误: 没有可用的连接数
大牛--文杰:(328897842)  16:44:21
  debug  不用说了。 
大牛--文杰:(328897842)  16:44:49
java.sql.SQLException: 没有可用的数据库连接
14:22:39,961 ERROR [STDERR]  at com.egosystems.apputil.pool.ConnectionFactory.getFreeConnection(ConnectionFactory.java:342)
14:22:39,961 ERROR [STDERR]  at com.egosystems.apputil.pool.DbPool.getFreeConnection(DbPool.java:52)
大牛--文杰:(328897842)  16:45:32
  拿不到 连接数    可能是 哪里的 代码 没释放 连接 但是 我看了下 基本 的 finally  都  有 关闭 连接  。。
大牛--文杰:(328897842)  16:45:53
  所以  我  找不到 这个  错误 是哪里 报的 后台 也是  时有时无的  出现    求大神!!!!!!!!!!

#18


引用 6 楼 jianqiangking 的回复:
引用 楼主 wenjie4892543 的回复:没有可用的数据库连接   这个问题如何解决 !!!   程序部署在别的公司的服务器上,,运行一段时间后就出现这个问题,重启服务又可以了,,,但程序运行一段时间又出现了!!急急!!!求牛人解决下。。。。。。。。。

运行一段时间后就出现这个问题
具体是什么问题?

你还真够笨的,楼主都说了“没有可用的数据库连接”啊,就好比你的jdbc配置不对一个吊样

#19


引用 17 楼 wenjie4892543 的回复:
。。  报错 的 地方 不确定 。。   我报错 后 我 如何 知道 是 哪里的 连接 没 释放      错误: 没有可用的连接数
大牛--文杰:(328897842)  16:44:21
  debug  不用说了。 
大牛--文杰:(328897842)  16:44:49
java.sql.SQLException: 没有可用的数据库连接
14:22……

他会报这个错,证明你确实有没有关闭的资源,我不清楚你是用什么做的dao层,但既然你说finall都关闭了,我给你的建议:会不会是你try里多次会话用的是不同的session,

#20


必须是有的连接一直占用着,没有释放,所以才会连接不够的。

#21


解决:
1:如果你用的jdbc直接连,建议修改成数据库联接池。
2:如果你用的数据库联接池,那么你可以放大数据库默认的连接数,只有基数大了你才可以修改你的配置文件中的连接数。

最后还有建议,最好还要检查一下代码是不是有获取连接没有释放或是获取连接的业务过多而执行较慢,释放的速度赶不上被获取的速度,所以就会造成运行一段时间后不够用。

#22


没有可用连接,大多数情况,是由于,你的程序,用完连接,没有释放连接造成的。
咱们1楼的兄弟,已经给出了排查方案了,很可行的。

如果你的程序,每次用完连接都能及时的释放连接,那么,问题有可能出现在连接池的上面。
比如,你的程序,最多情况下,可能同时需要8个数据库连接来并发完成这个系统的处理流程,而你的连接池,
最多能分配5个连接给应用程序,这时,有的连接池,就会抛出没有可用连接的异常来。
当然,大部分连接池,都不这样配置,所以,最常见的,还是数据库抛出的这个异常。

还是看看程序吧,看看那里没有释放连接,或者由于异常抛出而没有执行释放连接的代码。

#23



import oracle.jdbc.pool.OracleDataSource;

try {
OracleDataSource dataSource = new OracleDataSource();
dataSource.setURL("jdbc:oracle:thin:@localhost:1521:orcl");
dataSource.setUser("system");
dataSource.setPassword("sa");
for (int i = 0; i < 5000; i++) {
System.out.println(dataSource.getConnection());
}
} catch (Exception e) {
e.printStackTrace();
}


试试这个,连续取出5000个Connection,不用关闭,也不会出现你说的那种情况。

#24


[引用 10 楼 scottxzj 的回复:]
1.没释放连接池,一直被占用   2.连接池设置的小了,真的是连接池数目满了
没有可用的数据库连接 这个问题如何解决 !!!顶 一下