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

Avoid concurrency problems

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