gpt4 book ai didi

JavaMail、IMAP、大量文件夹的性能

转载 作者:行者123 更新时间:2023-12-01 22:17:10 25 4
gpt4 key购买 nike

我们正在为 IMAP 帐户开发一个基于 java 的邮件客户端,并使用最新的 java 邮件 api (1.5.6)。我们的客户拥有包含 400 多个文件夹的邮件帐户。用户在文件夹上执行检查邮件并迭代每个文件夹并获取新消息,例如,

folder.getMessagesByUid(lastStoredUID, UIDFolder.LastUID)

或者由于文件夹数量巨大,获取未读消息的计数需要花费太多时间。 (我们必须迭代 400 个文件夹)

为了提高性能,我们在线程中使用并行工作连接,并且我们有一个 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 个文件夹,这对邮件服务器和邮件服务器关闭它们来说似乎不好,但我会首先检查每个文件夹操作,如果它打开或没有。因此,文件夹将尽可能保持打开状态(直到邮件服务器关闭连接),如果再次需要相同的文件夹,我们不必再次打开它。

  • 我不明白,为什么我仍然可以对存储关闭的文件夹进行操作?

  • ma​​il.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
  • 哪种方法更好,将文件夹引用保存在以全名键控的哈希表中,还是每次执行 tempStore.getFolder(foldername)?例如我们要处理INBOX,第一个选项使用

IMAPFolder f =folderCache.get("INBOX");//假设已经放入哈希表folderCache

IMAPFolder f = tempStore.getFolder("INBOX");

我根据需要生成 Store 实例,然后关闭它们,以免使用邮件服务器上的大量资源。但是再次打开文件夹而不手动关闭不是一个好方法,因为它仍然使用资源?或者使用这种方式是可以接受的,因为邮件服务器可能会在需要时关闭它,我们只需检查是否

  • 如果该文件夹已打开,请继续操作,
  • 如果文件夹关闭,先打开再操作,保持打开状态继续使用?

最佳答案

一篇文章的问题太多了。让我尝试回答其中的一些问题......

关闭文件夹后,不应使用该文件夹中的任何消息对象,因此仅在使用完该文件夹的消息后才关闭该文件夹。

如果单个用户有 400 个文件夹,您可以使用单个存储连接,因为每个打开的文件夹都会获得自己的连接。

如果您频繁打开和关闭文件夹,增加连接池大小会有所帮助,因为关闭文件夹的连接将被添加到池中,并在您打开新文件夹时重用,而无需创建新连接。

关闭存储应该关闭该存储的所有文件夹,但如果涉及多个线程,则存在固有的竞争条件。关闭存储区是一种在使用完毕后清理所有连接的方法,而不是防止其他线程重新打开文件夹的方法。

与每次调用 getFolder 相比,缓存已关闭文件夹的文件夹对象不太可能有很大优势。

关于JavaMail、IMAP、大量文件夹的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44826628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com