Ayuda con Oracle Net Service

JuAn4k4

Hola,

Tenemos que usar para una practica de una asignatura la herramienta "Oracle Net" para desarrollar una base de datos distribuida.

Hemos mirado (mi compañero y yo) toda la info que hay sobre esta herramienta, y creo que no llegamos a entender muy bien como funciona.

Creo que es algo asi como que con Oracle Net puedes definirte una especie de "alias" y luego realizar consultas SQL tal que asi:

select * from peliculas@bd1, actores@bd2;

donde bd1 y bd2 son los "alias" que has creado ( en un fichero llamado tsnames.ora , que en realidad no son alias pero casi, ya que son distintas bases de datos)

Primera duda : No se si hasta aqui voy muy desencaminado o no. Si alguien sabe algo del tema aconsejaria un poco de orientacion si puede ser.

Para configurar todo esto hay que modificar ciertos ficheros de oracle ( que no se yo si en la universida tendremos permisos pero bueno.. eso es otro cantar ).

Mi problema ahora seria ( a parte de configurar todo eso ), como compaginarlo con Hibernate ( herramienta de Java para dotar de persistencia en una base de datos relacional a los objetos java ).
El problema viene dado que hibernate crea sus sentencias SQL (a partir del mapeo que le dices, y la consulta en HQL) y (creo) que hibernate no entiende de distintas bases de datos, ni nada por el estilo.

Segunda duda: ¿ Hay alguna forma de meter "mano" a las consultas que Hibernate realiza ? Es decir a la consulta sql que llega a la BD final.

Porque si le digo "From pelicula@bd1 where [email protected]@bd2.nombre = 'Penelope Cruz'" me dira que me lo estoy inventando todo. (La consulta normal seria : "From pelicula where pelicula.actor.nombre = 'Penelope Cruz'" )

He puesto codigo de Categoria.. pero no tiene mucho que ver la vdd, tendria que ver con ¿Herramienta de desarrollo?¿duda?
Un saludo y gracias !

JuAn4k4

Bueno por si alguien algun dia busca por aqui sobre Oracle Net Services:

Primera pregunta: Solucionado.

Se trata de que con Oracle Net puedes crearte conexiones a bases de datos remotas, renombrandolas con alias y asi poder acceder de forma sencilla a distintas bases de datos en una misma consulta.

Conexiones ¿ Como crear disintas conexiones ?
Creando Database Links:

CREATE DATABASE LINK <alias>
    connect to <usuario>
    identified by <contraseña>
    using '(description = (address = (protocol = TCP)
    (HOST = <host> ) (PORT = 1521))
    (connect_data = (SID = <sid>)))'
    ;

Aqui hay que rellenar <alias> <usuario> <contraseña> <host> y <sid>

Para conocer el sid puedes hacer un echo de la variable $ORACLE_SID:

echo $ORACLE_SID
Es el nombre de la base de datos.

<usuario> es el esquema (schema) dentro de la base de datos.
<contraseña> pues la contraseña.
<host> es el servidor donde esta alojada la base de datos
el puerto puede cambiar tambien, los tipicos son el 1521 y 1522

Voy a poner un ejemplo:

CREATE DATABASE LINK ventas
    connect to admin
    identified by adminadmin
    using '(description = (address = (protocol = TCP)
    (HOST = hendrix-oracle.cps.unizar.es ) (PORT = 1521))
    (connect_data = (SID = vicious)))'
    ;

Y con eso ya podemos hacer bastantes cosas, por ejemplo ver las tablas que tenemos en la base de datos:

Select * from cat@alias


Segunda pregunta: No creo que haya solucion

Con Hibernate lo unico que he sido capaz de hacer es crear una clase Interceptor, que obtiene el SQL de Hibernate, salvo que las sentencias aun no estan preparadas, es decir, los argumentos variables estan dispuestos con "?".

Estas clases sirven para hacer auditorias, es decir recojer datos sobre las consultas que se hacen, para hacer estadisticas y demas.

La clase seria algo asi:

import org.hibernate.EmptyInterceptor;


public class Recolector extends EmptyInterceptor {
    /**
	 * Captura el SQL para realizar cambios
	 */

public String onPrepareStatement(String sql) {
	// Ver el SQL y realizar estadisticas.
	return sql;
}
}

Y en la configuracion de Hibernate, poner algo tal que asi:

configuration.setInterceptor(new Recolector());
Shendraf

Quizás llegue tarde. Bueno, hacía tiempo que tenía pendiente buscar la manera de obtener el SQL resultante de una consulta HQL cambiando las ? por los parámetros. Lo que hacía era usar el Dynamic Query Translator de Hibernate Tools, copiar la query y cambiar a mano todas las interrogaciones. Navegando me he topado con esto: https://forums.hibernate.org/viewtopic.php?f=1&t=965749&start=0 . La clase QueryLogger que han implementado soluciona ese problema, aportando incluso el tipo de objeto/s que devuelve la consulta y el valor de cada parámetro. Lo he probado y funciona bastante bien.

En cuanto a lo que buscas, te recomiendo que no uses interceptores para modificar la consulta ya que, como bien dices, es sólo para auditoría. Hibernate es algo limitado y hay que tener eso en cuenta. Cuando la consulta es complicada hago uso del session.createSQLQuery para ejecutar consultas SQL. Además, si te ves fuerte y con tiempo, prueba con Criteria

JuAn4k4

#3 Gracias por la respuesta, pero encontramos una solución algo más sencilla ( Ya que es el trabajo de practicas de una asignatura y no hay que llenarse de mierda ), que fue restringir el uso de hibernate a un escenario local (de un solo nodo) y despues a parte el escenario global ( de todas las bases de datos distribuidas ), asi de esta forma tocamos un poco todo, pero sin meternos a fondo que a fin de cuentas es lo que se pretende en la asignatura.

Usuarios habituales

  • JuAn4k4
  • Shendraf