【问题标题】:How can I get columns for a specific table using jOOQ without pulling all table metadata into memory?如何在不将所有表元数据拉入内存的情况下使用 jOOQ 获取特定表的列?
【发布时间】:2020-03-23 14:23:38
【问题描述】:

我需要查询实时 MySQL 数据库以检查特定表在特定模式中具有哪些列。以下代码 sn -p 是我现在拥有的:

List<Table<?>> tables = dslContext.meta().getTables();
Set<String> existingFields = null;
for (Table table: tables)
{
    if (table.getSchema().getName().equals(schema) && table.getName().equals(tableToCheck.getName()))
    {
        existingFields = Arrays.stream(table.fields()).map(Field::getName).collect(Collectors.toSet());
        break;
    }
}

这可行,但在针对所有架构中包含约 50,000 个表的数据库实例运行时,它会使用大约 1 GB 的堆空间。将参数传递给 getTables() 不会减少最大内存占用,它只会减少返回的元素数量。将参数传递给meta() 以在该级别进行过滤不适用于我的用例,因为这些版本的方法无法获取实时元信息according to the documentation。使用 jOOQ 是否有更有效的方法来做到这一点?

【问题讨论】:

    标签: java mysql jooq


    【解决方案1】:

    在撰写本文时,我还没有找到使用 jOOQ 执行此操作的方法,但以下代码 sn-p 演示了如何使用 java.sql.DatabaseMetaData 获取特定架构中特定表的列名:

    Set<String> existingFields = new HashSet<>();
    ResultSet columns = connection.getMetaData().getColumns(null, schema, tableToCheck.getName(), null);
    while(columns.next())
    {
        existingFields.add(columns.getString("COLUMN_NAME"));
    }
    

    这种方法在查询问题中提到的数据库实例时只使用了几兆的堆空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多