Consultas a Oracle

Tengo un problema con una consulta a una base de datos Oracle. Desde una aplicación Java estoy haciendo una consulta a una tabla de una base de datos en Oracle. Pero al devolver el resultado de la consulta me lanza una excepción. El tamaño de la tabla es realmente enorme (aprox 3 millones de registros) y el resultado de la consulta es de aprox 700000 registros. ¿Sabes si hay alguna limitación en Oracle respecto al tamaño de una consulta? Otra posibilidad es que Oracle tenga un timeout que se lance cuando tarde mucho en dar el resultado de una consulta, ¿Sabes si esto es cierto? ¿Hay forma de cambiarlo?.

1 respuesta

Respuesta
1
No, en principio Oracle no tiene ningún tipo e limitación en cuanto a la devolución de registros de una lectura. El número de registros de la tabla tampoco debe ser una limitación (yo tengo en producción tablas de 5 millones de registros en uso y los desarrolladores no me han comentado nada de que tengan problemas).
Tampoco tiene un timeout.
Para comprobar que esto es así copia la query y lanzala desde el sqlplus, si te devuelve los datos deberías mirar la parte Java, sino devuelve datos sino un error, comentame cual es.
Cuando me da un error, me lanza la siguiente excepción:
java.sql.SQLException: Exhausted Resultset
El problema es que no todas las veces me lanza la excepción. Por la pruebas que he hecho, me lanza la excepción cuando el conjunto de registros que me devuelve la consulta es muy grande (mayor de 700000 registros, por eso te decía lo del limite) o cuando hay muchos accesos a la base de datos.
Un saludo.
EL problema que estas teniendo es porque intentas mover al resultset el cursor antes de que termine la consulta en la base de datos.
¿Qué version del jdbc utilizas? Si no es la última intenta instalartela y probarlo.
¿Me confirmas que desde el sqlplus puedes ejecutar la query sin problemas?
Intenta lo del jdbc y yo mientras investigo un poco más.
Hola:
Respecto a la solución que me planteas de que intento mover al resultset el cursor antes de que termine la consulta, es posible que ocurra, ¿pero cómo lo puedo solucionar?. Te envío el código fuente donde hago la consulta, por si te sirve de algo:
public static ArrayList consultar(String sql) throws SQLException{
Connection con = null;
ArrayList resultado = new ArrayList();
HashMap fila = null;
ResultSetMetaData rsmeta = null;
ResultSet rs = null;
Statement stmt = null;
con = conexion();
try
{
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
rsmeta = rs.getMetaData();
int numcols = rsmeta.getColumnCount();
int k = 0;
while(rs.next())
{
k++;
fila = new HashMap();
for (int i=1;i<=numcols;i++)
{
String nombre = rsmeta.getColumnName(i);
String tipo = rsmeta.getColumnClassName(i);
String type = rsmeta.getColumnTypeName(i);
//nombre = nombre.toUpperCase();
Object valor = null;
//Object valor = rs.getObject(nombre);
//ESTA CADENA DE IF ES NECESARIA PORQUE EL PUENTE ODBC NO INTERPRETA
//ADECUADAMENTE LOS TIPOS nvarchar y ntext DE MS SQL Server 7.0
if (type.equals("ntext"))
{
byte[] b = rs.getBytes(i);
//int tamanio = b.length;
//System.out.println("DycecSQL tamanio="+tamanio);
try
{
valor = new String(b,"UTF-16");
}
catch (Exception e1)
{
}
}
else if (type.equals("nvarchar"))
{
valor = rs.getString(i);
}
else if (type.equalsIgnoreCase("boolean"))
{
valor = rs.getObject(nombre).toString();
}
else
{
valor = rs.getObject(nombre);
}
fila.put(nombre,valor);
}//for
resultado.add(fila);
}
}
catch (SQLException sqlex)
{
System.err.println("Excepcion en DycecSQL.consultar(Connection con, String sql):");
System.err.println("consulta: ");
System.err.println(sql);
System.err.println("Excepcion: "+sqlex.getMessage());
throw(sqlex);//Relanzo la excepcion recogida al consultar
}
finally
{//Me aseguro que se cierra todo
//c = null;
try
{
rs.close();
stmt.close();
con.close();
}
catch (Exception e)
{
}
finally
{
try{
stmt.close();
}catch(Exception e2){}
}
}
return resultado;
}
Por otro lado, no se exactamente la version que estoy usando de jdbc. Es la que venia en el paquete de instalación del Oracle 8i (oracle 8.1.7).
Desde el sqlplus parece que no falla al ejecutar la query. Cuando el ejecuto la aplicación hay veces que funciona bien y otras que falla (totalmente aleatorio).
Muchas gracias y un saludo.
Hola:
En primer lugar, darte las gracias por poner tanto interés. Me esta dando ya apuro preguntarte tanto.
He cambiado el jdbc por el de la 9i, y ahora me da otro error distinto:
java.lang.NullPointerException
No se si a ti te sonara más este error, porque yo ahora si que no entiendo nada.
Un saludo.
EL problema que tengo con el código, que es que soy administrador y no desarrollador con lo que el hecho de descubrir en el código lo que pasa me costaría la de Dios.
Intenta hacer una cosa, instala el cliente 9i, a pesar de atacar una 8i y prueba con el jdbc de la 9i.
Ese error es genérico y la última vez que me dio no fui capaz de quitarlo, por lo que le dije a mis desarrolladores que buscaran alternativas.
La única recomendación que hace Oracle con este error es que te bajes la última jre de SUN y pruebes con ella, a mi no me funcionó, a lo mejor a ti sí.
Suerte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas