2012-03-07 12 views
5

Me encontré con un gran problema ayer. En mi proyecto actual utilizo la implementación ojdbc6 de JDBC de Oracle para una conexión, pero también necesitaría manejar, por ejemplo, bases de datos Oracle 8, lo cual es totalmente imposible con este JAR. Diría que debería usar ojdbc14, por ejemplo, que era cierto para algunas pruebas, pero supongamos que más adelante necesitaré manejar 2 tipos de bases de datos del mismo proveedor, pero sabemos que no existe una implementación para AMBAS y necesito tener esos simultáneamente cargados. La misma interfaz (y bueno, no solo la misma interfaz, la misma estructura de clases, ¡solo una implementación diferente dentro!), El mismo prefijo de conexión URL -> la conexión JDBC usará un controlador, pero no puedo cargar varios de ellos. ¿Y ahora qué?Manejar varios controladores JDBC del MISMO VENDEDOR

  • Mi primera idea era cargar las tinajas de cargadores de clases diferentes, tal vez podría cargar la misma estructura de paquete con las mismas clases separadas unas de otras? Realmente no lo creo, tal vez fue una idea tonta mía. Esto podría ser también un problema general más adelante no solo con los controladores JDBC, así que aunque no pueda responder a mi pregunta, pero sabe lo que falta aquí, dígame

  • Incluso si pudiera hacer una carga separada de las implementaciones de clase de los mismos nombres de clase, ¿cómo puedo decirle al DriverManager al crear una conexión que use el controlador EXACT en lugar de encontrar uno basado en el prefijo de la url de conexión? (donde me refiero a jdbc: oráculo: delgado, por ejemplo).

me siento como un tonto total de ahora, porque creo que esto no es una idea totalmente extraordinaria de manejar en el mundo Java, pero estoy totalmente no saben cómo manejar.

Gracias por todos ustedes de antemano

+1

no sé, utilizando Oracle 8 * * es bastante extraordinario. – skaffman

Respuesta

5

que en realidad tienen un par de opciones:

  1. Usted puede tratar de cargar los controladores de cargadores de clases diferentes. Eso funcionará si solo necesita JDBC puro en su aplicación. Dudo que logre que Hibernate trabaje con esa configuración.

    Finalmente, tendrá que ejecutar código donde necesitará ver instancias de ambos cargadores de clases y aquí, obtendrá ClassCastException s (dos clases con el mismo nombre calificado completo son diferentes cuando se cargaron desde diferentes cargadores de clases) .

  2. Puede dividir su aplicación en dos. El segundo sería un pequeño servidor que toma los comandos de su aplicación original y los traduce en JDBC para la base de datos. El pequeño servidor habla con Oracle 8 mientras su aplicación solo habla con una base de datos.

    Este enfoque le permitiría mantener las dos preocupaciones completamente separadas, pero no podrá ejecutar combinaciones en las dos bases de datos.

  3. Puede vincular la base de datos Oracle 8 anterior en su nueva base de datos usando CREATE DATABASE LINK. Eso hace que las tablas antiguas sean visibles como si fueran parte de la nueva base de datos. Tu aplicación solo habla con una base de datos y Oracle maneja los detalles internamente.

    Quizás Oracle 8 sea demasiado viejo para que esto funcione, pero definitivamente lo intentaré.

  4. Los controladores Oracle JDBC son más compatibles de lo que cabría esperar.Cuando dice "que es totalmente imposible con este JAR", ¿ha intentado ? Usé un controlador Oracle 10 para conectarme con Oracle 7 en el pasado. No todas las características eran compatibles, pero podía ejecutar las consultas y actualizaciones estándar.

+0

Gracias por la respuesta. Tomaría la primera versión ya que el 2do sería demasiado lento para nuestros propósitos, 3 es totalmente inaceptable (esta será una herramienta general para conectar lugares independientes) y 4. Bueno, sí, tal vez espere con la implementación de tu primer comentario si puedo superar las cosas con los conductores que son lo suficientemente buenos para nosotros. El único problema con el 4to enfoque es que podría querer tener no solo controladores JDBC simultáneamente en el sistema, quizás otras API tengan problemas de compatibilidad y quizás la próxima vez necesite 2 o 3 versiones de cada uno, etc. – newhouse

+0

La única pregunta abierta por el momento es que el primer comentario no indicó cómo manejar el caso JDBC donde, bueno, puedo cargar los diferentes controladores con los mismos nombres de clase, etc., pero cómo puedo superar el problema de DriverManager, que carga el controlador independientemente de ¿yo? No puedo decirles a varios controladores que manejen la misma URL. Pero al menos sé que el enfoque y la idea están en el camino correcto – newhouse

+0

Obviamente, con la solución n. ° 1, ya no puede usar 'DriverManager'. El 'DriverManager' es una variable global y proviene del cargador de clases padre y cada controlador intenta instalarse usando la misma URL base (' jdbc: oracle: '). Deberá crear conexiones manualmente usando 'OracleDataSource'. –

-1
#jdbc.properties 
oracle.driver=oracle.jdbc.OracleDriver 
oracle.url=jdbc:oracle:thin:@//localhost/xe 
oracle.user=scott 
oracle.password=tiger 

mysql.driver=com.mysql.jdbc.Driver 
mysql.url=jdbc:mysql://localhost/sales 
mysql.user=root 

mssql.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver 
mssql.url=jdbc:sqlserver://192.168.1.175;databaseName=sales 
mssql.user=dbviewer 
mssql.password=dbviewer 

y luego leer el archivo de propiedades:

class QueryTest2 { 

    public static void main(String[] args) throws Exception{ 
     Properties settings = new Properties(); 
     FileInputStream fin = new FileInputStream("jdbc.properties"); 
     settings.load(fin); 
     fin.close(); 
     String dvr = settings.getProperty(args[0] + ".driver"); 
     String url = settings.getProperty(args[0] + ".url"); 
     String usr = settings.getProperty(args[0] + ".user"); 
     String pwd = settings.getProperty(args[0] + ".password"); 
     Class.forName(dvr); 
     Connection con = DriverManager.getConnection(url, usr, pwd); 
     Statement stmt = con.createStatement(); 
     ResultSet rs = stmt.executeQuery("select pno,price,stock from products"); 
     while(rs.next()){ 
      System.out.printf("%d\t%.2f\t%d%n", rs.getInt(1), rs.getDouble(2), rs.getInt("stock")); 
     } 
     rs.close(); 
     stmt.close(); 
     con.close(); 
    } 
} 
+0

agregar leer este archivo de propiedades a través de esta manera --- –

Cuestiones relacionadas