繁体   English   中英

如何在不将所有表元数据拉入内存的情况下使用 jOOQ 获取特定表的列?

[英]How can I get columns for a specific table using jOOQ without pulling all table metadata into memory?

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

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()以在该级别进行过滤对我的用例不起作用,因为根据文档,该方法的那些版本无法获取实时元信息。 使用 jOOQ 是否有更有效的方法来做到这一点?

在撰写本文时,我还没有找到使用 jOOQ 执行此操作的方法,但以下代码片段演示了如何使用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"));
}

该方法在查询问题中提到的数据库实例时仅使用几兆字节的堆空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM