2011-05-10 12 views
5

Mi aplicación Java necesita mantener el cursor en Oracle DB durante un tiempo. Durante esto deben hacerse otras declaraciones de DB. ¿Esto requiere conexiones de bases de datos separadas o se puede usar la misma (del cursor)?¿Oracle DB admite operaciones múltiples (paralelas) por conexión?

Gracias.

+0

¿lo intentó? ¿Qué resultados dio eso? – Mat

+0

no, no tengo. sin embargo, – Ralkie

+0

¿De qué tipo de aplicación Java estás hablando? Oracle está perfectamente bien con sesiones dedicadas que manejan una serie de declaraciones. Sin embargo, la mayoría de las aplicaciones Java son aplicaciones web, y las aplicaciones web generalmente utilizan protocolos * stateless * y agrupación de conexiones; esto significa que es difícil reservar una sesión de base de datos para que un usuario específico emita comandos durante un período de tiempo. Entonces, más detalles por favor. ¿También quisiste decir * "paralelo" * o debería ser "secuencial"? Oracle admite la consulta paralela/DML, pero es una pregunta diferente. – APC

Respuesta

5

La única restricción es que una sola instrucción solo puede tener un único ResultSet en un momento determinado. Tenga en cuenta que una declaración puede producir varios conjuntos de resultados, pero hay que acceder a ellos de forma secuencial (usando getNextResult())

Para que sea posible tener múltiples conjuntos de resultados abiertos/cursores que necesita múltiples java.sql.Statement objetos.

Una sola conexión solo puede tener una sola declaración activa (es decir, en ejecución). Por lo tanto, si necesita varios cursores abiertos (ResultSets), debe ejecutarlos secuencialmente (uno después del otro) cada uno con su propio objeto Statement.

3

Oracle no tiene ningún problema con lo que los usuarios de MSSQL llaman MARS (conjuntos de resultados activos múltiples).

Se puede ver este tipo de cosas en una gran cantidad de código PL/SQL, y para el caso de PL/SQL es "sólo" un cliente para el motor de SQL como es su código de Java:

for a in (select field1, field2 from table1) loop 
    for b in (select * from table2 where SomeField = a.Field1) loop 
    ... 
    end loop; 
end loop; 

Sin embargo, no tomes mi palabra. Puede crear un bucle anidado como este usted mismo en Java.

0

Puede utilizar el concepto de agrupamiento de bases de datos.

Click Here

Proporciona un conjunto de conexiones de bases de datos por lo que cuando sea necesario se puede obtener una conexión a la base de la piscina.

También tiene una memoria optimizada ya que la conexión y el cierre de la base de datos es un proceso pesado.

+0

Todo el punto de la pregunta es que el OP no quiere conexiones múltiples, pero quiere saber si puede ejecutar otros sqls al mismo tiempo que mantiene el cursor abierto, ¡lo cual puede! –

+0

Sí, puedo (y probablemente lo haré) usar agrupación, pero, como señaló James, la pregunta era sobre usar la misma conexión. – Ralkie

1

Por supuesto puede mantener múltiples cursores abiertos mientras realiza otras consultas en la misma conexión. Sin embargo, no es posible emitir otras consultas o declaraciones mientras se abre el primer cursor. Esto se debe a que solo una solicitud puede estar activa (es decir, ejecutarse) en una sesión de Oracle en cualquier momento.

Cuestiones relacionadas