Java 提高从oracle数据库获取数据时的性能

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

我的数据库表结构如下所示:

课程表:(id(主键)、名称、描述和其他字段)

课程活动关系表:(课程id,活动id)(组合键-两列)

课程格式关系表:(课程id,格式id)(组合键-两列)

课程考试关系表:(课程id,考试id)(组合键-两列)

当前我正在从数据库中获取它,如下所示:

从数据库获取课程:根据条件选择查询课程

在java代码中:将这些数据保存在Map、key:courseId和value:coursedto中

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
.....
.....