-
Notifications
You must be signed in to change notification settings - Fork 64
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
分库分表: merger排序实现 #169
分库分表: merger排序实现 #169
Conversation
Codecov Report
@@ Coverage Diff @@
## dev #169 +/- ##
==========================================
+ Coverage 79.51% 80.64% +1.12%
==========================================
Files 30 32 +2
Lines 2309 2552 +243
==========================================
+ Hits 1836 2058 +222
- Misses 397 412 +15
- Partials 76 82 +6
📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more |
@juniaoshaonian 学习一下git rebase 这样你应该就不用关闭之前的PR #166 |
mark |
大佬们关于Next遍历完自动调用close方法的问题,你们觉得现在要怎么处理
|
还有Columns方法,一个sql.Rows遍历完如果再调用Columns方法会直接报连接已关闭的错误,我的想法是如果遇到连接已关闭的错误就继续下一个sql.Rows。但是如果是其他错误应该怎么办,直接返回还是说继续遍历下一个。还是说遇到错误直接不管一直遍历下去直到最后一个,返回最后一个的错误? |
按之前聊过的,尽可能与sql.Rows的各个方法语义保持一致. 在单结果集下,sortmerger.Rows.Next在非异常情况下返回false表明内部heap中没有预Scan的行了,而在预Scan之前都会先调用一下sql.Rows.Next如果其返回false也就是会自动关闭,所以现在来看sortmerger.Rows.Next可以说是做到了下面这个部分:
sortmerger.Rows.Next在异常情况下返回false即内部在迭代sql.Rows时或者预Scan时报错的情况下,也设置了r.lasterr并执行了r.Close可以说是做到了下面这部分: if rs.lasterr != io.EOF {
在多结果集的情况,sortmerger.Rows暂时不支持所以没有处理多结果集的情况.多结果集处理起来也有坑:假设从三个sqlRows取数据,每个sqlRows有2个结果集.sqlRows1的第一个结果集最先被取完,这时是直接取其下一个结果集的数据还是等待sqlRows2和3的第一个结果集都取完,然后调用三者的NextResultSet再一起从各自第二个结果集里取数据? 简单描述就是多个sqlRows的多个结果集之间数据能否交叉取? |
这么做确实可以,但也依赖于一个假设——所有sql.Rows的列都是相同的,之所以称之为假设,因为在NewSortMerger的时候并没有检查各个sqlRows的列是否相同,可以考虑把这个假设变为约束同时把你上面提到的 |
@juniaoshaonian 请保持PR的单一性,在这个PR中只修改sortmerger相关代码,把你bachmerger相关代码的修改revert回去,另外开PR处理.不要混在一起改. |
我改了一下errror的名字,和加了err()方法,让他们不报错 |
#169 (comment) 这个地方是要加并发测试吗?@longyue0521? |
sql.Rows只是调用HasNextResultSet检测一下是否有下一个结果集并不会自动跳到下一结果集,需要用户显示调用sql.Rows.NextResultSet方法跳到下一个结果集。
好的,在顶层抽象Merger接口加个注释怎么样,一方面介绍Merger的作用,另一方面提示一下:[]sql.Rows中每个sql.Rows仅支持单个结果集且每个sql.Rows中列集必须完全相同。
不是,是为了回答这个问题 #169 (comment) 我认为现在sortmerger.Rows.Next的语义符合sql.Rows.Next的语义 |
OKKK |
@juniaoshaonian 按上面的描述添加一下注释,再我把上面提到注释改了,这个PR就OK了 |
@juniaoshaonian 在最顶层Rows接口上也加一个注释:各方法用法及语义尽可能与sql.Rows |
合并了一下代码