只了解 mysql, mysql 中的 result 默认会把所有结果拿回来。默认情况下,结果集完全检索并存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计,更容易实现。
一、jdbc的resultset底层实现原理是怎样的
只了解 mysql, mysql 中的 result 默认会把所有结果拿回来。默认情况下,结果集完全检索并存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于MySQL网络协议的设计,更容易实现。
如果您正在使用具有大量行或较大值的结果集,并且无法在 JVM 中为所需的内存分配堆空间,则可以告诉驱动程序一次将结果流式传输回一行。
所以所以如果应用不想一次拿那么多,可以
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
setFetchSize一个非MIN_VALUE在一般情况下是没啥用的, 但如果设置了 MIN_VALUE 之后 jdbc 代码中会用一个 streamingResult 的方式一条条从 server 的连接拿,当然这个文档中也提到了用这种方式的一些 caveats。
最后,除了使用 MIN_VALUE, 还可以使用 useCursorFetch=true(同时需要 prepare? ),之后 setFetchSize 就能生效了,不过和上面的区别是: 前面是 mysql 一次吐全部数据推给客户端,客户端一条条收然后收的慢通过 tcp backpressure; 后者用 cursor 是 mysql 不返回全部结果,而是客户端根据 setFetchSize(或 defaultFetchSize) 多次用 从 mysql 拉取指定条数据。
延伸阅读:
二、Navicat是什么
Navicat是一套快速、可靠和全面的数据库管理工具,专门用于简化数据库管理和降低管理成本。Navicat图形界面直观,提供简便的管理方法,设计和操作MySQL、MariaDB、SQL Server、Oracle、PostgreSQL和SQLite的数据。
Navicat提供一个直观和设计完善的用户界面,用于创建、修改和管理资料库的所有对象,例如表、视图、函数或过程、索引、触发器和序列。我们的表设计器帮助用户创建和修改数据库的表,让设置高级选项,如关系、限制、触发器和更多。
使用Navicat浏览和修改数据,插入、编辑、删除数据或复制和粘贴记录到数据表形式的数据编辑器,Navicat将运行相应的命令(例如INSERT或UPDATE),免除写复杂的SQL。广泛的数据编辑工具令编辑工作更为方便,例如外键查找、set/enum选择器和记录筛选。