Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
13ab7e1e
提交
13ab7e1e
authored
7 年前
作者:
andrei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ensure Engine.close() is called
上级
cebf433e
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
132 行增加
和
127 行删除
+132
-127
Database.java
h2/src/main/org/h2/engine/Database.java
+90
-88
Engine.java
h2/src/main/org/h2/engine/Engine.java
+29
-25
TestOutOfMemory.java
h2/src/test/org/h2/test/db/TestOutOfMemory.java
+13
-14
没有找到文件。
h2/src/main/org/h2/engine/Database.java
浏览文件 @
13ab7e1e
...
@@ -1256,6 +1256,7 @@ public class Database implements DataHandler {
...
@@ -1256,6 +1256,7 @@ public class Database implements DataHandler {
* hook
* hook
*/
*/
void
close
(
boolean
fromShutdownHook
)
{
void
close
(
boolean
fromShutdownHook
)
{
try
{
synchronized
(
this
)
{
synchronized
(
this
)
{
if
(
closing
)
{
if
(
closing
)
{
return
;
return
;
...
@@ -1270,7 +1271,6 @@ public class Database implements DataHandler {
...
@@ -1270,7 +1271,6 @@ public class Database implements DataHandler {
// ignore
// ignore
}
}
traceSystem
.
close
();
traceSystem
.
close
();
Engine
.
getInstance
().
close
(
databaseName
);
return
;
return
;
}
}
closing
=
true
;
closing
=
true
;
...
@@ -1350,7 +1350,6 @@ public class Database implements DataHandler {
...
@@ -1350,7 +1350,6 @@ public class Database implements DataHandler {
}
}
closeOnExit
=
null
;
closeOnExit
=
null
;
}
}
Engine
.
getInstance
().
close
(
databaseName
);
if
(
deleteFilesOnDisconnect
&&
persistent
)
{
if
(
deleteFilesOnDisconnect
&&
persistent
)
{
deleteFilesOnDisconnect
=
false
;
deleteFilesOnDisconnect
=
false
;
try
{
try
{
...
@@ -1361,6 +1360,9 @@ public class Database implements DataHandler {
...
@@ -1361,6 +1360,9 @@ public class Database implements DataHandler {
// ignore (the trace is closed already)
// ignore (the trace is closed already)
}
}
}
}
}
finally
{
Engine
.
getInstance
().
close
(
databaseName
);
}
}
}
private
void
removeOrphanedLobs
()
{
private
void
removeOrphanedLobs
()
{
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/engine/Engine.java
浏览文件 @
13ab7e1e
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
*/
*/
package
org
.
h2
.
engine
;
package
org
.
h2
.
engine
;
import
java.util.Hash
table
;
import
java.util.Hash
Map
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.Objects
;
import
org.h2.api.ErrorCode
;
import
org.h2.api.ErrorCode
;
...
@@ -28,7 +28,7 @@ import org.h2.util.Utils;
...
@@ -28,7 +28,7 @@ import org.h2.util.Utils;
public
class
Engine
implements
SessionFactory
{
public
class
Engine
implements
SessionFactory
{
private
static
final
Engine
INSTANCE
=
new
Engine
();
private
static
final
Engine
INSTANCE
=
new
Engine
();
private
static
final
Map
<
String
,
Database
>
DATABASES
=
new
Hash
table
<>();
private
static
final
Map
<
String
,
Database
>
DATABASES
=
new
Hash
Map
<>();
private
volatile
long
wrongPasswordDelay
=
private
volatile
long
wrongPasswordDelay
=
SysProperties
.
DELAY_WRONG_PASSWORD_MIN
;
SysProperties
.
DELAY_WRONG_PASSWORD_MIN
;
...
@@ -51,13 +51,14 @@ public class Engine implements SessionFactory {
...
@@ -51,13 +51,14 @@ public class Engine implements SessionFactory {
Database
database
;
Database
database
;
ci
.
removeProperty
(
"NO_UPGRADE"
,
false
);
ci
.
removeProperty
(
"NO_UPGRADE"
,
false
);
boolean
openNew
=
ci
.
getProperty
(
"OPEN_NEW"
,
false
);
boolean
openNew
=
ci
.
getProperty
(
"OPEN_NEW"
,
false
);
boolean
opened
=
false
;
User
user
=
null
;
synchronized
(
DATABASES
)
{
if
(
openNew
||
ci
.
isUnnamedInMemory
())
{
if
(
openNew
||
ci
.
isUnnamedInMemory
())
{
database
=
null
;
database
=
null
;
}
else
{
}
else
{
database
=
DATABASES
.
get
(
name
);
database
=
DATABASES
.
get
(
name
);
}
}
User
user
=
null
;
boolean
opened
=
false
;
if
(
database
==
null
)
{
if
(
database
==
null
)
{
if
(
ifExists
&&
!
Database
.
exists
(
name
))
{
if
(
ifExists
&&
!
Database
.
exists
(
name
))
{
throw
DbException
.
get
(
ErrorCode
.
DATABASE_NOT_FOUND_1
,
name
);
throw
DbException
.
get
(
ErrorCode
.
DATABASE_NOT_FOUND_1
,
name
);
...
@@ -77,6 +78,7 @@ public class Engine implements SessionFactory {
...
@@ -77,6 +78,7 @@ public class Engine implements SessionFactory {
DATABASES
.
put
(
name
,
database
);
DATABASES
.
put
(
name
,
database
);
}
}
}
}
}
if
(
opened
)
{
if
(
opened
)
{
// start the thread when already synchronizing on the database
// start the thread when already synchronizing on the database
// otherwise a deadlock can occur when the writer thread
// otherwise a deadlock can occur when the writer thread
...
@@ -273,8 +275,10 @@ public class Engine implements SessionFactory {
...
@@ -273,8 +275,10 @@ public class Engine implements SessionFactory {
throw
DbException
.
get
(
ErrorCode
.
FEATURE_NOT_SUPPORTED_1
,
e
,
"JMX"
);
throw
DbException
.
get
(
ErrorCode
.
FEATURE_NOT_SUPPORTED_1
,
e
,
"JMX"
);
}
}
}
}
synchronized
(
DATABASES
)
{
DATABASES
.
remove
(
name
);
DATABASES
.
remove
(
name
);
}
}
}
/**
/**
* This method is called after validating user name and password. If user
* This method is called after validating user name and password. If user
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/db/TestOutOfMemory.java
浏览文件 @
13ab7e1e
...
@@ -118,10 +118,7 @@ public class TestOutOfMemory extends TestBase {
...
@@ -118,10 +118,7 @@ public class TestOutOfMemory extends TestBase {
ErrorCode
.
DATABASE_IS_CLOSED
==
e
.
getErrorCode
()
||
ErrorCode
.
DATABASE_IS_CLOSED
==
e
.
getErrorCode
()
||
ErrorCode
.
GENERAL_ERROR_1
==
e
.
getErrorCode
());
ErrorCode
.
GENERAL_ERROR_1
==
e
.
getErrorCode
());
}
}
for
(
int
i
=
0
;
i
<
5
;
i
++)
{
recoverAfterOOM
();
System
.
gc
();
Thread
.
sleep
(
20
);
}
try
{
try
{
conn
.
close
();
conn
.
close
();
fail
();
fail
();
...
@@ -132,10 +129,7 @@ public class TestOutOfMemory extends TestBase {
...
@@ -132,10 +129,7 @@ public class TestOutOfMemory extends TestBase {
ErrorCode
.
DATABASE_IS_CLOSED
==
e
.
getErrorCode
()
||
ErrorCode
.
DATABASE_IS_CLOSED
==
e
.
getErrorCode
()
||
ErrorCode
.
GENERAL_ERROR_1
==
e
.
getErrorCode
());
ErrorCode
.
GENERAL_ERROR_1
==
e
.
getErrorCode
());
}
}
for
(
int
i
=
0
;
i
<
5
;
i
++)
{
recoverAfterOOM
();
System
.
gc
();
Thread
.
sleep
(
20
);
}
conn
=
DriverManager
.
getConnection
(
url
);
conn
=
DriverManager
.
getConnection
(
url
);
stat
=
conn
.
createStatement
();
stat
=
conn
.
createStatement
();
stat
.
execute
(
"SELECT 1"
);
stat
.
execute
(
"SELECT 1"
);
...
@@ -146,14 +140,18 @@ public class TestOutOfMemory extends TestBase {
...
@@ -146,14 +140,18 @@ public class TestOutOfMemory extends TestBase {
}
}
}
}
private
void
testUpdateWhenNearlyOutOfMemory
()
throws
SQLException
,
InterruptedException
{
private
static
void
recoverAfterOOM
()
throws
InterruptedException
{
if
(
config
.
memory
)
{
return
;
}
for
(
int
i
=
0
;
i
<
5
;
i
++)
{
for
(
int
i
=
0
;
i
<
5
;
i
++)
{
System
.
gc
();
System
.
gc
();
Thread
.
sleep
(
20
);
Thread
.
sleep
(
20
);
}
}
}
private
void
testUpdateWhenNearlyOutOfMemory
()
throws
SQLException
,
InterruptedException
{
if
(
config
.
memory
)
{
return
;
}
recoverAfterOOM
();
deleteDb
(
"outOfMemory"
);
deleteDb
(
"outOfMemory"
);
Connection
conn
=
getConnection
(
"outOfMemory;MAX_OPERATION_MEMORY=1000000"
);
Connection
conn
=
getConnection
(
"outOfMemory;MAX_OPERATION_MEMORY=1000000"
);
Statement
stat
=
conn
.
createStatement
();
Statement
stat
=
conn
.
createStatement
();
...
@@ -171,11 +169,12 @@ public class TestOutOfMemory extends TestBase {
...
@@ -171,11 +169,12 @@ public class TestOutOfMemory extends TestBase {
fail
();
fail
();
}
catch
(
DbException
ex
)
{
}
catch
(
DbException
ex
)
{
freeMemory
();
freeMemory
();
assert
Equals
(
ErrorCode
.
OUT_OF_MEMORY
,
ex
.
getErrorCode
());
assert
True
(
ErrorCode
.
OUT_OF_MEMORY
==
ex
.
getErrorCode
()
||
ErrorCode
.
GENERAL_ERROR_1
==
ex
.
getErrorCode
());
}
catch
(
SQLException
ex
)
{
}
catch
(
SQLException
ex
)
{
freeMemory
();
freeMemory
();
assert
Equals
(
ErrorCode
.
OUT_OF_MEMORY
,
ex
.
getErrorCode
());
assert
True
(
ErrorCode
.
OUT_OF_MEMORY
==
ex
.
getErrorCode
()
||
ErrorCode
.
GENERAL_ERROR_1
==
ex
.
getErrorCode
());
}
}
recoverAfterOOM
();
try
{
try
{
conn
.
close
();
conn
.
close
();
fail
();
fail
();
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论