Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
36f3c9ef
提交
36f3c9ef
authored
11 年前
作者:
Thomas Mueller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Formatting, javadocs
上级
c4af37cd
显示空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
82 行增加
和
44 行删除
+82
-44
LobStorageBackend.java
h2/src/main/org/h2/store/LobStorageBackend.java
+29
-17
FilePathCrypt.java
h2/src/main/org/h2/store/fs/FilePathCrypt.java
+1
-1
Table.java
h2/src/main/org/h2/table/Table.java
+1
-1
MultiDimension.java
h2/src/main/org/h2/tools/MultiDimension.java
+1
-1
SourceCompiler.java
h2/src/main/org/h2/util/SourceCompiler.java
+50
-24
没有找到文件。
h2/src/main/org/h2/store/LobStorageBackend.java
浏览文件 @
36f3c9ef
...
@@ -32,21 +32,24 @@ import org.h2.value.ValueLob;
...
@@ -32,21 +32,24 @@ import org.h2.value.ValueLob;
import
org.h2.value.ValueLobDb
;
import
org.h2.value.ValueLobDb
;
/**
/**
* This class stores LOB objects in the database.
* This class stores LOB objects in the database.
This is the back-end i.e. the
*
This is the back-end i.e. the
server side of the LOB storage.
* server side of the LOB storage.
* <p>
* <p>
* Using the system session
* Using the system session
* <p>
* <p>
* Why do we use the system session to store the data? Some LOB operations can take a very long time.
* Why do we use the system session to store the data? Some LOB operations can
* If we did them on a normal session, we would be locking the LOB tables for long periods of time,
* take a very long time. If we did them on a normal session, we would be
* which is extremely detrimental to the rest of the system.
* locking the LOB tables for long periods of time, which is extremely
* Perhaps when we shift to the MVStore engine, we can revisit this design decision.
* detrimental to the rest of the system. Perhaps when we shift to the MVStore
* engine, we can revisit this design decision.
* <p>
* <p>
* Locking Discussion
* Locking Discussion
* <p>
* <p>
* Normally, the locking order in H2 is: first lock the Session object, then lock the Database object.
* Normally, the locking order in H2 is: first lock the Session object, then
* However, in the case of the LOB data, we are using the system session to store the data.
* lock the Database object. However, in the case of the LOB data, we are using
* If we locked the normal way, we see deadlocks caused by the following pattern:
* the system session to store the data. If we locked the normal way, we see
* deadlocks caused by the following pattern:
*
* <pre>
* <pre>
* Thread 1:
* Thread 1:
* locks normal session
* locks normal session
...
@@ -56,9 +59,11 @@ import org.h2.value.ValueLobDb;
...
@@ -56,9 +59,11 @@ import org.h2.value.ValueLobDb;
* locks system session
* locks system session
* waiting to lock database.
* waiting to lock database.
* </pre>
* </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.
* So, in this class alone, we do two things: we have our very own dedicated
* Since we own the LOB session, no-one else can lock on it, and we are safe.
* 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,
* no-one else can lock on it, and we are safe.
*/
*/
public
class
LobStorageBackend
implements
LobStorageInterface
{
public
class
LobStorageBackend
implements
LobStorageInterface
{
...
@@ -389,12 +394,14 @@ public class LobStorageBackend implements LobStorageInterface {
...
@@ -389,12 +394,14 @@ public class LobStorageBackend implements LobStorageInterface {
small
=
new
byte
[
0
];
small
=
new
byte
[
0
];
}
}
if
(
small
!=
null
)
{
if
(
small
!=
null
)
{
// For a BLOB, precision is length in bytes. For a CLOB, precision is length in chars
// For a BLOB, precision is length in bytes.
// For a CLOB, precision is length in chars
long
precision
=
countingReaderForClob
==
null
?
small
.
length
:
countingReaderForClob
.
getLength
();
long
precision
=
countingReaderForClob
==
null
?
small
.
length
:
countingReaderForClob
.
getLength
();
ValueLobDb
v
=
ValueLobDb
.
createSmallLob
(
type
,
small
,
precision
);
ValueLobDb
v
=
ValueLobDb
.
createSmallLob
(
type
,
small
,
precision
);
return
v
;
return
v
;
}
}
// For a BLOB, precision is length in bytes. For a CLOB, precision is length in chars
// For a BLOB, precision is length in bytes.
// For a CLOB, precision is length in chars
long
precision
=
countingReaderForClob
==
null
?
length
:
countingReaderForClob
.
getLength
();
long
precision
=
countingReaderForClob
==
null
?
length
:
countingReaderForClob
.
getLength
();
return
registerLob
(
type
,
lobId
,
LobStorageFrontend
.
TABLE_TEMP
,
length
,
precision
);
return
registerLob
(
type
,
lobId
,
LobStorageFrontend
.
TABLE_TEMP
,
length
,
precision
);
}
catch
(
IOException
e
)
{
}
catch
(
IOException
e
)
{
...
@@ -592,6 +599,11 @@ public class LobStorageBackend implements LobStorageInterface {
...
@@ -592,6 +599,11 @@ public class LobStorageBackend implements LobStorageInterface {
}
}
}
}
/**
* Check whether this thread has synchronized on this object.
*
* @param lock the object
*/
static
void
assertHoldsLock
(
Object
lock
)
{
static
void
assertHoldsLock
(
Object
lock
)
{
if
(!
Thread
.
holdsLock
(
lock
))
{
if
(!
Thread
.
holdsLock
(
lock
))
{
throw
DbException
.
throwInternalError
();
throw
DbException
.
throwInternalError
();
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/store/fs/FilePathCrypt.java
浏览文件 @
36f3c9ef
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/table/Table.java
浏览文件 @
36f3c9ef
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/tools/MultiDimension.java
浏览文件 @
36f3c9ef
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/util/SourceCompiler.java
浏览文件 @
36f3c9ef
...
@@ -44,6 +44,9 @@ import javax.tools.ToolProvider;
...
@@ -44,6 +44,9 @@ import javax.tools.ToolProvider;
*/
*/
public
class
SourceCompiler
{
public
class
SourceCompiler
{
/**
* The "com.sun.tools.javac.Main" (if available).
*/
static
final
JavaCompiler
JAVA_COMPILER
;
static
final
JavaCompiler
JAVA_COMPILER
;
private
static
final
Class
<?>
JAVAC_SUN
;
private
static
final
Class
<?>
JAVAC_SUN
;
...
@@ -60,6 +63,9 @@ public class SourceCompiler {
...
@@ -60,6 +63,9 @@ public class SourceCompiler {
*/
*/
final
HashMap
<
String
,
Class
<?>>
compiled
=
New
.
hashMap
();
final
HashMap
<
String
,
Class
<?>>
compiled
=
New
.
hashMap
();
/**
* Whether to use the ToolProvider.getSystemJavaCompiler().
*/
boolean
useJavaSystemCompiler
=
SysProperties
.
JAVA_SYSTEM_COMPILER
;
boolean
useJavaSystemCompiler
=
SysProperties
.
JAVA_SYSTEM_COMPILER
;
static
{
static
{
...
@@ -222,6 +228,15 @@ public class SourceCompiler {
...
@@ -222,6 +228,15 @@ public class SourceCompiler {
}
}
}
}
/**
* Get the complete source code (including package name, imports, and so
* on).
*
* @param packageName the package name
* @param className the class name
* @param source the (possibly shortened) source code
* @return the full source code
*/
static
String
getCompleteSourceCode
(
String
packageName
,
String
className
,
String
source
)
{
static
String
getCompleteSourceCode
(
String
packageName
,
String
className
,
String
source
)
{
if
(
source
.
startsWith
(
"package "
))
{
if
(
source
.
startsWith
(
"package "
))
{
return
source
;
return
source
;
...
@@ -247,6 +262,14 @@ public class SourceCompiler {
...
@@ -247,6 +262,14 @@ public class SourceCompiler {
return
buff
.
toString
();
return
buff
.
toString
();
}
}
/**
* Compile using the standard java compiler.
*
* @param packageName the package name
* @param className the class name
* @param source the source code
* @return the class
*/
Class
<?>
javaxToolsJavac
(
String
packageName
,
String
className
,
String
source
)
{
Class
<?>
javaxToolsJavac
(
String
packageName
,
String
className
,
String
source
)
{
String
fullClassName
=
packageName
+
"."
+
className
;
String
fullClassName
=
packageName
+
"."
+
className
;
StringWriter
writer
=
new
StringWriter
();
StringWriter
writer
=
new
StringWriter
();
...
@@ -427,7 +450,7 @@ public class SourceCompiler {
...
@@ -427,7 +450,7 @@ public class SourceCompiler {
*/
*/
static
class
JavaClassObject
extends
SimpleJavaFileObject
{
static
class
JavaClassObject
extends
SimpleJavaFileObject
{
pr
otected
final
ByteArrayOutputStream
out
=
new
ByteArrayOutputStream
();
pr
ivate
final
ByteArrayOutputStream
out
=
new
ByteArrayOutputStream
();
public
JavaClassObject
(
String
name
,
Kind
kind
)
{
public
JavaClassObject
(
String
name
,
Kind
kind
)
{
super
(
URI
.
create
(
"string:///"
+
name
.
replace
(
'.'
,
'/'
)
super
(
URI
.
create
(
"string:///"
+
name
.
replace
(
'.'
,
'/'
)
...
@@ -449,6 +472,9 @@ public class SourceCompiler {
...
@@ -449,6 +472,9 @@ public class SourceCompiler {
*/
*/
static
class
ClassFileManager
extends
ForwardingJavaFileManager
<
StandardJavaFileManager
>
{
static
class
ClassFileManager
extends
ForwardingJavaFileManager
<
StandardJavaFileManager
>
{
/**
* The class (only one class is kept).
*/
JavaClassObject
classObject
;
JavaClassObject
classObject
;
public
ClassFileManager
(
StandardJavaFileManager
standardManager
)
{
public
ClassFileManager
(
StandardJavaFileManager
standardManager
)
{
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论