提交 6e74c6eb authored 作者: Thomas Mueller's avatar Thomas Mueller

Avoid concurrency problems

上级 c26f2c09
......@@ -10,7 +10,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import org.h2.command.Command;
......@@ -588,11 +587,7 @@ public class Session extends SessionWithState {
}
if (transaction != null) {
long savepointId = savepoint == null ? 0 : savepoint.transactionSavepoint;
List<MVTable> tables = database.getMvStore().getTables();
HashMap<String, MVTable> tableMap = New.hashMap();
for (MVTable t : tables) {
tableMap.put(t.getMapName(), t);
}
HashMap<String, MVTable> tableMap = database.getMvStore().getTables();
Iterator<Change> it = transaction.getChanges(savepointId);
while (it.hasNext()) {
Change c = it.next();
......
......@@ -10,8 +10,9 @@ import java.io.InputStream;
import java.lang.Thread.UncaughtExceptionHandler;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.h2.api.TableEngine;
import org.h2.command.ddl.CreateTableData;
......@@ -108,8 +109,8 @@ public class MVTableEngine implements TableEngine {
}
Store store = init(db);
MVTable table = new MVTable(data, store);
store.openTables.add(table);
table.init(data.session);
store.tableMap.put(table.getMapName(), table);
return table;
}
......@@ -124,9 +125,10 @@ public class MVTableEngine implements TableEngine {
final Database db;
/**
* The list of open tables.
* The map of open tables.
* Key: the map name, value: the table.
*/
final List<MVTable> openTables = Collections.synchronizedList(new ArrayList<MVTable>());
final ConcurrentHashMap<String, MVTable> tableMap = new ConcurrentHashMap<String, MVTable>();
/**
* The store.
......@@ -153,8 +155,8 @@ public class MVTableEngine implements TableEngine {
return transactionStore;
}
public List<MVTable> getTables() {
return new ArrayList<MVTable>(openTables);
public HashMap<String, MVTable> getTables() {
return new HashMap<String, MVTable>(tableMap);
}
/**
......@@ -163,7 +165,7 @@ public class MVTableEngine implements TableEngine {
* @param table the table
*/
public void removeTable(MVTable table) {
openTables.remove(table);
tableMap.remove(table.getMapName());
}
/**
......@@ -229,7 +231,7 @@ public class MVTableEngine implements TableEngine {
}
public void setCacheSize(int kb) {
store.setCacheSize(kb * 1024);
store.setCacheSize(Math.max(1, kb / 1024));
}
public InputStream getInputStream() {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论