Java IBM Domino中的大数据检索
我试图从IBMDominoV9.0收集帐户数据和组数据 我为收集数据而编写的代码使用了lotus.domino.View API。这段代码对于一个小数据集来说效果很好,我为40个用户运行了这段代码,结果很好。当我运行代码为10k用户提取数据时,提取数据大约需要3-4小时,这是不可接受的 你能给我推荐一些其他的API吗?我们可以用它更快地检索数据 我目前使用的代码如下:Java IBM Domino中的大数据检索,java,lotus-domino,data-retrieval,Java,Lotus Domino,Data Retrieval,我试图从IBMDominoV9.0收集帐户数据和组数据 我为收集数据而编写的代码使用了lotus.domino.View API。这段代码对于一个小数据集来说效果很好,我为40个用户运行了这段代码,结果很好。当我运行代码为10k用户提取数据时,提取数据大约需要3-4小时,这是不可接受的 你能给我推荐一些其他的API吗?我们可以用它更快地检索数据 我目前使用的代码如下: private static void testUserDataRetrieval(String host, String us
private static void testUserDataRetrieval(String host, String userName, String password) throws Exception{
Session s = NotesFactory.createSession(host, userName, password);
Database db = s.getDatabase(s.getServerName(), "names");
File outFile = new File("C:\\Users\\vishva\\Desktop\\dominoExtract.txt");
FileWriter writer = new FileWriter(outFile);
View view = db.getView("($Users)");
ViewEntryCollection entryCollection = view.getAllEntries();
writer.write("\n--------------------------------- Printing data for view:"+view.getName()+"("+view.getEntryCount()+")--------------------------------------------");
Vector<Object> columnNames = view.getColumnNames();
for(int i = 0; i< entryCollection.getCount(); i++){
ViewEntry entry = entryCollection.getNextEntry();
if(entry == null) continue;
Vector<Object> colValues = entry.getColumnValues();
for(int j = 0; j < columnNames.size(); j++)
writer.write("\n"+columnNames.get(j)+":"+colValues.get(j));
writer.write("\n*****************************************");
}
writer.flush();
writer.close();
}
请让我知道我应该使用哪个其他API来提高数据检索的速度?首先:您读取for循环每次运行时的收集计数。这使得它非常慢。for循环根本不是必需的。第二:你从不回收物品。在使用domino对象时,这是必须的,否则代码消耗内存的速度将超出您的想象:
private static void testUserDataRetrieval(String host, String userName, String password) throws Exception{
Session s = NotesFactory.createSession(host, userName, password);
Database db = s.getDatabase(s.getServerName(), "names");
File outFile = new File("C:\\Users\\vishva\\Desktop\\dominoExtract.txt");
FileWriter writer = new FileWriter(outFile);
View view = db.getView("($Users)");
ViewEntryCollection entryCollection = view.getAllEntries();
writer.write("\n--------------------------------- Printing data for view:"+view.getName()+"("+view.getEntryCount()+")--------------------------------------------");
Vector<Object> columnNames = view.getColumnNames();
ViewEntry entry = entryCollection.getFirstEntry();
ViewEntry entryNext;
while(entry != null) {
Vector<Object> colValues = entry.getColumnValues();
for(int j = 0; j < columnNames.size(); j++)
writer.write("\n"+columnNames.get(j)+":"+colValues.get(j));
writer.write("\n*****************************************");
entryNext = entryCollection.getNextEntry();
entry.recycle();
entry = entryNext ;
}
writer.flush();
writer.close();
}默认情况下,视图对象的isAutoUpdate属性设置为true。这意味着它可以处理在后端发生的任何更改,而不仅仅是给您一个一次性快照。添加以下内容:
view.setAutoUpdate(false);
此外,您可能还应该研究如何使用ViewNavigator类。有关从Domino8.5.2开始该类性能改进的详细文章,请参阅。它是由首席开发人员为这些类编写的。还有很多有趣的细节,请参见本页。感谢大家的意见。 为了检索用户,我后来试用了LDAP API,效果很好。我能够在23秒内检索到10万个帐户,这是可以接受的。我使用的代码如下
private void extractDominoDataViaLdap(){
String [] args = new String[]{"192.168.21.156","Administrator","password","","C:\\Users\\vishva\\Desktop"};
String server = args[0];
String userName = args[1];
String password = args[2];
String baseDN = args[3];
String fileLocation = args[4];
// Set up environment for creating initial context
Hashtable<String, Object> env = new Hashtable<String, Object>(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://"+server+":389");
long time = System.currentTimeMillis();
// Authenticate as S. User and password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, userName);
env.put(Context.SECURITY_CREDENTIALS, password);
FileWriter writer = null;
BufferedWriter out = null;
try {
DirContext ctx = new InitialDirContext(env);
//fetching user data
// Create the search controls
SearchControls searchCtls = new SearchControls();
// Specify the attributes to return
String returnedAtts[] = {"FullName","dn","displayname","givenName","sn","location","mail","mailfile","mailserver"};
searchCtls.setReturningAttributes(returnedAtts);
// Specify the search scope
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchCtls.setCountLimit(0);
// specify the LDAP search filter
String searchFilter = "objectClass=inetOrgPerson";
// Specify the Base for the search
String searchBase = baseDN;
// Search for objects using the filter
NamingEnumeration<SearchResult> answer = ctx.search(searchBase,searchFilter, searchCtls);
writer = new FileWriter(fileLocation+"\\users.csv");
out = new BufferedWriter(writer);
for(String attr : returnedAtts)
out.write(attr+",");
out.write("\n");
int count = 0;
// Loop through the search results
while (answer.hasMoreElements()) {
++count;
SearchResult sr = (SearchResult) answer.next();
Attributes attrs = sr.getAttributes();
StringBuilder sb = new StringBuilder();
for(String attr : returnedAtts)
sb.append("\""+((attrs.get(attr) != null)?attrs.get(attr).get():"")+"\"").append(",");
out.write(sb.toString()+"\n");
out.flush();
}
System.out.println("# of users returned: "+count);
out.close();
writer.close();
}
}
让选民解释一下