|
@@ -8,9 +8,11 @@ import org.hswebframework.web.database.manager.SqlExecuteResult;
|
|
|
import org.hswebframework.web.database.manager.meta.ObjectMetadata;
|
|
|
import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParser;
|
|
|
import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParserRegister;
|
|
|
+import org.hswebframework.web.database.manager.sql.TransactionInfo;
|
|
|
import org.hswebframework.web.datasource.DataSourceHolder;
|
|
|
import org.hswebframework.web.datasource.DatabaseType;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.annotation.Scope;
|
|
|
import org.springframework.transaction.support.TransactionTemplate;
|
|
|
|
|
|
import javax.annotation.PostConstruct;
|
|
@@ -22,27 +24,32 @@ import java.util.concurrent.Executors;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
- *
|
|
|
* @author zhouhao
|
|
|
*/
|
|
|
@Slf4j
|
|
|
-public class SimpleDatabaseManagerService implements DatabaseManagerService,MetaDataParserRegister {
|
|
|
+public class SimpleDatabaseManagerService implements DatabaseManagerService, MetaDataParserRegister {
|
|
|
|
|
|
private Map<String, TransactionExecutor> transactionExecutorMap = new ConcurrentHashMap<>();
|
|
|
|
|
|
+ private Map<String, TransactionInfo> transactionInfoMap = new ConcurrentHashMap<>();
|
|
|
+
|
|
|
private ExecutorService executorService;
|
|
|
|
|
|
private SqlExecutor sqlExecutor;
|
|
|
|
|
|
private TransactionTemplate transactionTemplate;
|
|
|
|
|
|
- private Map<DatabaseType,Map<ObjectMetadata.ObjectType,MetaDataParser<? extends ObjectMetadata>>> parserRepo=new HashMap<>();
|
|
|
+ private Map<DatabaseType, Map<ObjectMetadata.ObjectType, MetaDataParser<? extends ObjectMetadata>>> parserRepo = new HashMap<>();
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<TransactionInfo> allTransaction() {
|
|
|
+ return new ArrayList<>(transactionInfoMap.values());
|
|
|
+ }
|
|
|
|
|
|
@PostConstruct
|
|
|
public void init() {
|
|
|
if (executorService == null) {
|
|
|
- executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);
|
|
|
+ executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -67,6 +74,10 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService,Meta
|
|
|
DefaultLocalTransactionExecutor executor = new DefaultLocalTransactionExecutor(sqlExecutor, id, datasourceId, transactionTemplate);
|
|
|
transactionExecutorMap.put(id, executor);
|
|
|
executorService.submit(executor);
|
|
|
+ TransactionInfo info = new TransactionInfo();
|
|
|
+ info.setId(id);
|
|
|
+ info.setCreateTime(new Date());
|
|
|
+ transactionInfoMap.put(id, info);
|
|
|
return id;
|
|
|
}
|
|
|
|
|
@@ -77,26 +88,39 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService,Meta
|
|
|
|
|
|
@Override
|
|
|
public void commit(String transactionId) {
|
|
|
- TransactionExecutor executor = transactionExecutorMap.get(transactionId);
|
|
|
- if (executor != null) {
|
|
|
- executor.commit();
|
|
|
+ try {
|
|
|
+ TransactionExecutor executor = transactionExecutorMap.get(transactionId);
|
|
|
+ if (executor != null) {
|
|
|
+ executor.commit();
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ transactionExecutorMap.remove(transactionId);
|
|
|
+ transactionInfoMap.remove(transactionId);
|
|
|
}
|
|
|
- transactionExecutorMap.remove(transactionId);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void rollback(String transactionId) {
|
|
|
- TransactionExecutor executor = transactionExecutorMap.get(transactionId);
|
|
|
- if (executor != null) {
|
|
|
- executor.rollback();
|
|
|
+ try {
|
|
|
+ TransactionExecutor executor = transactionExecutorMap.get(transactionId);
|
|
|
+ if (executor != null) {
|
|
|
+ executor.rollback();
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ transactionExecutorMap.remove(transactionId);
|
|
|
+ transactionInfoMap.remove(transactionId);
|
|
|
}
|
|
|
- transactionExecutorMap.remove(transactionId);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public List<SqlExecuteResult> execute(String transactionId, SqlExecuteRequest request) throws Exception {
|
|
|
TransactionExecutor executor = transactionExecutorMap.get(transactionId);
|
|
|
if (executor != null) {
|
|
|
+ TransactionInfo info = transactionInfoMap.get(transactionId);
|
|
|
+ if (null != info) {
|
|
|
+ info.setLastExecuteTime(new Date());
|
|
|
+ info.getSqlHistory().addAll(request.getSql());
|
|
|
+ }
|
|
|
return executor.execute(request);
|
|
|
}
|
|
|
return null;
|
|
@@ -108,16 +132,16 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService,Meta
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public Map<ObjectMetadata.ObjectType, List<? extends ObjectMetadata>> getMetas(String datasourceId) {
|
|
|
+ public Map<ObjectMetadata.ObjectType, List<? extends ObjectMetadata>> getMetas() {
|
|
|
return parserRepo
|
|
|
- .computeIfAbsent(DataSourceHolder.dataSource(datasourceId).getType(),t->new HashMap<>())
|
|
|
+ .computeIfAbsent(DataSourceHolder.currentDatabaseType(), t -> new HashMap<>())
|
|
|
.entrySet()
|
|
|
.parallelStream()
|
|
|
- .collect(Collectors.toMap(Map.Entry::getKey, entry->{
|
|
|
+ .collect(Collectors.toMap(Map.Entry::getKey, entry -> {
|
|
|
try {
|
|
|
return entry.getValue().parseAll();
|
|
|
} catch (SQLException e) {
|
|
|
- log.error("parse meta {} error",entry.getKey(),e);
|
|
|
+ log.error("parse meta {} error", entry.getKey(), e);
|
|
|
return new ArrayList<>();
|
|
|
}
|
|
|
}));
|
|
@@ -125,7 +149,7 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService,Meta
|
|
|
|
|
|
@Override
|
|
|
public <M extends ObjectMetadata> void registerMetaDataParser(DatabaseType databaseType, ObjectMetadata.ObjectType objectType, MetaDataParser<M> parser) {
|
|
|
- parserRepo.computeIfAbsent(databaseType,t->new HashMap<>())
|
|
|
- .put(objectType,parser);
|
|
|
+ parserRepo.computeIfAbsent(databaseType, t -> new HashMap<>())
|
|
|
+ .put(objectType, parser);
|
|
|
}
|
|
|
}
|