java jdbc连接_什么情况,应用竟然无法连接数据库

故障简介

今天一个应用运维同事微信联系我,说有一个应用日志,显示连接Oracle数据库报错,我问了一下是什么应用,对方回答是报表应用,这下心里有谱了。第一:报表应用重要性不高
第二:一般这种情况,都是因为程序写的烂,一堆慢sql语句,将连接数占满了,导致获取不到连接数。

8cc608cd4305498eeecd43ed67395ad0.png

日志分析

于是让应用运维同事,将应用报错日志发给我先看看,报错信息如下所示

java.sql.SQLException: Listener refused the connection with the following error:ORA-12519, TNS:no appropriate service handler found         at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]        at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:546) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]        at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:236) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0]        at java.sql.DriverManager.getConnection(DriverManager.java:582) ~[na:1.6.0_45]        at java.sql.DriverManager.getConnection(DriverManager.java:185) ~[na:1.6.0_45]        at com.umpay.jdbc.PooledConnection.makeRealConnection(PooledConnection.java:133) ~[jsv2core-1.2.27.jar:na]        at com.umpay.jdbc.PooledConnection.(PooledConnection.java:118) ~[jsv2core-1.2.27.jar:na]        at com.umpay.jdbc.UmpayCP.getConnection(UmpayCP.java:307) ~[jsv2core-1.2.27.jar:na]        at com.umpay.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:125) ~[jsv2core-1.2.27.jar:na]        at com.umpay.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:113) ~[jsv2core-1.2.27.jar:na]        at com.umpay.backofc2.collate.CollateInfo.getNearest10Collates(CollateInfo.java:257) ~[collate-frame-20160908-mysql.jar:na]        at com.umpay.backofc2.collate.CollateMain.startup(CollateMain.java:187) [collate-frame-20160908-mysql.jar:na]        at com.umpay.backofc2.collate.CollateMain.main(CollateMain.java:310) [collate-frame-20160908-mysql.jar:na]Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:ORA-12519, TNS:no appropriate service handler found

我看了一下报错,竟然不是常见的无法获取连接数报错,就上网查询了一下ora-12519错误代码的含义,竟然是应用的连接数达到数据库连接数的上限了。

8d4ece931a70314f371575ebc89eb607.png

于是让应用同事把连接数据库的JDBC连接池配置文件发给我看看。

######################################################## jdbc.driver = oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@XXXX:1521:XXX######################################################## jdbc.username= XXXjdbc.password= XXXjdbc.dbType=oracle ######################################################## jdbc.min_connections = 10 jdbc.max_connections = 100 

什么鬼,最大连接数竟然设置成100个。

解决过程

先看看Oracle数据库的连接数上限

SQL> show parameter process; NAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------aq_tm_processes                      integer     0cell_offload_processing              boolean     TRUEdb_writer_processes                  integer     2gcs_server_processes                 integer     0global_txn_processes                 integer     1job_queue_processes                  integer     1000log_archive_max_processes            integer     4processes                            integer     150

上限是150,启动几个应用,连接数很快就会被占用完,这个上限需要调整一下。

参数调整

修改最大连接数:alter system set processes = 500 scope = spfile;重启数据库:shutdown immediate;startup;SQL> show parameter process; NAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------aq_tm_processes                      integer     0cell_offload_processing              boolean     TRUEdb_writer_processes                  integer     2gcs_server_processes                 integer     0global_txn_processes                 integer     1job_queue_processes                  integer     1000log_archive_max_processes            integer     4processes                            integer     500

这里需要注意,调整连接上限,需要重启实例,如果不是很重要的数据库,修改完成参数,就可以立刻重启,如果是重要数据库,需要协调窗口时间重启。

建议

293e39b02584f7c75c57507d9cb2dcf5.png

在这里有3个建议第一:数据库连接上限,可以根据业务需求进行调整,例如不太繁忙的系统,可以调整为500,繁忙的系统,可以调整为1000。如果要调整更高的上限,可以考虑进行垂直拆分业务了。

第二:应用连接数据数,一定要按需设置,有条件,可以弄一个连接数据管理的配置中心,由数据库人员管理连接数。

第三:定期优化线上慢sql,降低应用对连接数的需求。

关注

1.如果您喜欢这篇文章,请点赞+转发。

2.如果您特别喜欢,请加关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值