使用阿里链接池报以下错误
[data-tower:10.157.196.228:8400] 2022-01-26 03:13:24.733 INFO 32231 [db4b2033c07741ce9d67e4640a18275b] [http-nio-8400-exec-3] org.mongodb.driver.connection Opened connection [connectionId{localValue:5, serverValue:215}] to 10.157.196.228:27017
[data-tower:10.157.196.228:8400] 2022-01-26 03:13:24.766 INFO 32231 [6e61797d960b44fe8f66c6d2c21098fb] [http-nio-8400-exec-4] org.mongodb.driver.connection Opened connection [connectionId{localValue:6, serverValue:216}] to 10.157.196.228:27017
[data-tower:10.157.196.228:8400] 2022-01-26 21:50:02.226 INFO 32231 [99b4549a6d7445f282af3fe3dd1c173f] [http-nio-8400-exec-10] c.y.tower.commons.handler.DataSetHelper ++++++++++++++++开始新增数据+++++++++++++++++1643251802226
[data-tower:10.157.196.228:8400] 2022-01-26 21:50:02.226 INFO 32231 [99b4549a6d7445f282af3fe3dd1c173f] [http-nio-8400-exec-10] c.y.tower.commons.handler.DataSetHelper ++++++++++打印sql+++++++++++++INSERT [smartallocation].[web_factor] (task_id,factor_name,factor_value) SELECT N'1486531916737060926',N'po_fill_rate','0,1'UNION ALL SELECT N'1486531916737060926',N'osa','0,0.94'UNION ALL SELECT N'1486531916737060926',N'retail_doi','0,988'UNION ALL SELECT N'1486531916737060926',N'wh_doi','-0.03,155532'UNION ALL SELECT N'1486531916737060926',N'startDate','202101'UNION ALL SELECT N'1486531916737060926',N'endDate','202112'UNION ALL SELECT N'1486531916737060926',N'natural_sales','100'UNION ALL SELECT N'1486531916737060926',N'status','A,B'
[data-tower:10.157.196.228:8400] 2022-01-26 21:50:02.232 ERROR 32231 [99b4549a6d7445f282af3fe3dd1c173f] [http-nio-8400-exec-10] c.y.tower.commons.handler.DataSetHelper 数据批量操作失败:com.microsoft.sqlserver.jdbc.SQLServerException: Connection timed out (Write failed)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1667)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1654)
at com.microsoft.sqlserver.jdbc.TDSChannel.write(IOBuffer.java:1805)
at com.microsoft.sqlserver.jdbc.TDSWriter.flush(IOBuffer.java:3581)
at com.microsoft.sqlserver.jdbc.TDSWriter.writePacket(IOBuffer.java:3482)
at com.microsoft.sqlserver.jdbc.TDSWriter.endMessage(IOBuffer.java:3062)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:6120)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatementBatch(SQLServerStatement.java:876)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.access$200(SQLServerStatement.java:37)
at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtBatchExecCmd.doExecute(SQLServerStatement.java:836)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeBatch(SQLServerStatement.java:1706)
at com.alibaba.druid.pool.DruidPooledStatement.executeBatch(DruidPooledStatement.java:792)
at com.yechtech.tower.commons.handler.DataSetHelper.updateBathByStatement(DataSetHelper.java:218)
at com.yechtech.tower.service.impl.StrategyFactorServiceImpl.commitToSqlserve(StrategyFactorServiceImpl.java:251)
at com.yechtech.tower.service.impl.StrategyFactorServiceImpl$$FastClassBySpringCGLIB$$444183d.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687)
at com.yechtech.tower.service.impl.StrategyFactorServiceImpl$$EnhancerBySpringCGLIB$$c1b245f6.commitToSqlserve(<generated>)
at com.yechtech.tower.service.impl.ITaskServiceImpl.toSubmitSingleStrategy(ITaskServiceImpl.java:243)
at com.yechtech.tower.service.impl.ITaskServiceImpl.sumitTask(ITaskServiceImpl.java:225)
at com.yechtech.tower.service.impl.ITaskServiceImpl$$FastClassBySpringCGLIB$$9a646efd.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687)
at com.yechtech.tower.service.impl.ITaskServiceImpl$$EnhancerBySpringCGLIB$$4c9f8236.sumitTask(<generated>)
at com.yechtech.tower.web.controller.TaskHistoryController.submitTask(TaskHistoryController.java:138)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect
public static Connection getConn() {
String url = "*****";
String driver = "*****";
String username = "*****";
String password = "*****";
DruidDataSource ds = new DruidDataSource();
ds.setUrl(url);
ds.setDriverClassName(driver);
ds.setUsername(username);
ds.setPassword(password);
ds.setMaxWait(30000);
ds.setRemoveAbandonedTimeout(1800);
ds.setInitialSize(1);
ds.setMinIdle(10);
ds.setMaxActive(20);
ds.setMinEvictableIdleTimeMillis(300000);
ds.setDefaultAutoCommit(false);
DruidPooledConnection connection = null;
try {
connection = ds.getConnection();
} catch (SQLException e) {
log.error("db error info {}", ExceptionUtil.stacktraceToString(e));
throw TowerExceptions.badRequest(DvErrCode.CONNECTION_ERROR.getMessage());
}
return connection;
}
- 经过分析 链接池有个检测链接有效性的属性默认是关闭的 (testOnBorrow=false),但是如果要打开,会影响性能。
- 修改之后的代码
public static Connection getConn() {
String url = "*****";
String driver = "*****";
String username = "*****";
String password = "*****";
DruidDataSource ds = new DruidDataSource();
ds.setUrl(url);
ds.setDriverClassName(driver);
ds.setUsername(username);
ds.setPassword(password);
ds.setMaxWait(30000);
ds.setRemoveAbandonedTimeout(1800);
ds.setInitialSize(1);
ds.setMinIdle(10);
ds.setMaxActive(20);
ds.setMinEvictableIdleTimeMillis(300000);
ds.setDefaultAutoCommit(false);
ds.setRemoveAbandoned(Boolean.TRUE);
ds.setTestOnBorrow(Boolean.FALSE);
ds.setTimeBetweenEvictionRunsMillis(600000);
ds.setTestWhileIdle(Boolean.TRUE);
DruidPooledConnection connection = null;
try {
connection = ds.getConnection();
} catch (SQLException e) {
log.error("db error info {}", ExceptionUtil.stacktraceToString(e));
throw TowerExceptions.badRequest(DvErrCode.CONNECTION_ERROR.getMessage());
}
return connection;
}
- 为什么不打开有效性链接呢, 这篇文章写的很好 关于testOnBorrow=false的解析