读书人

Hibernate动态联接多数据库改进篇

发布时间: 2012-11-08 08:48:11 作者: rapoo

Hibernate动态连接多数据库改进篇

Hibernate动态连接多数据库改进篇

?

本人曾经写过一篇

Hibernate根据方言dialect动态连接多数据库? 的文章,发现效率不高,每次访问其他数据库,都要动态生成一个 sessionFactory实例,不算是个好的解决方法,后来查看hibernate源码,发现org.hibernate.cfg.Configuration类中有一个保护方法:

?

2. TempSessionFactory 的工厂类,这里把各个对象都变成了 static ,类也是static 类了,每次调用,都不用生成一个sessionFactory实例了,主要还是自己定义了一个reflashSessionFactory方法,对每次不同的数据库连接进行动态加载,其他的就是hibernate.cfg.xml 加载的问题,首次默认加载是用hibernate2.cfg.xml,其他时候就才用最新设置的参数,用了自定义类HibernateConfiguration 。 见下:

?

public static void main(String[] args) {try{String timeFormat = "yyyy-MM-dd HH:mm:ss";SimpleDateFormat sdf = new SimpleDateFormat(timeFormat); HibernateConfiguration configuration1 = new HibernateConfiguration("org.hibernate.dialect.SQLServerDialect","com.microsoft.sqlserver.jdbc.SQLServerDriver","255.255.255.255","1433","dbname1","sa","sa");System.out.println("hibernate.connection.url==1="+TempSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));TempSessionFactory.reflashSessionFactory(configuration1);System.out.println("hibernate.connection.url==2="+TempSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));Session session1=TempSessionFactory.getSession();Transaction tx1 = session1.beginTransaction();Query query1 = session1.createSQLQuery("select  name as  aaa  from testtable ").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);Map obj1 = (Map)query1.setMaxResults(1).uniqueResult();System.out.println("fd1111===="+obj1.get("aaa"));System.out.println("hibernate.connection.url==3="+TempSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));HibernateConfiguration configuration2 = new HibernateConfiguration("org.hibernate.dialect.Oracle10gDialect","oracle.jdbc.driver.OracleDriver","255.255.255.255","1521","orclDB1","username","passwd");TempSessionFactory.reflashSessionFactory(configuration2);System.out.println("hibernate.connection.url==4="+TempSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));session1=TempSessionFactory.getSession();tx1 = session1.beginTransaction();Query query2 = session1.createSQLQuery("select testname1 AAA from testtable1 ").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);Map obj2 = (Map)query2.setMaxResults(1).uniqueResult();System.out.println("fd2222===="+obj2.get("AAA"));System.out.println("hibernate.connection.url==5="+TempSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));HibernateConfiguration configuration3 = new HibernateConfiguration("org.hibernate.dialect.Oracle10gDialect","oracle.jdbc.driver.OracleDriver","255.255.255.255","1521","orclDB2","username","passwd");TempSessionFactory.reflashSessionFactory(configuration3);System.out.println("hibernate.connection.url==6="+TempSessionFactory.getConfiguration().getProperty("hibernate.connection.url"));session1=TempSessionFactory.getSession();tx1 = session1.beginTransaction();Query query3 = session1.createSQLQuery("select testname1 AAA from testtable2 ").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);Map obj3 = (Map)query3.setMaxResults(1).uniqueResult();System.out.println("fd3333===="+obj3.get("AAA"));}catch (Exception e) {System.err.println(e);}}

?

有什么好的建议,请留言。。。。。。。。。。。。。。。。。。。

转载注明 出处。。。。。。。。。。。。。。。。。。。。。。。。。

?

1 楼 gybddp 2011-10-15 请问如果结合spring,由spring管理hibernate,如何实现动态链接数据库? 2 楼 tanjunxiaoge 2011-11-22 对,1楼这个问题值得考虑一下 3 楼 gaolinwu 2012-03-08 强烈推荐“1楼”的问题,希望楼主给出建议性措施!

读书人网 >其他数据库

热点推荐