【发布时间】:2017-10-23 17:45:06
【问题描述】:
我正在对具有 10M 条记录的表运行以下更新查询,
update table1 t1 set col1=(select coalesce((select t2.col2 from table1 t2 where t1.col3=t2.col4 limit 1), null));
当我在查询上方运行时,我收到以下异常,因为执行查询需要很长时间,
java.net.SocketException: Socket closed
at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_121]
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_121]
at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[na:1.8.0_121]
at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_121]
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465) ~[na:1.8.0_121]
at sun.security.ssl.InputRecord.read(InputRecord.java:503) ~[na:1.8.0_121]
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973) ~[na:1.8.0_121]
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:930) ~[na:1.8.0_121]
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105) ~[na:1.8.0_121]
at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:146) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:115) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:71) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:283) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1719) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
... 64 common frames omitted
Wrapped by: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:201) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:622) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:458) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
at org.postgresql.jdbc.PgStatement.executeUpdate(PgStatement.java:406) ~[postgresql-9.4.1207.jre7.jar:9.4.1207.jre7]
at org.springframework.jdbc.core.JdbcTemplate$1UpdateStatementCallback.doInStatement(JdbcTemplate.java:523) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate$1UpdateStatementCallback.doInStatement(JdbcTemplate.java:520) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:404) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
... 58 common frames omitted
有没有一种方法可以让我简单地说,“只需触发查询,不要等待响应”,这样我就可以避免套接字超时?我正在使用 spring 提供的 JDBC 模板。
【问题讨论】:
-
合并似乎是多余的。