相关文章推荐
玉树临风的领带  ·  中文信息·  1 年前    · 
豁达的羊肉串  ·  琵琶牧牧的微博_微博·  1 年前    · 
坏坏的皮蛋  ·  紫心之恋_百度百科·  1 年前    · 

错误一:get connection timeout retry : 1

https://github.com/alibaba/druid/issues/4326

生产环境运行一段时间后,报错如下:

com.alibaba.druid.pool.DruidDataSource : get connection timeout retry : 1
com.alibaba.druid.pool.DruidDataSource : get connection timeout retry : 1
com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:oracle:thin:@x.x.x.x:1521:orcl, errorCode 17002, state 08006
java.sql.SQLRecoverableException: IO Error: Connection reset
Caused by: java.net.SocketException: Connection reset
c.a.druid.pool.DruidAbstractDataSource : {dataSource-1} failContinuous is true

此时连接并没有到达最大连接数,一直复现不了问题,花了不少时间才定位到原因 :

并发获取连接的个数超过”最大并发连接数“导致。但此时连接数远远未到达最大连接数。

select count(*) from v$session where status='ACTIVE' --最大并发连接数

查询结果:23

还原测试:

设置获取连接超时时间为6秒

###程序向连接池中请求连接时,超时时间,毫秒
spring.datasource.druid.max-wait=6000

