Cualquier solución para las ineficiencias de Oracle TNS (muchos de ida y vuelta, latencia) desde una aplicación Java?

StackOverflow https://stackoverflow.com/questions/3893943

  •  28-09-2019
  •  | 
  •  

Pregunta

Me estaba mirando a una consulta SQL muy lento (que se origina a partir de una aplicación Java utilizando Hibernate desplegado en JBoss 5.1). Esta consulta en particular acerca volvió 10K registros, pero todavía tardó 40 años o más.

Terminé olfateando el tráfico con la base de datos (Wireshark tiene un disector de TNS) y encontró algo inesperado. Cuando los datos provenía del servidor, cada fila de resultado estaba en su propio paquete de TNS. Además, cada paquete TNS fue reconocido por el cliente (es decir, el servidor de aplicaciones) antes de la siguiente fue enviado desde la base de datos. Por 10K registros, hay 10K de ida y vuelta para conseguir un paquete y reconocerlo. El impacto en el rendimiento es enorme.

Esto es terriblemente ineficiente. TCP permite que los paquetes de mayor tamaño y tiene una serie de mecanismos (ventanas correderas, ACK con retraso) para reducir la latencia y aumentar el rendimiento. Sin embargo, en este caso es el protocolo TNS en la parte superior que añade su propia negociación.

Si me quedo la misma consulta a partir de la Oracle SQL Developer, no veo este patrón. Que se complete la consulta en aproximadamente 1/10 de las veces, sin miles de ida y vuelta.

Versión corta : protocolo de conexión de Oracle (TNS) parece pasar los datos en una TNS paquete por consulta fila de resultados y requiere cada paquete para ser reconocido por el cliente antes de que el servidor envía la siguiente <. / p>

he encontrado algo de información acerca de esta [aquí] [1] (desplazamiento hacia abajo hasta la sección 'La SDU y TDU parámetros en el archivo tnsnames.ora').

Y así mi pregunta: ¿es posible controlar el comportamiento del controlador de Oracle (estoy usando 10.2.0.4.0) por lo que el protocolo TNS es más eficiente? Una vez más, se trata de una aplicación J2EE bastante estándar desplegado en JBoss.

Muchas gracias!

¿Fue útil?

Solución

SDU y TDU parámetros en tnsnames.ora y listener.ora

Para ajustar el tamaño del lote a 100 para el DECLARACIÓN actual.

  ((OracleStatement)stmt).setRowPrefetch (100);

Nota:

  

Configuración de la tamaño de captación previa puede afectar   el rendimiento de una aplicación.   El aumento del tamaño de captación previa voluntad   reducir el número de viajes de ida y vuelta   necesaria para obtener todos los datos, pero se   aumentar el uso de memoria. Esta voluntad   dependerá del número y tamaño de la   columnas de la consulta y el número de   filas espera que sean devueltos. Va a   También dependerá de la memoria y la CPU   carga de la máquina cliente JDBC.   El óptimo para un cliente autónomo   aplicación será diferente de una   muy cargado servidor de aplicaciones. los   la velocidad y la latencia de la red   También conviene consideredconnection también debe considerarse

(de Guía del desarrollador y de referencia )

aquí .

También echar un vistazo a Oracle UCP demasiado .

Otros consejos

Trate de aumentar el tamaño de recuperación para su objeto satement.

Creo que el defecto es 10, por lo que podría tratar de comenzar con 100.

Statement stmt = connection.createStatement();
stmt.setFetchSize(100);
ResultSet rs = stmt.executeQuery("SELECT ...");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top