为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:UOS
【CPU】:
【问题描述】*:
在使用jdbc连接数据库进行耗时的大批量数据查询时,会抛出SocketTimeoutException,如果是少量数据查询则不会异常,在连接字符串上设置了socketTimeout没用。
以下是报错信息:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_201]
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_201]
at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[na:1.8.0_201]
at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_201]
at dm.jdbc.a.a.c.a(ByteArrayNode.java:129) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production]
at dm.jdbc.a.a.a.a(Buffer.java:364) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production]
at dm.jdbc.a.a.d(DBAccess.java:910) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production]
at dm.jdbc.a.a.a(DBAccess.java:831) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production]
at dm.jdbc.a.a.a(DBAccess.java:345) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production]
at dm.jdbc.a.a.a(DBAccess.java:462) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production]
at dm.jdbc.driver.DmdbPreparedStatement.executeInner(DmdbPreparedStatement.java:323) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production]
at dm.jdbc.driver.DmdbPreparedStatement.do_executeQuery(DmdbPreparedStatement.java:421) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production]
at dm.jdbc.driver.DmdbPreparedStatement.executeQuery(DmdbPreparedStatement.java:1470) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3225) ~[druid-1.2.19.jar:na]
at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:459) ~[druid-1.2.19.jar:na]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3222) ~[druid-1.2.19.jar:na]
at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:459) ~[druid-1.2.19.jar:na]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3222) ~[druid-1.2.19.jar:na]
at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeQuery(PreparedStatementProxyImpl.java:175) ~[druid-1.2.19.jar:na]
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:213) ~[druid-1.2.19.jar:na]
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:677) ~[spring-jdbc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:616) ~[spring-jdbc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:668) ~[spring-jdbc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:699) ~[spring-jdbc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:711) ~[spring-jdbc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:762) ~[spring-jdbc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
问题解决了,在使用druid连接池的时候对于耗时长的操作配置
connectTimeout: 20000
socketTimeout: 20000
根据某开发商兄弟反馈,druid配置中的db-type不要设置为dm,设置为MySQL或者Oracle即可解决
1.将查询SQL放DM管理工具中执行看一下执行效率。
2.优化代码逻辑或优化SQL。