Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
17c1e200
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,发现更多精彩内容 >>
未验证
提交
17c1e200
编写于
3月 19, 2020
作者:
M
msftbot[bot]
提交者:
GitHub
3月 19, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #42544 from CyrusNajmabadi/sqlConnectionAllocation
Be more resilient to exceptions happening in sqlconnection.
上级
179d8d64
429710ec
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
24 addition
and
7 deletion
+24
-7
src/Workspaces/Core/Portable/Storage/SQLite/Interop/SqlConnection.cs
...ces/Core/Portable/Storage/SQLite/Interop/SqlConnection.cs
+24
-7
未找到文件。
src/Workspaces/Core/Portable/Storage/SQLite/Interop/SqlConnection.cs
浏览文件 @
17c1e200
...
...
@@ -54,6 +54,10 @@ public static SqlConnection Create(IPersistentStorageFaultInjector faultInjector
{
faultInjector
?.
OnNewConnection
();
// Allocate dictionary before doing any sqlite work. That way if it throws
// we don't have to do any additional cleanup.
var
queryToStatement
=
new
Dictionary
<
string
,
SqlStatement
>();
// Use SQLITE_OPEN_NOMUTEX to enable multi-thread mode, where multiple connections can be used provided each
// one is only used from a single thread at a time.
// see https://sqlite.org/threadsafe.html for more detail
...
...
@@ -67,16 +71,25 @@ public static SqlConnection Create(IPersistentStorageFaultInjector faultInjector
Contract
.
ThrowIfNull
(
handle
);
raw
.
sqlite3_busy_timeout
(
handle
,
(
int
)
TimeSpan
.
FromMinutes
(
1
).
TotalMilliseconds
);
var
queryToStatement
=
new
Dictionary
<
string
,
SqlStatement
>();
return
new
SqlConnection
(
handle
,
faultInjector
,
queryToStatement
);
try
{
raw
.
sqlite3_busy_timeout
(
handle
,
(
int
)
TimeSpan
.
FromMinutes
(
1
).
TotalMilliseconds
);
return
new
SqlConnection
(
handle
,
faultInjector
,
queryToStatement
);
}
catch
{
// If we failed to create connection, ensure that we still release the sqlite
// handle.
raw
.
sqlite3_close
(
handle
);
throw
;
}
}
private
SqlConnection
(
sqlite3
handle
,
IPersistentStorageFaultInjector
faultInjector
,
Dictionary
<
string
,
SqlStatement
>
queryToStatement
)
{
// This constructor avoids allocations since failure (e.g. OutOfMemoryException) would leave the object
// partially-constructed, and the finalizer would run later triggering a crash.
// This constructor avoids allocations since failure (e.g. OutOfMemoryException) would
// leave the object partially-constructed, and the finalizer would run later triggering
// a crash.
_handle
=
handle
;
_faultInjector
=
faultInjector
;
_queryToStatement
=
queryToStatement
;
...
...
@@ -99,7 +112,11 @@ internal void Close_OnlyForUseBySqlPersistentStorage()
Contract
.
ThrowIfNull
(
_handle
);
// release all the cached statements we have.
foreach
(
var
statement
in
_queryToStatement
.
Values
)
//
// use the struct-enumerator of our dictionary to prevent any allocations here. We
// don't want to risk an allocation causing an OOM which prevents executing the
// following cleanup code.
foreach
(
var
(
_
,
statement
)
in
_queryToStatement
)
{
statement
.
Close_OnlyForUseBySqlConnection
();
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录