如何使用jOOQ获取特定表的列,而又不将所有表元数据拉入内存?

时间:2019-11-28 00:27:20

标签: java mysql jooq

我需要查询一个实时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;
    }
}

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

1 个答案:

答案 0 :(得分:2)

在撰写本文时,我还没有找到使用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"));
}

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