Java 提高从oracle数据库获取数据时的性能
我的数据库表结构如下所示: 课程表:(id(主键)、名称、描述和其他字段) 课程活动关系表:(课程id,活动id)(组合键-两列) 课程格式关系表:(课程id,格式id)(组合键-两列) 课程考试关系表:(课程id,考试id)(组合键-两列) 当前我正在从数据库中获取它,如下所示: 从数据库获取课程:根据条件选择查询课程 在java代码中:将这些数据保存在Map、key:courseId和value:coursedto中Java 提高从oracle数据库获取数据时的性能,java,sql,oracle,performance,query-performance,Java,Sql,Oracle,Performance,Query Performance,我的数据库表结构如下所示: 课程表:(id(主键)、名称、描述和其他字段) 课程活动关系表:(课程id,活动id)(组合键-两列) 课程格式关系表:(课程id,格式id)(组合键-两列) 课程考试关系表:(课程id,考试id)(组合键-两列) 当前我正在从数据库中获取它,如下所示: 从数据库获取课程:根据条件选择查询课程 在java代码中:将这些数据保存在Map、key:courseId和value:coursedto中 final Map<String, CourseInfo> d
final Map<String, CourseInfo> data = new LinkedHashMap<>();
相关表也可用于所有联接查询:
课程\活动\关系\表格\名称
COURSEID | ACTIVITY ID
---------------------------------------------------------------------------------
couse.01 | act.1
couse.01 | act.2
couse.01 | act.3
couse.02 | act.1
couse.02 | act.3
couse.02 | act.5
.....
.....
这种方法的缺点是
- 当然,插入和更新的成本要高一些
- 主要缺点是我只能将逗号分隔的值最多32000个字符存储为VARCHAR2(32000)。这是Course entity的唯一一个示例,我在应用程序中有许多实体,因此保留CLOB而不是VARCHAR2(32000)不是一个好主意
您能推荐我可以采取的任何其他方法来提高性能,同时显著地获取数据吗 为什么不能将courseId上的所有表连接在一起,然后只执行一个查询?最好的性能改进是让数据库做更多的工作,而不是在多个结果集上循环,或者只有一个表而不是三个<代码>(课程id、类型、类型id)
private static void loadCourseRelatedDataByTable(
final Connection connection,
final String tableName,
final String listFieldName,
final String parentField,
final Map<String, CourseInfo> data)
throws SQLException {
StringBuilder sql = new StringBuilder();
try {
sql.append(SELECT).append(NEW_LINE);
sql.append(listFieldName).append(" , ").append(parentField).append(NEW_LINE);
sql.append(FROM).append(NEW_LINE);
sql.append(tableName).append(NEW_LINE);
sql.append(WHERE).append(NEW_LINE);
sql.append(parentField).append(" in ( ").append(NEW_LINE);
sql.append(getCommaSeperatedString(data.size(), "?")).append(NEW_LINE);
sql.append(")");
try (PreparedStatement statement = connection.prepareStatement(sql.toString())) {
// set the perameter
int counter = 1;
for (String parentId : data.keySet()) {
statement.setString(counter++, parentId);
}
try (ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
String parentId = resultSet.getString(parentField);
String relatedId = resultSet.getString(listFieldName);
CourseInfo info = data.get(parentId);
switch (tableName) {
case COURSE_ACTIVITY_REL_TABLE_NAME:
info.getActivityIds().add(relatedId);
break;
case COURSE_FORMAT_REL_TABLE_NAME:
info.getFormatIds().add(relatedId);
break;
case COURSE_EXAM_REL_TABLE_NAME:
info.getExamIds().add(relatedId);
break;
default:
throw new IllegalArgumentException(
tableName + " : Is not valid realtive table");
}
}
}
}
} catch (SQLException ex) {
StringBuilder message = new StringBuilder();
message.append("\t Related Sql--> ").append(sql).append(NEW_LINE);
// add the cause Message
message.append(ex.getMessage());
throw new SQLException(message.toString(), ex);
}
}
ID | Name | FomatIds | ActivityIds | ExamIds
---------------------------------------------------------------------------------
001 | couse.01 | for.1,for.2 |act.1, act.2, act.3 | exm.1, exm.2, exm3
002 | couse.02 | for.3,for.4 |act.1, act.3, act.5 | exm.1, exm.2, exm3
.....
.....
COURSEID | ACTIVITY ID
---------------------------------------------------------------------------------
couse.01 | act.1
couse.01 | act.2
couse.01 | act.3
couse.02 | act.1
couse.02 | act.3
couse.02 | act.5
.....
.....