2011-02-17 13 views
5

Tengo una aplicación web que se ejecuta en Java 6, Spring 2.5.6 e Hibernate 3.2.7. Ahora hay un requisito para obtener algunos datos de varias bases de datos, cuyos nombres no se conocen antes del tiempo de ejecución. ¿Cuál es la mejor manera de lograr esto?Configuración de Hibernate para utilizar la base de datos, cuyo nombre no se conoce antes del tiempo de ejecución

He buscado, por ejemplo en el artículo en http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/, pero eso parece ser aplicable solo en una situación en la que todas las configuraciones de la base de datos se conocen de antemano.

Respuesta

2

Como la estructura de la base de datos es la misma para cada base de datos (aunque sus nombres no se conocen de antemano), decidí imponerla simplemente agregando el nombre de la base de datos a la consulta como parámetro. Esto evita los problemas de recursos y administración al usar fábricas de sesiones múltiples.

Más información desde aquí: http://web.archive.org/web/20071011173719/http://hibernate.org/429.html

2

Puede realizar una configuración en código Java, por lo que se puede hacer en tiempo de ejecución:

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/session-configuration.html#configuration-programmatic

+0

Parece que puedo configurar una fuente de datos para el objeto de configuración, pero esto aún requiere que todas las posibles fuentes de datos se definen antes se inicie la aplicación (o tal vez no, lo que vuelve a la pregunta original). – simon

+0

Puede crear la configuración cada vez que desee. Pero también deberías poder elegir uno de ellos cuando los necesites. –

2

Se puede crear una clase que implementa org.hibernate.connection.ConnectionProvider. Luego, en su archivo de configuración de hibernación agregue esa clase como esta:

<property name="hibernate.connection.provider_class">my.class.that.implements.ConnectionProvider</property> 

Es probable que desee una sessionFactory diferente para cada base de datos también. ¿Puede proporcionar más información sobre cómo descubre su aplicación las conexiones de la base de datos en tiempo de ejecución?

+0

Se trata de conectarse a una base de datos de administrador del sitio de Quality Center. Cada proyecto de Quality Center tiene su propia base de datos, cuyos nombres leo de una tabla. El esquema para cada base de datos es conocido, solo el nombre de la base de datos no se conoce hasta obtener la información de la base de datos de control de QC stie. – simon

+0

Querrá tener una sessionFactory única para cada conexión. Puede hacer esto al inicio de la aplicación o según sea necesario. Puede usar una combinación de configuración programática y configuración basada en configuración para hacer esto. Por ejemplo, cree un archivo de configuración que tenga todo lo requerido excepto la conexión db. Luego haga esto: configuration.configure ("hibernate.cfg.xml"). SetProperty ("dbstuff", "dbvalue") – Heathen

+0

@simon Otra alternativa sería crear las conexiones usted mismo. Luego, utilizando una fábrica de sesión única: sessionFactory.openSession (connection); Javadocs recomienda utilizar un connectionProvider en su lugar, ya que el segundo nivel de caché se desactivará con este método. – Heathen

Cuestiones relacionadas