回答

收藏

一次以固定数量的结果流式传输MySql ResultSet

技术问答 技术问答 359 人阅读 | 0 人回复 | 2023-09-13

我有1600万条记录。MySql由于一些迁移工作,我正在阅读整个表格Mysql表。; ?; j) L. z9 ^  I* L. v/ Q1 q$ `
在这里使用以下代码MySql大型中流传输ResultSet
" a# S( l  ~, P8 x9 H! F                                statement = connection.createStatement(                java.sql.ResultSet.TYPE_FORWARD_ONLY,               java.sql.ResultSet.CONCUR_READ_ONLY);        statement.setFetchSize(Integer.MIN_VALUE);但这一次流式传输的结果是否意味着我们击中了每一行MySql服务器
/ Z5 m, L. i- T* h' I, x+ ~, _在使用流式传输时,我们可以设置以下语句吗?setFetchSize(1000);
6 l* F) b$ R5 C  r* k* @1 K3 \我想减少大型流式传输ResultSet往返服务器的次数4 R5 _0 ^" g7 [/ _# `
                                                               
1 ]: L- @7 x/ o    解决方案:                                                                & r: L% x' D" J( i) F* c
                                                                假设你用的是我MySQL提供的官方JDBC驱动程序Connector / J。+ l: w6 d5 ~3 A$ _/ q1 D
您显式地告诉JDBC(和MySQL)结果 逐行传输statement.setFetchSize(Integer.MIN_VALUE);. l9 a3 V& y6 [2 W( v( m
从MYSQL文档:
0 A) u/ ~; z5 k( h" |; g+ L默认情况下,完全检索ResultSet并将其存储在内存中。在大多数情况下,这是最有效的操作方法,因为MySQL网络协议的设计更容易实现。如果您正在使用大量行或大值ResultSet,并且无法在JVM对于所需的内存分配堆空间,可以告诉驱动程序将结果一次流回一行。
' Y$ |& B$ w: n" k( I& s# n4 P) M要使用此功能,您需要创建以下方法Statement实例:5 w: p" o# N6 }0 M& K
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,         java.sql.ResultSet.CONCUR_READ_ONLY);stmt.setFetchSize(Integer.MIN_VALUE);向前阅读结果集和访存的大小Integer.MIN_VALUE组合作为驱动程序发出信号,逐行传输结果集的信号。之后,用这个句子创建的任何结果集都会逐行检索。# j7 R7 O0 g8 v" g  V# ]% w
Integer.MIN_VALUEMySQL除获略除获得大小以外的任何值,并应用标准行为。整个结果集将由JDBC获取驱动程序。* ]9 b, G) H+ Z9 C
要么不使用setFetchSize(),否则JDBC驱动程序将使用默认值(0)或设置其值0显式。使用值0还将确保JDBC不使用MySQL这可能取决于你MySQL和Connector  g1 h6 F3 Y: c9 N
/ J发生了版本和配置。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则