以编程方式导入LDIF批量导入

时间:2014-01-15 15:12:59

标签: java ldap unboundid-ldap-sdk

我希望能够从LDIF文件批量导入到LDAP服务器。我有一个使用UnboundID LDAP SDK的工作实现(如下)。这样做的问题是它遍历LDIF中的每个条目,对于大文件(数百万条目)来说非常慢。是否有任何工具/ SDK可用于高速导入?我需要能够以编程方式实现(最好是java)。

public static void importLdif(){
try{
    LDAPConnection connection = new LDAPConnection("ldapserver.com", 389,
            "uid=admin,ou=system", "secret");
    LDIFReader ldifReader = new LDIFReader("C:/Users/ejamcud/Desktop/LDAP/ldifs/Sailors.ldif");

    int entriesRead = 0;
    int entriesAdded = 0;
    int errorsEncountered = 0;
    Entry entry;
    LDAPResult addResult;
    while (true)
    {
        try
        {
            entry = ldifReader.readEntry();
            if (entry == null)
            {
                System.out.println("All entries have been read.");
                break;
            }

            entriesRead++;
        }
        catch (LDIFException le)
        {
            errorsEncountered++;
            if (le.mayContinueReading())
            {
                // A recoverable error occurred while attempting to read a change
                // record, at or near line number le.getLineNumber()
                // The entry will be skipped, but we'll try to keep reading from the
                // LDIF file.
                continue;
            }
            else
            {
                // An unrecoverable error occurred while attempting to read an entry
                // at or near line number le.getLineNumber()
                // No further LDIF processing will be performed.
                break;
            }
        }
        catch (IOException ioe)
        {
            // An I/O error occurred while attempting to read from the LDIF file.
            // No further LDIF processing will be performed.
            errorsEncountered++;
            break;
        }

        try
        {
            addResult = connection.add(entry);
            // If we got here, then the change should have been processed
            // successfully.
            System.out.println(entry.toLDIFString());

            entriesAdded++;
        }
        catch (LDAPException le)
        {
            // If we got here, then the change attempt failed.
            le.printStackTrace();
            addResult = le.toLDAPResult();
            errorsEncountered++;
        }
    }

}catch(IOException ioe){
    ioe.printStackTrace();
}
catch(LDAPException lde){
    lde.printStackTrace();
}finally{
    //ldifReader.close();
}
}

1 个答案:

答案 0 :(得分:2)

这实际上取决于您正在使用的目录服务器。某些服务器在某些条件下为批量添加提供支持,因此您可能希望查看您正在使用的服务器是否属于这种情况。但是如果你想要一些标准的LDAP,那么你最好的选择是使用多个线程来并行化向服务器添加条目的过程。

如果您要添加的条目已经存在所有父条目(即,您没有添加分层结构,只有叶条目),那么使用UnboundID LDAP SDK将流程并行化将非常简单多线程。 LDIF阅读器已经支持使用多个线程来并行化读取和解码LDIF记录的过程(使用允许您指定解析线程数的LDIFReader构造函数),并且可以将其与执行LDAP添加的LDIFReaderEntryTranslator结合使用已阅读的条目。

如果您需要添加具有层次结构的数据,那么并行化该过程会更复杂,因为在添加其父项之前无法添加子项。但是,您仍然可以通过跟踪当前添加的条目并使用某种锁定机制来实现非常好的并行性,这样在添加完父级之前就无法添加子级。这可能不会像你不需要任何锁定一样快,但你仍然可以在不同的子树中并行添加。