为什么 setFetchSize 有时不起作用?读百万行的结果集怎么不把堆撑爆?PostgreSQL 与 MySQL 的做法差在哪里?这篇用 128 MB 的堆限制把每种配置跑一遍。
fetchSize=0(默认),autocommit=true OutOfMemoryError(已读 0 行;堆峰值 126 MB;用时 948 ms) fetchSize=1000,autocommit=true OutOfMemoryError(已读 0 行;堆峰值 127 MB;用时 854 ms) fetchSize=1000,autocommit=false 读完 2000000 行;第一行 99 ms;总耗时 524 ms;堆峰值 75 MB fetchSize=10,autocommit=false 读完 2000000 行;第一行 98 ms;总耗时 4899 ms;堆峰值 76 MB fetchSize=100000,autocommit=false 读完 2000000 行;第一行 118 ms;总耗时 451 ms;堆峰值 84 MB
默认(fetchSize=0) Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space setFetchSize(1000) 但没有 useCursorFetch Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space setFetchSize(Integer.MIN_VALUE)(流式) 读完 2000000 行;第一行 137 ms;总耗时 577 ms;堆峰值 70 MB useCursorFetch=true + fetchSize=1000 读完 2000000 行;第一行 818 ms;总耗时 1561 ms;堆峰值 71 MB useCursorFetch=true + fetchSize=1000,autocommit=false 读完 2000000 行;第一行 817 ms;总耗时 1556 ms;堆峰值 68 MB
fetchSize=0,autocommit=true,-Xmx2g 读完 2000000 行;第一行 381 ms;总耗时 461 ms;堆峰值 270 MB fetchSize=1000,autocommit=false,-Xmx2g 读完 2000000 行;第一行 99 ms;总耗时 526 ms;堆峰值 133 MB