visual studio microsoft espaƱol descargar community java performance for-loop map

java - microsoft - visual studio installer



formas de mejorar el rendimiento de este escenario (6)

Tengo un mapa con una gran cantidad de datos que se están poblando (alrededor de 300,000 registros en aproximadamente)

e iterarlo como abajo,

for (Map.Entry<String, List<ClassOBj>> entry : testMap .entrySet()) { // send email with map keys as email''id // email content is populated from the list // Perform a sql update to the column with the dyanamic value generated here with the email''id }

Como se mencionó anteriormente, me preocupan los problemas de rendimiento que se producirán en la operación anterior que se realiza dentro del ciclo for .

Actualizar:

el escenario es estoy iterando un mapa que contiene una gran cantidad de datos,

Al iterarlo obtengo el ID de usuario y tengo que hacer un cálculo de la identificación del usuario. Por ejemplo, considere userid+some constants y esto debe actualizarse en la tabla de la base de datos.

y también debe agregarse al contenido del correo electrónico junto con los valores de lista de mi mapa

entonces pensé que las actualizaciones por lotes no son posibles, ¿estoy de acuerdo con mi entendimiento?

¿Debo seguir este enfoque? o ir con cualquier idea alternativa


Debería usar la función de actualización por lotes jdbc.

Al iterar sobre el mapa, agrega un lote a su declaración preparada. Cuando haya agregado (digamos) 2000 registros, llame a stmt.batchUpdate (), que actualizará 2000 registros diferentes de manera rápida.

Algunos ejemplos que puedes ver aquí:

http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/

Segundo: si puede, realice la transacción confirmada después de cada batchUpdate. La transacción para 300k registros puede ser demasiado para la configuración de su base de datos. La división de esta actualización en muchas transacciones tendrá un mejor rendimiento, pero solo si no puede tener transacciones en todos los registros.


En lugar de actualizar la base de datos en cada ciclo, intente actualizar la base de datos después de completar el ciclo.

Hay diferentes formas de optimizar la gran actualización de la base de datos. El mejor de eso es

  • Insertar valores modificados en una tabla temporal
  • Actualice la tabla original de la tabla temporal

También use un mecanismo de cola basado en hilos para enviar sus correos electrónicos


Haría algo así. Prepare los datos para la operación.

Supongo que está actualizando una tabla como usuario, que debería tener una identificación única.

Map<String, String> emailIds = new HashMap<String, String>(); Map<String, String> emails = new HashMap<String, String>(); for (Map.Entry<String, List<ClassOBj>> entry : testMap.entrySet()) { -- DONOT DO THIS// send email with map keys as email''id -- DONOT DO THIS// email content is populated from the list -- DONOT DO THIS// Perform a sql update to the column with the dyanamic value generated here with the email''id emails.put(emailId, content); emailIds.put(id, emailId); } bulkEmailSend(emails); bulkEmailUpdate(emailIds);

bulkEmailSend y bulkEmailUpdate son los métodos que se deben escribir para realizar las llamadas apropiadas.

Por lo tanto, utilice los métodos masivos de envío de correo electrónico y actualización masiva de correo electrónico para actualizar los valores a la base de datos.


Mi sugerencia es que pueda usar el Stored procedure . o el uso puede usar la actualización por lotes en lugar de esto.

Más sobre la actualización por lotes sql .


Trataré de resumir todos los puntos buenos mencionados anteriormente.

Tus opciones son,

  1. Utilice el multihilo siempre que sea posible, pero tenga en cuenta que el multihilo viene con un costo de memoria adicional (heapdumps y la aplicación estará inactiva).
  2. Otra buena opción es usar la actualización masiva, pero de nuevo la actualización en bloque viene con el costo de más tiempo de bloqueo al final de la base de datos. así que úselo sabiamente ya que los hilos estarán esperando hasta que un hilo termine con la actualización ya que la actualización tomará un bloqueo exclusivo, es decir, no será posible compartir.

  3. Trate de enhebrar junto con trabajos asincrónicos (especialmente para correos electrónicos) intente utilizar diferentes servidores / procesos para el manejo de correo y envíe solicitudes de correo al servidor de correo asíncrono, que es bastante rápido ya que su proceso de generación de correo es manejado por otro proceso (en el intercambio de correo real) puede aceptar algún retraso, por lo tanto, se permite su servidor de correo lento, pero el servidor de aplicaciones no lo es).

  4. Si es posible, mueva su lógica completa de actualización de Db en el procedimiento almacenado en el servidor DB, lo que ahorrará mucho tiempo ( Regla de oro: permita siempre que A maneje las tareas para las cuales A está diseñado / optimizado, es decir, los DB están diseñados para operaciones DB más rápidas que los lenguajes de programación. )

No pude darle una respuesta específica a su necesidad, pero espero que esto haya sido útil para mejorarla :)


El ciclo for toma tiempo debido a dos razones.
1) Correo electrónico individual mejorarlo por menos conexión de transporte
2) Compromisos individuales mejorarlo por

Así que lo ideal es manejar ambos, recomendaría hacerlo por lote de 1000, luego jugar con números

Ejemplo

int BATCH_SIZE = 1000 conn = DriverManager.getConnection("username","password"); conn.setAutoCommit(false); Statement stmt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); int count = 0; Map<String, String> emails_map = new HashMap(BATCH_SIZE)<String, String>; for (Map.Entry<String, List<ClassOBj>> entry : testMap .entrySet()) { String email = get_useremail(); String const_val = do_magic(); // this is how you are computing some constant String body = construct_body(); count++; String SQL = "YOUR UPDATE STATEMENT"; stmt.executeUpdate(SQL); emails_map.put(email, body); // can create if (count % BATCH_SIZE == 0) { //commits all transcations conn.commit(); //bulk send emails sending //http://.com/questions/13287515/how-to-send-bulk-mails-using-javax-mail-api-efficiently-can-we-use-reuse-auth bulk_emails_send(emails_map) } } public void bulk_emails_send(Map<String, String> emails_map) { // Get the default Session object through your setting Session session = Session.getDefaultInstance(properties); Transport t = session.getTransport(); t.connect(); try { for (String email_id in emails_map) { Message m = new MimeMessage(session); //add to, from , subject, body m.saveChanges(); t.sendMessage(m, m.getAllRecipients()); } } finally { t.close(); } }