oracle 17410什么错
发布时间:2025-05-23 15:25:25 发布人:远客网络
一、oracle 17410什么错
1、应该是数据库连接不正常导致的,
2、网络问题,内网之中访问,无防火墙,不是网络原因。
3、网上说是Oracle版本的Bug,经分析,Oracle相关的bug不会影响到现在的Oracle版本,不是版本bug原因。
4、JDBC版本原因,可能会是该原因导致的,遂将JDBC的版本升级到和Oracle版本相符的版本,但是问题依然存在。
5、在绝望是时候突然想到,生产的Oracle和测试的Oracle唯一的区别是:生产的Oracle对长期闲置的数据库连接会自动断开,而我们系统使用的数据库连接池是Apache的DBCP的BasicDataSource连接池。
6、于是就在本地的Oracle中修改idle_time参数为一分钟,测试,果然出现了同样的问题,问题的根源找到,但是如何解决呢?
7、现在问题是:Oracle将数据库连接断开了,但是连接池却认为该连接是可以用的,就将该连接分配给了应用程序使用,连接池和应用程序在分配和使用该连接之前没有校验数据库连接的可用性。
8、查看DBCP的文档和源码,发现有这4个属性可以用:
9、validationQuery属性,将从连接池中获取的数据库连接返回给调用者之前,通过这个sql查询判断其有效性,如果设置,这个查询sql必须至少有一条数据,可将该属性设为select 1 from dual
10、testOnBorrow属性,确定从连接池中获取的对象是否有效,如果无效从连接池移除,然后尝试下一个对象,这个属性默认为true,可以不设置
11、testOnReturn属性,放回连接池之前判断对象是否有效,这个属性默认为false,建议设为true
12、testWhileIdle属性,通过空闲对象驱逐器判断对象是否有效,如果无效从连接池移除,默认为false。
13、至此,增加这些属性之后,连接池的配置如下
14、<property name="locations">
15、<value>classpath:jdbc.properties</value>
16、<property name="driverClassName">
17、<value>${jdbc.driverClassName}</value>
18、<value>${jdbc.url}</value>
19、<property name="username">
20、<value>${jdbc.username}</value>
21、<property name="password">
22、<value>${jdbc.password}</value>
23、<property name="maxActive">
24、<property name="maxIdle">
25、<property name="maxWait">
26、<property name="defaultAutoCommit">
27、<value>false</value>
28、<!--将从连接池中获取的数据库连接返回给调用者之前,通过这个sql查询判断其有效性-->
29、<!--如果设置,这个查询sql必须至少有一条数据-->
30、<property name="validationQuery">
31、<value>select 1 from dual</value>
32、<!--确定从连接池中获取的对象是否有效,如果无效从连接池移除,然后尝试下一个对象-->
33、<property name="testOnBorrow">
34、<value>true</value>
35、<!--放回连接池之前判断对象是否有效-->
36、<property name="testOnReturn">
37、<value>true</value>
38、<!--通过空闲对象驱逐器判断对象是否有效,如果无效从连接池移除-->
39、<property name="testWhileIdle">
40、<value>true</value>
二、你真的知道如何设置数据库连接池的大小吗
前段时间在一个老项目中经历过一个问题:一个 Dubbo服务,启动的时候慢的要死,后来看日志查原因整个过程一直在初始化数据库连接。一看数据库连接参数,连接池大小:1024。
很多入行晚的同学没有经历过手写 JDBC连接的日子。那个时候没有数据库连接池的概念,都是原生代码一顿搞,后来有了 iBATIS之后 Java开发的繁杂程度才逐渐减轻,也衍生 C3P0数据库连接池这种基础的东西。罗马不是一天建成的,可是互联网发展太快了,技术压力逼迫下各种中间件被迫研发,大家加班加点搞出来各种高大上的脚手架,也成就很多伟人。
数据库连接使用 TCP的方式,建立连接需要3次握手,释放连接需要4次挥手,当今这种互联网使用频率下,如果每一次访问数据库都重新建立连接,我估计你们公司倒闭800次都不够。
Java鼻祖 Sun公司是想以一套API统一天下,奈何各个数据库服务器厂商太给力统一不了。无奈之举是创建了一个统一的接口,提出一套统一接入的步骤,各个厂商实现接口,按照步骤加载自己的数据库。所以现在的方案就是4板斧:
注册驱动,为人所知的:Class.forName();
获取Connection,成功即与数据库建立连接;
拿到Statement对象,用于操作数据库的CRUD;
大家应该都知道数据库本身是一个客户端程序,只有启动了才能连接。拿 MYSQL举例,我们在安装并启动了服务的机器上,命令行的方式输入:mysql-uroot-p即可连接当前数据库。
MYSQL连接方式有很多种,区分Unix系统和 Windows系统以及通用的连接方式,在这里仅说两种方式:一种为 unix domain socket,另外一种为基于 tcp/ip协议,一般我们如果远程访问数据库肯定是基于 tcp/ip的,但是如果我们在本机登录就会分为使用 socket还是 tcp/ip。
tcp/ip:mysql-h127.0.0.1-uroot-p
当数据库服务器和应用服务器位于不同的主机时就要使用 tcp/ip的方式建立连接。每一个连接在操作系统中占用一个线程来维护。建立连接也分为两类:短连接和长连接。
所谓短连接就是指应用程序和数据库通信完毕之后连接关闭。这种连接每次的操作就是:
发出请求--->建立连接--->操作数据--->释放连接
频繁的建立/释放连接对数据库来说增加了系统负担;
应用程序每次操作数据库的过程将会变得很慢;
应用系统每次建立连接都要占用一个端口,频繁的建立/释放,每个被释放的连接在发出释放请求之后并不是马上就执行,必须经历一个 FIN阶段的等待直到确认为止。所以在每秒几千次数据库请求的时候,应用服务器端口很有可能被消耗完。
长连接即在建立连接后一直打开,直到应用程序关闭才释放。使用长连接的好处是减少每次创建连接带来的开销。
对于应用服务器来说维持长连接的好处不言自明,但是对于数据库服务器来说,过多的长连接则是灾难。
MYSQL的TCP连接支持长连接,所以每次操作完数据库,可以不必直接关掉连接,而是等待下次使用的时候在复用这个连接。所有的Socket长连接都是通过TCP自带的ping来维持心跳(TCP保活),从而保持连接状态,而我们熟悉的websocket,也正是通过TCP的心跳来维持连接不被中断。
长连接的好处这么大,自然大家都用长连接。慢慢就搞出一套长连接维护的工具-数据库连接池。
设计连接池也没有多么复杂,大致的步骤就是:
除了上面的基本功能以外,还要处理并发问题,多数据库服务器和多用户,事务处理,连接池的配置与维护。大概就这些功能。有了连接池之后,连接的建立和释放跟业务就没有关系,交给交接池来维护。
MYSQL的最大连接数在5.7版本中默认是151,最大可以达到16384(2^14)。如何设置最大连接数在于你的服务器性能,查看 MYSQL连接数信息命令如下:
mysql> show variables like'%max_connections%';
我们生产环境MYSQL的最大连接数设置为 5050,注意不能设置的太小,太小造成的后果是连接失败:“query failed Error 1040: Too many connections“错误。太大且当连接该数据库的机器比较多的时候则会对当前MYSQL的性能产生影响。
MYSQL官网给出了一个设置最大连接数的建议比例:
Max_used_connections/ max_connections* 100%≈ 85%
即已使用的连接数占总上限的85%左右,如果目前已使用的连接数与最大连接数比例小于10%那很显然设置的过大。
mysql> show status like'Threads_connected';
Mysql的配置可以在全局变量中查询和设置,相关的配置主要可以查询下面这些:
尝试连接Mysql的连接数,不管连接成功与否,该值都会+1
已经建立的连接数,单节点下一般小于最大连接池最大连接数
即MYSQL长连接(非交互式)的最大生命时长,默认是8小时
长连接(交互式)的最大生命时长,默认是8小时
设置连接池的大小肯定不是越大越好,需要考虑的是当前服务所在机器的性能,网络状况,数据库机器性能,数据库特性等等。同时也要做到不浪费系统资源,内存,端口,同步信号量等等。
比如说应用服务器Tomcat设置的最大线程池缺省值200,最大假设每个线程会用到一个数据库连接,那么线程池大小应该小于等于200。
另外需要考虑的是,每申请一个长连接都会在物理网络上建立一个用于长连接维护的进程,而进程的执行跟物理机的CPU核数有关。理论上一个8核的服务器将连接池设置为8最佳,每一个核同时处理一个线程,超过8的并发就有线程上下文切换的开销。
这里有一个 Oracle性能小组发布的简短视频,连接池测试分2个部分:测试视频1,测试视频2。视频中调整了线程池大小为2048的时候数据库性能陡然下降,后面调整到144就恢复了。PostgreSQL提供了一个设置预期线程池大小的公式:
connections=((core_count* 2)+ effective_spindle_count)
该公式来自于:。
其中,core_count是CPU核心, effective_spindle_count的含义是有效主轴数,如果你的服务器使用的是带有16个磁盘的RAID,那么valid_spindle_count=16。它实质上是服务器可以管理多少个并行I/ O请求的度量。旋转硬盘一次(通常)一次只能处理一个I/ O请求,如果你有16个,则系统可以同时处理16个I/ O请求。
我想 Hikari作为目前最优秀的数据库连接池之一,提出的这个公式还是经得起检验的。大家不妨在生产环境试试(出问题别找我)。
你真的知道如何设置数据库连接池的大小吗
标签:加班The带来脚手架过多功能短连接建立连接复杂
三、oracle 如何增大连接池最大连接数
在数据库服务器上运行 sqlplus system/password@xe(其中 system是数据库用户无需改变;password是数据库密码应指定为实际密码;xe是数据库实例名称)。
然后执行:查看一下数据库现有的进程数,是否已经达到参数processes的大小。
1. select count(*) from v$process;取得数据库目前的进程数。
2. select value from v$parameter where name='processes';取得进程数的上限。
接着,需要调整数据库的连接池最大连接数:
alter system set session_cached_cursors=200 scope=spfile;设置会话缓存游标数量。
alter system set session_max_open_files=200 scope=spfile;设置每个会话可以打开的最大文件数量。
alter system set sessions=20 scope=spfile;设置系统中允许的会话数量。
alter system set license_max_sessions=200 scope=spfile;设置许可证允许的最大会话数量。
alter system set license_sessions_warning=200 scope=spfile;设置许可证会话警告数量。
alter system set processes=200 scope=spfile;设置系统可以处理的进程数量。
执行上述命令后,重启 Oracle XE数据库实例即可。具体步骤如下:
1.如安装于 Windows上,先运行 net stop oracleservicexe,再运行 net start oracleservicexe即可。也可通过“服务”管理控制台重启 OracleServiceXE服务。
2.如安装于 Linux上,先运行/etc/init.d/oracle-xe start,再运行/etc/init.d/oracle-xe stop即可。
以上步骤完成后,数据库的最大连接数将被调整为所需的值。
调整连接池的最大连接数有助于优化数据库性能,提高系统的稳定性和响应速度。
值得注意的是,调整参数时需要谨慎,确保不会超出数据库的实际处理能力。
此外,调整完成后,建议测试数据库性能,确保调整后的参数能够满足实际需求。
最后,定期监控数据库的性能和资源使用情况,以便及时发现并解决问题。
通过以上步骤,您可以有效地增大 Oracle数据库连接池的最大连接数。