JavaMail, IMAP, rendimiento con gran cantidad de carpetas

Estamos desarrollando un cliente de correo basado en Java para cuentas IMAP y utilizamos la última API de correo Java (1.5.6). Nuestros clientes tienen cuentas de correo con más de 400 carpetas. Los usuarios realizan correos de verificación en carpetas e iteran en cada carpeta y reciben nuevos mensajes, por ejemplo,

folder.getMessagesByUid(lastStoredUID, UIDFolder.LastUID)

o el recuento de mensajes no leídos lleva demasiado tiempo porque hay una gran cantidad de carpetas. (Tenemos que iterar en 400 carpetas)

Para aumentar el rendimiento, utilizamos conexiones de trabajo paralelas en subprocesos y tenemos una única instancia de SESSION pero cada subproceso (conexión) tiene su propia instancia de STORE. Cuando tenemos que buscar nuevos mensajes, generamos 10 hilos con sus instancias de TIENDA sobre la marcha, los conectamos / iniciamos sesión por separado, obtenemos una instancia de carpeta en esa TIENDA, abrimos carpeta, realizamos operaciones de carpeta, cerramos la carpeta y cerramos la SESIÓN después. Pero para mí no está claro, si tengo que mantener las carpetas intances y también si no está clarosi las carpetas deben mantenerse abiertas o si cerramos explícitamente más adelante o si podemos dejar todas abiertas (deje la operación de cierre al servidor de correo).

En mi implementación actual,

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();
        ..

Cuando verifico el rendimiento, veo que abrir / cerrar carpetas lleva mucho tiempo, especialmente en carpetas con más de 100.000 mensajes. Y veo que incluso si cierro el almacén de una carpeta, la carpeta permanece abierta y podemos operar en ella si no cerramos explícitamente esa carpeta. ¿Cuáles son las desventajas de tal mecanismo si cambio mi implementación y no cierro la carpeta explícitamente y la mantengo abierta?

Mantenga las referencias de la carpeta en una tabla hash con su nombre completo, por ejemplo "INBOX" -> IMAPFolder y realice la verificación isOpened antes de cualquier operación (getMessages), pero cuando termine, no cierre explícitamente como en mi implementación actual. Al hacer eso, podemos tener 400 carpetas abiertas, puede parecer malo para el servidor de correo y el servidor de correo cerrarlas, pero comprobaré primero cada operación de carpeta, si está abierta o no. Como resultado, las carpetas se mantendrán abiertas lo más posible (hasta que el servidor de correo cierre la conexión) y si se necesita la misma carpeta nuevamente, no tenemos que volver a abrirla.

No entiendo, ¿por qué todavía puedo operar en una carpeta que tiene su tienda cerrada?

Valor predeterminado paramail.imap.connectionpoolsize es 1, ¿ayuda a aumentar este valor en este caso?

¿Y no entiendo qué sucede con este escenario a continuación?

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

¿Cuál es el mejor enfoque, mantener las referencias de carpeta en un hastable tecleado por nombre completo o realizar tempStore.getFolder (nombre de carpeta) cada vez? Por ejemplo, tenemos que manejar INBOX, usar la primera opción

IMAPFolder f = folderCache.get ("INBOX"); // supongamos que ya está en la carpeta hashtableCache

o

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

Genero las instancias de la Tienda a pedido y las cierro después para no usar grandes recursos en el servidor de correo. ¿Pero abrir la carpeta nuevamente y no cerrar manualmente no es un buen enfoque porque todavía usa recursos? o usarlo de esa manera es aceptable porque el servidor de correo puede cerrarlo cuando sea necesario y solo tenemos que verificar si

si la carpeta ya está abierta, continúe operando,si la carpeta está cerrada, primero abrir, luego operar, ¿mantener abierta para un uso posterior?

Respuestas a la pregunta(1)

Su respuesta a la pregunta