09051901:对这个资产展示使用线程池的方法去做,第二次优化代码

master
冷调 2024-09-05 19:01:09 +08:00
parent 25ea324d30
commit 08453fdbd2
1 changed files with 114 additions and 48 deletions

View File

@ -16,7 +16,9 @@ import org.springframework.stereotype.Service;
import java.sql.*; import java.sql.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@ -35,6 +37,9 @@ import static com.muyu.source.pool.config.BaseConfig.SELECTALL;
@Service @Service
public class DataValueServiceImpl extends ServiceImpl<DataValueMapper, DataValue> implements DataValueService { public class DataValueServiceImpl extends ServiceImpl<DataValueMapper, DataValue> implements DataValueService {
private static final int THREAD_POOL_SIZE = 10;
private static final ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
@Autowired @Autowired
private DataSourceService dataSourceService; private DataSourceService dataSourceService;
@Override @Override
@ -123,54 +128,53 @@ public class DataValueServiceImpl extends ServiceImpl<DataValueMapper, DataValue
// mysqlPool.closeConn(); // mysqlPool.closeConn();
// return list; // return list;
// } // }
private static final int THREAD_POOL_SIZE = 10; //
private static final ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE); //@Override
@Override //public List<DataValue> findTableValueByTableName(Long basicId, String tableName) {
public List<DataValue> findTableValueByTableName(Long basicId, String tableName) { // MysqlQuery mySqlQuery = new MysqlQuery();
MysqlQuery mySqlQuery = new MysqlQuery(); // mySqlQuery.setDataSourceId(String.valueOf(basicId));
mySqlQuery.setDataSourceId(String.valueOf(basicId)); // DataSource etlDataScore = dataSourceService.getById(basicId);
DataSource etlDataScore = dataSourceService.getById(basicId); // MysqlPool mysqlPool = new MysqlPool(etlDataScore);
MysqlPool mysqlPool = new MysqlPool(etlDataScore); // mysqlPool.init();
mysqlPool.init(); // Connection conn = mysqlPool.getConn();
Connection conn = mysqlPool.getConn(); //
// List<DataValue> list = new ArrayList<>();
List<DataValue> list = new ArrayList<>(); //
// try {
try { // PreparedStatement preparedStatement = conn.prepareStatement(SELECTALL + tableName);
PreparedStatement preparedStatement = conn.prepareStatement(SELECTALL + tableName); // ResultSet resultSet = preparedStatement.executeQuery();
ResultSet resultSet = preparedStatement.executeQuery(); // ResultSetMetaData metaData = resultSet.getMetaData();
ResultSetMetaData metaData = resultSet.getMetaData(); // int columnCount = metaData.getColumnCount();
int columnCount = metaData.getColumnCount(); //
// while (resultSet.next()) {
while (resultSet.next()) { // for (int i = 1; i <= columnCount; i++) {
for (int i = 1; i <= columnCount; i++) { // final int index = i;
final int index = i; // Future<DataValue> future = executorService.submit(() -> {
Future<DataValue> future = executorService.submit(() -> { // String columnTypeName = metaData.getColumnTypeName(index);
String columnTypeName = metaData.getColumnTypeName(index); // DatabaseMetaData metaDataColumns = conn.getMetaData();
DatabaseMetaData metaDataColumns = conn.getMetaData(); // ResultSet columns = metaDataColumns.getColumns(null, null, metaData.getTableName(index), metaData.getColumnName(index));
ResultSet columns = metaDataColumns.getColumns(null, null, metaData.getTableName(index), metaData.getColumnName(index)); // String remarks = null;
String remarks = null; // while (columns.next()) {
while (columns.next()) { // remarks = columns.getString("REMARKS");
remarks = columns.getString("REMARKS"); // }
} // return DataValue.builder()
return DataValue.builder() // .key(metaData.getColumnName(index))
.key(metaData.getColumnName(index)) // .label(remarks)
.label(remarks) // .value(resultSet.getObject(index, DataType.convertType(columnTypeName)))
.value(resultSet.getObject(index, DataType.convertType(columnTypeName))) // .type(DataType.convertTypeString(columnTypeName))
.type(DataType.convertTypeString(columnTypeName)) // .build();
.build(); // });
}); // list.add(future.get());
list.add(future.get()); // }
} // }
} // } catch (SQLException | InterruptedException | ExecutionException e) {
} catch (SQLException | InterruptedException | ExecutionException e) { // throw new RuntimeException(e);
throw new RuntimeException(e); // } finally {
} finally { // mysqlPool.replease(conn);
mysqlPool.replease(conn); // mysqlPool.closeConn();
mysqlPool.closeConn(); // }
} // return list;
return list; //}
}
@Override @Override
public Integer addTableValue(DataValueModel dataValueModel) { public Integer addTableValue(DataValueModel dataValueModel) {
@ -187,4 +191,66 @@ public List<DataValue> findTableValueByTableName(Long basicId, String tableName)
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
@Override
public List<DataValue> findTableValueByTableName(Long basicId, String tableName) {
MysqlQuery mySqlQuery = new MysqlQuery();
mySqlQuery.setDataSourceId(String.valueOf(basicId));
DataSource etlDataScore = dataSourceService.getById(basicId);
MysqlPool mysqlPool = new MysqlPool(etlDataScore);
mysqlPool.init();
Connection conn = mysqlPool.getConn();
List<DataValue> list = new ArrayList<>();
ExecutorService threadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
try {
PreparedStatement preparedStatement = conn.prepareStatement(SELECTALL + tableName);
ResultSet resultSet = preparedStatement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
// Pre-fetch column details
Map<Integer, String> columnRemarks = new HashMap<>();
DatabaseMetaData metaDataColumns = conn.getMetaData();
for (int i = 1; i <= columnCount; i++) {
ResultSet columns = metaDataColumns.getColumns(null, null, metaData.getTableName(i), metaData.getColumnName(i));
if (columns.next()) {
columnRemarks.put(i, columns.getString("REMARKS"));
}
}
List<Future<DataValue>> futures = new ArrayList<>();
while (resultSet.next()) {
for (int i = 1; i <= columnCount; i++) {
final int index = i;
futures.add(threadPool.submit(() -> {
String columnTypeName = metaData.getColumnTypeName(index);
return DataValue.builder()
.key(metaData.getColumnName(index))
.label(columnRemarks.getOrDefault(index, ""))
.value(resultSet.getObject(index, DataType.convertType(columnTypeName)))
.type(DataType.convertTypeString(columnTypeName))
.build();
}));
}
}
// Collect results
for (Future<DataValue> future : futures) {
try {
list.add(future.get());
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
threadPool.shutdown();
mysqlPool.replease(conn);
mysqlPool.closeConn();
}
return list;
}
} }