`
feicer
  • 浏览: 133098 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

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

 

本人曾经写过一篇

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

	protected void reset() {
……
	}

 

重写Configuration类,在动态的跳转不同数据库的时候,不用重新生成sessionFactory实例,发现效果不错。

故以此记录我的方法:

 

1. 自己重写的Configuration类,extends org.hibernate.cfg.Configuration

 

public class HibernateConfiguration extends org.hibernate.cfg.Configuration {

	public HibernateConfiguration() {
		super();
	}

	public void reset() {
		super.reset();
	}

	public HibernateConfiguration(String dialect, String driverClass,
			String ipAddress, String port, String dataBaseName,
			String username, String password) throws HibernateException {
		String connection_url = "";
		if (dialect.indexOf("MySQL") > -1) {
			connection_url = "jdbc:mysql://" + ipAddress + "/" + dataBaseName;
		} else if (dialect.indexOf("SQLServer") > -1) {
			connection_url = "jdbc:sqlserver://" + ipAddress + ":" + port
					+ ";DataBaseName=" + dataBaseName;
		} else if (dialect.indexOf("Oracle") > -1) {
			connection_url = "jdbc:oracle:thin:@" + ipAddress + ":" + port
					+ ":" + dataBaseName;
		} else {
			throw new HibernateException("The dialect was not allowed.==fd=="
					+ dialect);
		}

		super.setProperty("hibernate.dialect", dialect);
		super.setProperty("hibernate.connection.url", connection_url);
		super.setProperty("hibernate.connection.driver_class", driverClass);
		super.setProperty("hibernate.connection.username", username);
		super.setProperty("hibernate.connection.password", password);
		// super.setProperty("hibernate.show_sql", "true");
	}

	public HibernateConfiguration(String dialect, String driverClass,
			String ipAddress, String port, String dataBaseName,
			String username, String password, String schema, String catalog)
			throws HibernateException {
		String connection_url = "";
		if (dialect.indexOf("MySQL") > -1) {
			connection_url = "jdbc:mysql://" + ipAddress + "/" + dataBaseName;
		} else if (dialect.indexOf("SQLServer") > -1) {
			connection_url = "jdbc:sqlserver://" + ipAddress + ":" + port
					+ ";DataBaseName=" + dataBaseName;
		} else if (dialect.indexOf("Oracle") > -1) {
			connection_url = "jdbc:oracle:thin:@" + ipAddress + ":" + port
					+ ":" + dataBaseName;
		} else {
			throw new HibernateException("The dialect was not allowed.==fd=="
					+ dialect);
		}

		super.setProperty("hibernate.dialect", dialect);
		super.setProperty("hibernate.connection.url", connection_url);
		super.setProperty("hibernate.connection.driver_class", driverClass);
		super.setProperty("hibernate.connection.username", username);
		super.setProperty("hibernate.connection.password", password);
		super.setProperty("hibernate.default_schema", schema);
		super.setProperty("hibernate.default_catalog", catalog);
		// super.setProperty("hibernate.show_sql", "true");
	}

}

 

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

 

import org.hibernate.HibernateException;
import org.hibernate.Session;
import com.tools.hibernate.utils.HibernateConfiguration;

public class TempSessionFactory {

	.......//略


	public static void reflashSessionFactory(
			HibernateConfiguration tempConfiguration) {
		try {
			// configuration.configure(configFile);
			if (tempConfiguration.getProperty("hibernate.dialect").equals(
					configuration.getProperty("hibernate.dialect"))
					&& tempConfiguration
							.getProperty("hibernate.connection.url")
							.equalsIgnoreCase(
									configuration
											.getProperty("hibernate.connection.url"))
					&& tempConfiguration
							.getProperty("hibernate.connection.username")
							.equals(
									configuration
											.getProperty("hibernate.connection.username"))
					&& tempConfiguration
							.getProperty("hibernate.connection.password")
							.equals(
									configuration
											.getProperty("hibernate.connection.password"))) {

				System.out.println("%%%% TempSessionFactory is created aready!!-fd %%%%");
				// sessionFactory = configuration.buildSessionFactory();
			} else {
				closeSession();
				closeSessionFactory();
				configuration.reset();
				configuration = tempConfiguration;
				sessionFactory = configuration.buildSessionFactory();
				System.out.println("%%%% TempSessionFactory is reflashed here!!-fd %%%%");
			}
		} catch (Exception e) {
			System.err.println("%%%% Error Reflashing TempSessionFactory %%%%");
			e.printStackTrace();
		}
	}

	......//略
}

 

3. 顺便发一下测试类,自己在不同服务器上面 建几个数据库,建几张测试表,就可以了:

 

	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);
		}
	}

 

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

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

 

2
1
分享到:
评论
5 楼 HelloJava1234 2013-08-13  
对lz的代码做了改进,需要的可以参考下,本人菜鸟一个,有不足的请别介意!http://blog.csdn.net/hellojava1234/article/details/9949359
4 楼 chhsf 2012-12-31  
你好,feicer。
请问,hibernate.cfg.xml加载问题如何处理。是在不同的服务器上有各自的hibernate.cfg.xml文件吗?如果我的对象映射都是相同的,是否可以只加载一个hibernate.cfg.xml文件。我用的是hibernate.cfg.xml+Proxool.xml。
3 楼 gaolinwu 2012-03-08  
强烈推荐“1楼”的问题,希望楼主给出建议性措施!
2 楼 tanjunxiaoge 2011-11-22  
对,1楼这个问题值得考虑一下
1 楼 gybddp 2011-10-15  
请问如果结合spring,由spring管理hibernate,如何实现动态链接数据库?

相关推荐

    Hibernate在Tomcat上数据库连接性能改进

    从维普网站下载的论文,这个在正常情况下是需要花钱才能够得到的。

    Hibernate 分页示例 SQLServer 数据库

    一个基于Hibernate 和 SQLServer 数据库的分页示例,所有文件和数据库备份都在,只是速度不怎么快,如果加上自动生成下拉框,速度就更慢了,单表、10008条测试数据,如果哪位大侠改进了查询速度望告之:vni2007@163....

    基于Java数据库连接池的研究与创新

    本文首先介绍了传统连接、tomcat下连接池和hibernate下连接池的基本原理,然后在此基础上提出了一种改进的新型连接池方法,最后基于Java语言对四种连接方法进行了仿真模拟。通过实验测试及连接时间的对比分析,看到...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    1.4.4 JDBC(Java数据库连接) 1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    1.4.4 JDBC(Java数据库连接) 1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    1.4.4 JDBC(Java数据库连接) 1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) ...

    基于Java swing带GUI界面的校友录系统(源码+数据库+课程报告说明书).zip

    虽然项目不大,但是基本的结构和数据库连接技术还是体现出来了。做完项目后我会在以后的学习中渐渐尝试采用Struct+Hibernate+Spring技术来构建更大的项目。慢慢掌握基于MVC结构程序思想和完全面向对象思想开发程序。...

    postgresql-42.5.0.jar

    postgresql-42.5.0.jar是Java上的一个驱动程序,用于连接PostgreSQL数据库并与其进行交互。它可以让Java程序员方便地使用PostgreSQL数据库,并提供了许多功能和工具,使程序员可以编写高效、稳定和高性能的应用程序...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    1.4.4 JDBC(Java数据库连接) 1.4.5 JTA/JTS(Java事务) 1.4.6 JNDI(Java命名和目录服务) 1.4.7 JavaMail(Java邮件服务) 1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) ...

    JAVA上百实例源码以及开源项目

    有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以改进做成小工具。 Java右键弹出...

    JAVA上百实例源码以及开源项目源代码

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    先让网站能够正常工作于尽可能旧的浏览器上,然后不断为它在新型浏览器上实现更多的增强和改进。 Viewport 移动设备上的Viewport就是设备的屏幕上能用来显示网页的一块区域,即浏览器上用来显示网页的那部分区域。...

    java源码包---java 源码 大量 实例

    有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以改进做成小工具。 Java右键弹出...

    CustomerControl:一个用于引导客户余额的Spring Boot应用

    客户控制 一个用于客户余额控制...#此应用实现:-> MVC体系结构-> Thymeleaf前端指令->使用Thymeleaf进行消息和i18n处理-> MySQL数据库-> Spring Security和与JPA和Hibernate的数据库连接->通过Bootstrap进行视觉改进

    java源码包2

    有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以改进做成小工具。 Java右键弹出...

Global site tag (gtag.js) - Google Analytics