hibernate多服务器间数据同步
时间:2011-03-07
需求功能介绍:
为性能考虑,单一服务器改成集群(每太服务器数据允许在一定时间内保持相步),给出的修改时间短,不过代码持久层比较统一(hibernate 感谢天还好是她! )。网络连接不稳定(铁路内网!)。
完成后效果:
当网络连接成功时,多数据库的同步。
当网络连接失败时,本地应用程序运用hibernate拦截器拦截正操作对象并记录下操作动作,序列化到本地时局库 z_jcyy_tb 表中。表数据属性为:id,inputdate(记录时间),object(序列对象),action(操作动作)。并安一定时间测试连接。如果成功,读取 z_jcyy_tb 表中数据 反序列化 再同步到 其他数据库中。
代码说明:
1.新Session 建立
hibernate.cfg.xml 在文件<session-factory>中添加
<property name="connection.url_b">jdbc:oracle:thin:@192.168.1.114:1521:JCYY</property>
<property name="connection.username_b">jcyy</property>
<property name="connection.password_b">jcyy</property>
TBDao -> OpenSession()
private static String url_b = null ;
private static String use_b = null ;
private static String pass_b = null ;
private static String dirver_b = null ;
static {try {
//取得hibernate.cfg.xml逻辑路径,和原来程序关联上
Field field = SessionManager.class.getDeclaredField("CONFIG_FILE_LOCATION");
field.setAccessible( true );
String path = (String) field.get(SessionManager. class );
//通过 dom4j 加载 配置文件
Document docT = new SAXReader().read( TBDao.class.getResourceAsStream(path) );
//正则+xpath读取 在hbn文件中加入的<property name="..._b"> 的属性
String xpath = "/hibernate-configuration/session-factory/property[@name=''XPATH_I'']" ;
Pattern p = Pattern.compile("(XPATH_I)");
Matcher ma = p.matcher(xpath);
url_b = DocumentHelper.createXPath( ma.replaceAll("connection.url_b") ).selectSingleNode(docT).getText();
use_b = DocumentHelper.createXPath( ma.replaceAll("connection.username_b")).selectSingleNode(docT).getText();
pass_b = DocumentHelper.createXPath( ma.replaceAll("connection.password_b")).selectSingleNode(docT).getText();
dirver_b = DocumentHelper.createXPath( ma.replaceAll("connection.driver_class")).selectSingleNode(docT).getText();
} catch (Exception e) {e.printStackTrace();}}
//利用hbn的SessionFactory得到 openSession(Connection); 打开异地数据库连接。
//利用私有反射得到 加载完成的SessionFactory
public Session openSessionb(){
try {
Class.forName(dirver_b);
Connection conn = DriverManager.getConnection(url_b,use_b,pass_b);
Field[] fields = SessionManager.class.getDeclaredFields();
Field field = null ;
for(int i=0;i<fields.length;i++){
if( SessionFactory.class.equals( fields[i].getType() ) )
field = fields[i];
}
field.setAccessible(true);
SessionFactory sessionFactory = (SessionFactory) field.get(SessionManager.class );
return sessionFactory.openSession(conn);
} catch (Exception e) {
System.out.println("--没有连接到总服务(openSessionb)--");
return null ;
}
}
|