Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
36f3c9ef
提交
36f3c9ef
authored
9月 23, 2013
作者:
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;
import
org.h2.value.ValueLobDb
;
/**
* This class stores LOB objects in the database.
*
This is the back-end i.e. the
server side of the LOB storage.
* This class stores LOB objects in the database.
This is the back-end i.e. the
* server side of the LOB storage.
* <p>
* Using the system session
* <p>
* Why do we use the system session to store the data? Some LOB operations can take a very long time.
* If we did them on a normal session, we would be locking the LOB tables for long periods of time,
* which is extremely detrimental to the rest of the system.
* Perhaps when we shift to the MVStore engine, we can revisit this design decision.
* Why do we use the system session to store the data? Some LOB operations can
* take a very long time. If we did them on a normal session, we would be
* locking the LOB tables for long periods of time, which is extremely
* detrimental to the rest of the system. Perhaps when we shift to the MVStore
* engine, we can revisit this design decision.
* <p>
* Locking Discussion
* <p>
* Normally, the locking order in H2 is: first lock the Session object, then 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:
* Normally, the locking order in H2 is: first lock the Session object, then
* 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
...
...
@@ -56,9 +59,11 @@ 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, no-one else can lock on it, and we are safe.
*
* 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,
* no-one else can lock on it, and we are safe.
*/
public
class
LobStorageBackend
implements
LobStorageInterface
{
...
...
@@ -389,12 +394,14 @@ public class LobStorageBackend implements LobStorageInterface {
small
=
new
byte
[
0
];
}
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
();
ValueLobDb
v
=
ValueLobDb
.
createSmallLob
(
type
,
small
,
precision
);
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
();
return
registerLob
(
type
,
lobId
,
LobStorageFrontend
.
TABLE_TEMP
,
length
,
precision
);
}
catch
(
IOException
e
)
{
...
...
@@ -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
)
{
if
(!
Thread
.
holdsLock
(
lock
))
{
throw
DbException
.
throwInternalError
();
...
...
h2/src/main/org/h2/store/fs/FilePathCrypt.java
浏览文件 @
36f3c9ef
h2/src/main/org/h2/table/Table.java
浏览文件 @
36f3c9ef
h2/src/main/org/h2/tools/MultiDimension.java
浏览文件 @
36f3c9ef
h2/src/main/org/h2/util/SourceCompiler.java
浏览文件 @
36f3c9ef
...
...
@@ -44,6 +44,9 @@ import javax.tools.ToolProvider;
*/
public
class
SourceCompiler
{
/**
* The "com.sun.tools.javac.Main" (if available).
*/
static
final
JavaCompiler
JAVA_COMPILER
;
private
static
final
Class
<?>
JAVAC_SUN
;
...
...
@@ -60,6 +63,9 @@ public class SourceCompiler {
*/
final
HashMap
<
String
,
Class
<?>>
compiled
=
New
.
hashMap
();
/**
* Whether to use the ToolProvider.getSystemJavaCompiler().
*/
boolean
useJavaSystemCompiler
=
SysProperties
.
JAVA_SYSTEM_COMPILER
;
static
{
...
...
@@ -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
)
{
if
(
source
.
startsWith
(
"package "
))
{
return
source
;
...
...
@@ -247,6 +262,14 @@ public class SourceCompiler {
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
)
{
String
fullClassName
=
packageName
+
"."
+
className
;
StringWriter
writer
=
new
StringWriter
();
...
...
@@ -427,7 +450,7 @@ public class SourceCompiler {
*/
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
)
{
super
(
URI
.
create
(
"string:///"
+
name
.
replace
(
'.'
,
'/'
)
...
...
@@ -449,6 +472,9 @@ public class SourceCompiler {
*/
static
class
ClassFileManager
extends
ForwardingJavaFileManager
<
StandardJavaFileManager
>
{
/**
* The class (only one class is kept).
*/
JavaClassObject
classObject
;
public
ClassFileManager
(
StandardJavaFileManager
standardManager
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论