Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
f11667db
提交
f11667db
authored
11 年前
作者:
Thomas Mueller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Formatting.
上级
bf43f380
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
36 行增加
和
33 行删除
+36
-33
LobStorageBackend.java
h2/src/main/org/h2/store/LobStorageBackend.java
+3
-3
LobStorageFrontend.java
h2/src/main/org/h2/store/LobStorageFrontend.java
+1
-1
LobStorageInterface.java
h2/src/main/org/h2/store/LobStorageInterface.java
+3
-3
LobStorageMap.java
h2/src/main/org/h2/store/LobStorageMap.java
+28
-25
LobStorageRemoteInputStream.java
h2/src/main/org/h2/store/LobStorageRemoteInputStream.java
+1
-1
没有找到文件。
h2/src/main/org/h2/store/LobStorageBackend.java
浏览文件 @
f11667db
...
...
@@ -48,7 +48,7 @@ import org.h2.value.ValueLobDb;
* lock the Database object. However, in the case of the LOB data, we are using
* the system session to store the data. If we locked the normal way, we see
* deadlocks caused by the following pattern:
*
*
* <pre>
* Thread 1:
* locks normal session
...
...
@@ -58,7 +58,7 @@ import org.h2.value.ValueLobDb;
* locks system session
* waiting to lock database.
* </pre>
*
*
* So, in this class alone, we do two things: we have our very own dedicated
* session, the LOB session, and we take the locks in this order: first the
* Database object, and then the LOB session. Since we own the LOB session,
...
...
@@ -326,7 +326,7 @@ public class LobStorageBackend implements LobStorageInterface {
// see locking discussion at the top
synchronized
(
database
)
{
synchronized
(
conn
.
getSession
())
{
long
lobId
=
lob
.
getLobId
();
long
lobId
=
lob
.
getLobId
();
return
new
LobInputStream
(
lobId
,
byteCount
);
}
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/store/LobStorageFrontend.java
浏览文件 @
f11667db
...
...
@@ -65,7 +65,7 @@ public class LobStorageFrontend implements LobStorageInterface {
public
void
setTable
(
ValueLobDb
lob
,
int
tableIdSessionVariable
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
removeAllForTable
(
int
tableId
)
{
throw
new
UnsupportedOperationException
();
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/store/LobStorageInterface.java
浏览文件 @
f11667db
...
...
@@ -70,17 +70,17 @@ public interface LobStorageInterface {
* @param lob the lob
*/
void
removeLob
(
ValueLobDb
lob
);
/**
* Remove all LOBs for this table.
*
* @param tableId the table id
*/
void
removeAllForTable
(
int
tableId
);
/**
* Initialize the lob storage.
*/
void
init
();
}
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/store/LobStorageMap.java
浏览文件 @
f11667db
...
...
@@ -34,35 +34,36 @@ import org.h2.value.ValueLobDb;
* i.e. the server side of the LOB storage.
*/
public
class
LobStorageMap
implements
LobStorageInterface
{
private
static
final
boolean
TRACE
=
false
;
private
final
Database
database
;
private
boolean
init
;
/**
* The lob metadata map. It contains the mapping from the lob id
* (which is a long) to the stream store id (which is a byte array).
*
* Key: lobId (long)
* Value: { streamStoreId (byte[]), tableId (int), byteCount (long), hashCode (long) }.
*
* Key: lobId (long)
* Value: { streamStoreId (byte[]), tableId (int),
* byteCount (long), hashCode (long) }.
*/
private
MVMap
<
Long
,
Object
[]>
lobMap
;
/**
* The reference map. It is used to remove data from the stream store: if no
* more entries for the given streamStoreId exist, the data is removed from
* the stream store.
*
*
* Key: { streamStoreId (byte[]), lobId (long) }.
* Value: true (boolean).
*/
private
MVMap
<
Object
[],
Boolean
>
refMap
;
/**
* The stream store data map.
*
*
* Key: stream store block id (long).
* Value: data (byte[]).
*/
...
...
@@ -73,7 +74,7 @@ public class LobStorageMap implements LobStorageInterface {
public
LobStorageMap
(
Database
database
)
{
this
.
database
=
database
;
}
@Override
public
void
init
()
{
if
(
init
)
{
...
...
@@ -88,14 +89,15 @@ public class LobStorageMap implements LobStorageInterface {
}
else
{
mvStore
=
s
.
getStore
();
}
lobMap
=
mvStore
.
openMap
(
"lobMap"
,
lobMap
=
mvStore
.
openMap
(
"lobMap"
,
new
MVMapConcurrent
.
Builder
<
Long
,
Object
[]>());
refMap
=
mvStore
.
openMap
(
"lobRef"
,
refMap
=
mvStore
.
openMap
(
"lobRef"
,
new
MVMapConcurrent
.
Builder
<
Object
[],
Boolean
>());
dataMap
=
mvStore
.
openMap
(
"lobData"
,
new
MVMapConcurrent
.
Builder
<
Long
,
byte
[]>());
streamStore
=
new
StreamStore
(
dataMap
);
// TODO currently needed to avoid out of memory
// TODO currently needed to avoid out of memory,
// because memory usage is only measure in number of pages currently
streamStore
.
setMaxBlockSize
(
32
*
1024
);
}
...
...
@@ -165,13 +167,13 @@ public class LobStorageMap implements LobStorageInterface {
throw
DbException
.
convertIOException
(
e
,
null
);
}
}
private
ValueLobDb
createLob
(
InputStream
in
,
int
type
)
throws
IOException
{
byte
[]
streamStoreId
;
try
{
streamStoreId
=
streamStore
.
put
(
in
);
}
catch
(
Exception
e
)
{
throw
DbException
.
convertToIOException
(
e
);
throw
DbException
.
convertToIOException
(
e
);
}
long
lobId
=
generateLobId
();
long
length
=
streamStore
.
length
(
streamStoreId
);
...
...
@@ -186,7 +188,7 @@ public class LobStorageMap implements LobStorageInterface {
}
return
lob
;
}
private
long
generateLobId
()
{
Long
id
=
lobMap
.
lastKey
();
return
id
==
null
?
1
:
id
+
1
;
...
...
@@ -211,7 +213,7 @@ public class LobStorageMap implements LobStorageInterface {
refMap
.
put
(
key
,
Boolean
.
TRUE
);
ValueLobDb
lob
=
ValueLobDb
.
create
(
type
,
database
,
tableId
,
lobId
,
null
,
length
);
if
(
TRACE
)
{
trace
(
"copy "
+
old
.
getTableId
()
+
"/"
+
old
.
getLobId
()
+
" > "
+
tableId
+
"/"
+
lobId
);
trace
(
"copy "
+
old
.
getTableId
()
+
"/"
+
old
.
getLobId
()
+
" > "
+
tableId
+
"/"
+
lobId
);
}
return
lob
;
}
...
...
@@ -220,7 +222,7 @@ public class LobStorageMap implements LobStorageInterface {
public
InputStream
getInputStream
(
ValueLobDb
lob
,
byte
[]
hmac
,
long
byteCount
)
throws
IOException
{
init
();
Object
[]
value
=
lobMap
.
get
(
lob
.
getLobId
());
Object
[]
value
=
lobMap
.
get
(
lob
.
getLobId
());
byte
[]
streamStoreId
=
(
byte
[])
value
[
0
];
return
streamStore
.
get
(
streamStoreId
);
}
...
...
@@ -231,16 +233,17 @@ public class LobStorageMap implements LobStorageInterface {
long
lobId
=
lob
.
getLobId
();
Object
[]
value
=
lobMap
.
remove
(
lobId
);
if
(
TRACE
)
{
trace
(
"move "
+
lob
.
getTableId
()
+
"/"
+
lob
.
getLobId
()
+
" > "
+
tableId
+
"/"
+
lobId
);
trace
(
"move "
+
lob
.
getTableId
()
+
"/"
+
lob
.
getLobId
()
+
" > "
+
tableId
+
"/"
+
lobId
);
}
value
[
1
]
=
tableId
;
lobMap
.
put
(
lobId
,
value
);
}
@Override
public
void
removeAllForTable
(
int
tableId
)
{
init
();
// this might not be very efficient - to speed it up, we would need yet another map
// this might not be very efficient -
// to speed it up, we would need yet another map
ArrayList
<
Long
>
list
=
New
.
arrayList
();
for
(
Entry
<
Long
,
Object
[]>
e
:
lobMap
.
entrySet
())
{
Object
[]
value
=
e
.
getValue
();
...
...
@@ -261,10 +264,10 @@ public class LobStorageMap implements LobStorageInterface {
long
lobId
=
lob
.
getLobId
();
removeLob
(
tableId
,
lobId
);
}
private
void
removeLob
(
int
tableId
,
long
lobId
)
{
if
(
TRACE
)
{
trace
(
"remove "
+
tableId
+
"/"
+
lobId
);
trace
(
"remove "
+
tableId
+
"/"
+
lobId
);
}
Object
[]
value
=
lobMap
.
remove
(
lobId
);
byte
[]
streamStoreId
=
(
byte
[])
value
[
0
];
...
...
@@ -284,7 +287,7 @@ public class LobStorageMap implements LobStorageInterface {
streamStore
.
remove
(
streamStoreId
);
}
}
private
static
void
trace
(
String
op
)
{
System
.
out
.
println
(
"LOB "
+
op
);
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/store/LobStorageRemoteInputStream.java
浏览文件 @
f11667db
...
...
@@ -26,7 +26,7 @@ class LobStorageRemoteInputStream extends InputStream {
* The lob id.
*/
private
final
long
lob
;
private
final
byte
[]
hmac
;
/**
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论