
folder.getMessagesByUid(lastStoredUID, UIDFolder.LastUID)
或者获取未读消息的数量需要太多时间,因为大量的文件夹. (我们必须迭代400个文件夹)
为了提高性能,我们在线程中使用了paralel工作连接,我们有一个SESSION实例,但每个线程(连接)都有自己的STORE实例.当我们必须获取新消息时,我们动态生成10个线程及其STORE实例,分别连接/登录它们,在该STORE上获取文件夹实例,打开文件夹,执行文件夹操作,关闭文件夹并在之后关闭SESSION.但对我来说还不清楚,我是否必须保持文件夹的内容,而且我不清楚文件夹是应该保持打开还是我们应该明确地关闭,或者我们可以保持所有打开(将关闭操作留给邮件服务器).
在我目前的实施中,
new Thread() {
public void run() {
//Get a new store instance
Store tempStore = MySingleSession.getStore("imap");
tempStore.connect(..);
//Get a folder for example inbox
Folder inbox = tempStore.get("INBOX");
inbox.open(Folder.READ);
// Perform get new messages
inbox.getMessagesByUd(lastUID, UIDFolder.MaxUID);
inbox.close();
tempStore.close();
..
检查性能时,我发现打开/关闭文件夹需要很长时间,特别是对于超过100.000条消息的文件夹.我看到即使我关闭文件夹的存储,文件夹仍然打开,如果我们没有明确关闭该文件夹,我们可以对其进行操作.如果我改变我的实现并且不明确关闭文件夹并保持它们打开,那么这种机制的缺点是什么?
>例如,将文件夹引用保存在以其全名为键的哈希表中
“INBOX” – > IMAPFolder并在任何操作(getMessages)之前执行isOpened检查,但完成后,不要像我当前的实现那样显式关闭.当这样做时,我们可能打开了400个文件夹,对于邮件服务器和邮件服务器关闭它们可能看起来很糟糕,但我会先检查每个文件夹操作,如果它是否打开.因此,文件夹将尽可能保持打开状态(直到邮件服务器关闭连接),如果再次需要相同的文件夹,我们不必再次打开它.
>我不明白,为什么我仍然可以在其商店关闭的文件夹上操作?
> mail.imap.connectionpoolsize的默认值为1,在这种情况下是否有助于增加此值?
>我不明白下面这个场景会发生什么?
Store tempStore = MySingleSession.getStore("imap");
tempStore.connect(..);
Folder f = tempStore.getFolder("INBOX");
f.open(Folder.READ_ONLY);
// close the store!!!
tempStore.close();
// now folder f becomes closed,
// but we may open it again even if its Store is disconnected!
f.open(Folder.READ_ONLY);
// we can continue operating on folder f
>哪种方法更好,将文件夹引用保存在由fullname键入的hastable中,或每次执行tempStore.getFolder(foldername)?例如,我们必须处理INBOX,首先使用选项
IMAPFolder f = folderCache.get(“INBOX”); //假设已经放入哈希表folderCache
要么
IMAPFolder f = tempStore.getFolder(“INBOX”);
我按需生成Store实例并在之后关闭它们,以免在邮件服务器上使用大量资源.但是再次打开文件夹而不是手动关闭不是一个好办法,因为它仍然使用资源?或使用这种方式是可以接受的,因为邮件服务器可能会在需要时将其关闭,我们只需检查是否
>如果文件夹已经打开继续操作,
>如果文件夹已关闭先执行打开,然后再操作,继续打开以供进一步使用?
关闭文件夹后,不应使用文件夹中的任何消息对象,因此只有在使用完消息后才关闭文件夹.
如果单个用户有400个文件夹,则可以使用单个Store连接,因为每个打开的文件夹都将获得自己的连接.
如果经常打开和关闭文件夹,增加连接池大小可能会有所帮助,因为关闭的文件夹的连接将添加到池中,并在打开新文件夹时重复使用,而无需创建新连接.
关闭商店应关闭该商店的所有文件夹,但如果涉及多个线程,则存在固有的竞争条件.关闭存储是一种在使用它时清理所有连接的方法,而不是防止其他线程重新打开文件夹的方法.
缓存文件夹对象关闭文件夹不是每次调用getFolder的一大优势.
转载注明原文:JavaMail,IMAP,具有大量文件夹的性能 - 乐贴网