测试代码:

		int N = 50;
		CountDownLatch countDownLatch = new CountDownLatch(N);// 实例化一个倒计数器,N指定计数个数
		for (int i = 0; i < N; i++) {
			new Thread(() -> {
				Connection connection = null;
				try {
					// 执行代码
					countDownLatch.countDown(); // 计数减一
					countDownLatch.await();// 等待,当计数减到0时,所有线程并行执行
					connection = jdbcTemplate.getDataSource().getConnection();
					String sql = "select count(*) from v$process";
					PreparedStatement statement = connection.prepareStatement(sql);
					ResultSet set = statement.executeQuery();
					if (set.next()) {
						System.out.println("当前的连接数:" + set.getString(1));
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					try {
						// connection.close();
					} catch (Exception e) {
						e.printStackTrace();
			}).start();

测试代码刚好出现 50-23=27 个错误: get connection timeout retry : 1 

解决办法:

延长获取连接超时时间。

###程序向连接池中请求连接时,超时时间,毫秒
spring.datasource.druid.max-wait=180000

但是延长获取连接超时时间的办法,治标不治本。

保持连接池最小连接数,避免突然大量并发创建连接,来最终解决问题。

spring.datasource.druid.min-idle=20

无论是YGC或是FullGC,都会导致stop-the-world,即整个程序停止一些事务的处理,只有GC进程允许以进行垃圾回收,因此如果垃圾回收时间较长,部分web或socket程序,当终端连接的时候会报connetTimeOut或readTimeOut异常

错误二:java.sql.SQLRecoverableException: 无法从套接字读取更多的数据

## 配置间隔多久才进行一次检测(检测需要关闭的空闲连接),单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000

在使用连接后60秒内杀掉session ,并再次使用连接查询数据库。

#登陆到oracle用户
su - oracle
#杀掉所有session
ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill -9

在配置的空闲连接时间 60秒内 如果发生网络异常,Oracle服务端连接已断开,但是客户端连接池并不知道,再次使用就会报错:

java.sql.SQLRecoverableException: 无法从套接字读取更多的数据

解决办法:

#程序 申请 连接时,进行连接有效性检查(低效,影响性能)
spring.datasource.druid.test-on-borrow=true

错误一:get connection timeout retry : 1https://github.com/alibaba/druid/issues/4326生成环境运行一段时间后,报错如下:com.alibaba.druid.pool.DruidDataSource : get connection timeout retry : 1com.alibaba.druid.pool.DruidDataSource : get connection timeout retry : 1com.a 首先调用getConnectionInternal方法尝试获取池化连接,在获取超时的情况下(捕获到 GetConnectionTimeoutException),如果重试次数小于notFullTimeoutRetryCount并且this.poolingCount + this.activeCount >= this.maxActive,会重新尝试获取连接: // handle notFullTimeoutRetry DruidPooledConn 用C#编写的重试库,它尝试使用给定的重试策略执行给定的操作。 操作可以是无效的,也可以返回值。 如果某个操作由于任何原因失败,则将抛出一个展平的AggregateException ,其中包含方法调用发生的所有异常。 顺序或线性重试策略基本上是一种技术,它尝试在重试之间指定的固定延迟内执行X次特定操作。 该策略将尝试执行指定次数的多次操作,并且两次尝试之间始终具有相同的延迟。 达到最大重试限制后,它将平坦的AggregateException返回给调用者,并列出所有异常。 操作支持Forever重试机制,该机制可以无限期地重试直到成功。 指数重试策略或指数退避技术会以指数方式增加每次失败后重试之间的等待时间。 例如,当操作第一次失败时,重试将在1秒后进
最近在跳过数据库连接超时的时候,发现设置了获取连接等待的超时时间为300毫秒,结果发现每次出现连接超时情况时整个查询的耗时在600毫秒+,于是初步判断是做了重试操作。于是查看日志发现有一条很明显的日志记录: com.alibaba.druid.pool.DruidDataSource - get connection timeout retry : 1 定位到对应的源码后有如下代码: 在无线循环中看到去获取连接,若出现超时线性,则会依据两个条件来来判断是否做超时重试。也就是开放了参数: notFu
public interface DruidTestMapper { @Select("SELECT * FROM druid_test") List<DruidTest> getAll(); 定义一个Service调用mapper查询,调用代码逻辑如下. 项目有些功能页面访问速度很慢,想优化下。这些功能页面不常用,只是一些简单的查询展示。但是经常首次访问速度超慢(>10s)。访问一次,接着访问速度飞快(<100ms).因为是多数据源项目,就是其中的几个页面有这种情况,并且这几个页面都用到同一个数据库。所以怀疑是因为我们单位内部有入网规范管理系统,连接长时间不用,可能会被关闭,所以数据库连接池获取连接,首次访问连接池要新创建一个连接才能获取到可用连接。 有试过很多druid配置:testWhileIdle,timeBetweenEvic "github.com/vthiery/retry" var nonRetryableError = errors . New ( "a non-retryable error" ) func main () { // Define the retry strategy, with 10 attempts and an exponential backoff retry := retry . New ( retry . WithMaxAttempts ( 10 ), retry . WithBackoff ( retry . NewEx func main () { i := 1 // lets assume we expect i to be a value of 8 err := retry . DoFunc ( 10 , 1 * time . Second , func () error { fmt . Printf ( "tryi
ActiveJob :: Retry 这是活跃开发中的Alpha库,因此API可能会改。 ActiveJob的自动重试功能。 只需在您的工作类别中include ActiveJob::Retry.new(strategy: :something, **options) : class ProcessWebhook < ActiveJob :: Base queue_as :webhooks # Constant delay between attempts: include ActiveJob :: Retry . new ( strategy : :constant , 备份Oracle数据库,最好的方式是数据库泵,Oracle使用EXPDP和IMPDP数据泵进行导出导入方法 但是当无法登陆服务器时,可以使用PLSQL备份数据库来备份数据库。 PLSQL备份数据库 1、PLSQL导出表结构 2、PLSQL导入表结构 3、PLSQL使用PDE方式导出表数据 1、保存生成Object selection的文件(后缀是.osf...
1. jobs是oracle数据库的对象, dbms_jobs只是jobs对象的一个实例, 就像对于tables, emp和dept都是表的实例。 2. 创建方式也有差异,Job是通过调用dbms_scheduler.create_job包创建的,Dbms_job则是通过调用dbms_job.submit包创建的。 3. 两种任务的查询视图都分为dba和普通用户的,Job对应的查询视图是dba_schedul... 解决"get connection timeout retry:1"问题的方法有以下几种: 1. 检查网络连接:首先要确保你的设备已经成功连接到网络,并且网络连接稳定。可以尝试重新连接Wi-Fi或换网络连接方式,以确保网络正常工作。 2. 检查服务器状态:如果问题发生在与特定服务或网站的连接上,可以尝试访问其他网站或服务,确认是否只是发生在特定的服务器上。如果是特定服务器的问题,可能是服务器故障或维护,只能等待服务器正常运行或联系相关维护人员进行处理。 3. 检查防火墙和路由器设置:有时候,防火墙和路由器的设置会导致连接超时。可以尝试暂时关闭防火墙或者在防火墙和路由器上配置相应的端口和访问规则,确保连接不被阻塞。 4. 修改连接超时设置:有时候默认的连接超时时间较短,可以尝试增加连接超时时间,通常可以在应用程序或设备设置中进行调整。 5. 检查应用程序或设备的新:如果问题发生在特定应用程序上,可以检查该应用程序是否有新版本可用,如果有,可以尝试新应用程序以修复可能存在的连接问题。 总之,解决"get connection timeout retry:1"的问题需要综合考虑网络连接、服务器状态、防火墙和路由器设置等因素,根据具体情况采取相应的调整和处理措施。 ### 回答3: "get connection timeout retry:1" 这个错误通常是在尝试建立网络连接时遇到的问题。这可能是由于网络连接不稳定或服务器响应缓慢引起的。以下是一些可能的解决方法: 1. 检查网络连接:确认你的网络连接是否正常并能够正常访问其他网站或服务。如果你使用的是无线连接,尝试重新连接或换网络。 2. 重试:网络连接时可能会因为临时问题而超时。在遇到连接超时错误后,可以尝试再次执行相同的操作,看是否能够建立连接。 3. 检查服务器状态:该错误可能是由于服务器过载或其他问题导致的。你可以尝试访问其他网站或服务来确认该问题是否只出现在特定的服务器上。 4. 检查防火墙设置:如果你使用的是防火墙软件,可能会出现连接问题。确保你的防火墙设置允许该程序或网站的访问。 5. 与技术支持联系:如果以上方法都无法解决问题,建议联系相关的技术支持团队或管理员,他们可能能够提供具体的解决方案或帮助你进一步排查问题的根本原因。 需要注意的是,具体解决方法可能因个人环境和问题的性质而有所不同,请根据具体情况选择合适的解决方案。 MYBATIS 插入空值时报错 Could not set parameters for mapping: ParameterMapping{property=‘addressList‘, mode= crontab中执行java报错nohup: failed to run command ‘java’: No such file or directory