Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
e24398a2
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e24398a2
编写于
8月 29, 2017
作者:
C
CyrusNajmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Be resilient to getting busy messages back from sqlite while retrieving the string table.
上级
8caf6101
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
37 addition
and
17 deletion
+37
-17
src/Workspaces/Core/Desktop/Workspace/SQLite/SQLitePersistentStorage.cs
.../Core/Desktop/Workspace/SQLite/SQLitePersistentStorage.cs
+7
-3
src/Workspaces/Core/Desktop/Workspace/SQLite/SQLitePersistentStorage_BulkPopulateIds.cs
...rkspace/SQLite/SQLitePersistentStorage_BulkPopulateIds.cs
+6
-1
src/Workspaces/Core/Desktop/Workspace/SQLite/SQLitePersistentStorage_StringIds.cs
...top/Workspace/SQLite/SQLitePersistentStorage_StringIds.cs
+24
-13
未找到文件。
src/Workspaces/Core/Desktop/Workspace/SQLite/SQLitePersistentStorage.cs
浏览文件 @
e24398a2
...
...
@@ -270,12 +270,16 @@ public override void Initialize(Solution solution)
""
{
DataColumnName
}
"" blob)"
);
// Also get the known set of string-to-id mappings we already have in the DB.
FetchStringTable
(
connection
);
// Do this in one batch if possible.
var
fetched
=
TryFetchStringTable
(
connection
);
// If we weren't able to retrieve the entire string table in one batch,
// attempt to retrieve it for each
var
fetchStringTable
=
!
fetched
;
// Try to bulk populate all the IDs we'll need for strings/projects/documents.
// Bulk population is much faster than trying to do everything individually.
// Note: we don't need to fetch the string table as we did it right above this.
BulkPopulateIds
(
connection
,
solution
,
fetchStringTable
:
false
);
BulkPopulateIds
(
connection
,
solution
,
fetchStringTable
);
}
}
}
...
...
src/Workspaces/Core/Desktop/Workspace/SQLite/SQLitePersistentStorage_BulkPopulateIds.cs
浏览文件 @
e24398a2
...
...
@@ -53,7 +53,12 @@ private void BulkPopulateProjectIds(SqlConnection connection, Project project, b
// the current string table, it will keep having problems trying to bulk populate.
if
(
fetchStringTable
)
{
FetchStringTable
(
connection
);
if
(!
TryFetchStringTable
(
connection
))
{
// Weren't able to fetch the string table. Have to try this again
// later once the DB frees up.
return
;
}
}
if
(!
BulkPopulateProjectIdsWorker
(
connection
,
project
))
...
...
src/Workspaces/Core/Desktop/Workspace/SQLite/SQLitePersistentStorage_StringIds.cs
浏览文件 @
e24398a2
...
...
@@ -12,23 +12,34 @@ internal partial class SQLitePersistentStorage
{
private
readonly
ConcurrentDictionary
<
string
,
int
>
_stringToIdMap
=
new
ConcurrentDictionary
<
string
,
int
>();
private
void
FetchStringTable
(
SqlConnection
connection
)
private
bool
Try
FetchStringTable
(
SqlConnection
connection
)
{
using
(
var
resettableStatement
=
connection
.
GetResettableStatement
(
$@"select * from ""
{
StringInfoTableName
}
"""
))
try
{
var
statement
=
resettableStatement
.
Statement
;
while
(
statement
.
Step
()
==
Result
.
ROW
)
using
(
var
resettableStatement
=
connection
.
GetResettableStatement
(
$@"select * from ""
{
StringInfoTableName
}
"""
)
)
{
var
id
=
statement
.
GetInt32At
(
columnIndex
:
0
);
var
value
=
statement
.
GetStringAt
(
columnIndex
:
1
);
// Note that TryAdd won't overwrite an existing string->id pair. That's what
// we want. we don't want the strings we've allocated from the DB to be what
// we hold onto. We'd rather hold onto the strings we get from sources like
// the workspaces. This helps avoid unnecessary string instance duplication.
_stringToIdMap
.
TryAdd
(
value
,
id
);
var
statement
=
resettableStatement
.
Statement
;
while
(
statement
.
Step
()
==
Result
.
ROW
)
{
var
id
=
statement
.
GetInt32At
(
columnIndex
:
0
);
var
value
=
statement
.
GetStringAt
(
columnIndex
:
1
);
// Note that TryAdd won't overwrite an existing string->id pair. That's what
// we want. we don't want the strings we've allocated from the DB to be what
// we hold onto. We'd rather hold onto the strings we get from sources like
// the workspaces. This helps avoid unnecessary string instance duplication.
_stringToIdMap
.
TryAdd
(
value
,
id
);
}
}
return
true
;
}
catch
(
SqlException
e
)
when
(
e
.
Result
==
Result
.
BUSY
)
{
// Couldn't get access to sql database to fetch the string table.
// Try again later.
return
false
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录