2011-03-31 17 views
6

En un proyecto Java, estoy usando un frasco de ojdbc6Oracle getConnection lenta

<dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>ojdbc6</artifactId> 
     <version>11.2.0.1.0</version> 
     <scope>compile</scope> 
    </dependenc> 

La primera vez para un día corro, DataSource.getConnection() es rápida. La segunda vez usualmente está bien. Las próximas veces toman alrededor de 45 segundos. Después de eso, lleva varios minutos. Una vez que tengo la PRIMERA conexión de una aplicación determinada, todas las conexiones nuevas que recibo son muy rápidas. Esta demora solo está obteniendo la PRIMERA conexión para una corrida dada.

Lo que está haciendo conseguir mi primera conexión es tan lenta?

estoy viendo netstat y no veo ninguna conexión colgando después de una carrera exitosa. He intentado varios grupos de conexiones diferentes (DBCP, C3PO) sin suerte. Depuración a través del código fuente, la demora es de 100% en la línea de org.springframework.jdbc.datasource.DataSourceUtils:

Connection con = dataSource.getConnection(); 

alguna idea?

Editado Para más detalles

1) Estoy utilizando un pool de conexiones (DBCP o C3PO) que ahorra conexiones para uso futuro. Cuando hablo de una nueva conexión, me refiero a que la primera conexión está en uso. Necesito ir al DB y obtener una NUEVA conexión. Por supuesto, puedo regresar y obtener mi misma conexión del grupo de conexiones una y otra vez. Pero obtener un segundo al mismo tiempo también es rápido.

2) No sé cuántas conexiones DB mi me permite estar conectado con. ¿Alguna idea de dónde está esta propiedad en Oracle?

+1

Probablemente este artículo [Cómo comprobar la número máximo de conexiones permitidas a una base de datos Oracle?] (http://stackoverflow.com/questions/162255/how-to-check-the-maximum-number-of-allowed-connections-to-an-oracle-database) es interesante para usted – lkdg

Respuesta

7

se debió a Java utilizando/dev/random en lugar de/dev/urandom para realizar una conexión SSH con la base de datos .... cambiar a/dev/urandom fija este

+1

Vale la pena mencionar que puede usar el argumento JVM -Djava.security.egd = file:/dev /./ urandom para lograr esto.Observe el extra '.' en la discusión Ver http://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom. – Ryan

3

2 preguntas.

En primer lugar, después de recibir la primera conexión, ¿qué haces con él? ¿Lo está cerrando correctamente (INCLUYENDO todos los recursos que abrió con él, como Statement y ResultSet)?

En segundo lugar, el número de conexiones no su base de datos que permite a las credenciales que ha identificado con?

La razón por la que hago estas preguntas es porque las demoras pueden ser la cantidad de tiempo que demora el DB en limpiar (porque es posible que no lo haya hecho bien) y liberar una conexión para darle. Gran parte de esto podría ser un tiempo de espera antes de que libere recursos por la fuerza.

+0

PO actualizado en la parte inferior – bwawok

1

¿Está excediendo su máximo de conexiones activas en el pool de conexiones y tienen que esperar a que su programa para liberar las conexiones antiguas?

+0

Ejecuto mis programas inmediatamente después de otro. Parece que está cerrando todo correctamente, pero no está totalmente seguro de cómo saberlo. – bwawok

+0

Si usa DBCP, puede imprimir datasource.getNumActive() (primero debe convertirlo a BasicDataSource) antes de intentar obtener otra conexión nuevamente. – Ray