问题描述
有两个数据库,热双机同步,只是IP不一样,然后用Spring管理数据源bean、Hibernate的SF和事务,由于要求两个数据库其中一个无法访问时,继续访问另一个,Hibernate的SF只能注入一个数据源,所以自行实现了DataSource(命名为MDS)将两个数据库的数据源由Spring注入,MDS注入到Hibernate的SF,MDS负责保存上一个正常使用的真正数据源和检测数据源是提供Connection。数据源用的是dbcp1.4,Spring3.2.4,Hibernate3.6.10。想问一下,这样会不会影响Spring的事务管理(例如前一个数据源出问题,使用了后一个数据源)。还有如何比较好地检测数据源是否适用。另外测试运行时,发现运行一会后(例如完成了一次业务操作后),程序卡死了无法响应,只注入一个数据源就基本没问题,是不是和多数据源不适应有关?自实现MDS代码:publicclassMultiDataSourceimplementsDataSource{privatestaticVector<DataSource>datasources=newVector<DataSource>();privatestaticDataSourcebeused;publicVector<DataSource>getDatasources(){returndatasources;}publicvoidsetDatasources(Vector<DataSource>datasources){MultiDataSource.datasources=datasources;if(MultiDataSource.datasources.size()>=1){this.setBeused(MultiDataSource.datasources.get(0));}}@OverridepublicConnectiongetConnection()throwsSQLException{selectDateSource(null,null);returnthis.getBeused().getConnection();}@OverridepublicConnectiongetConnection(Stringusername,Stringpassword)throwsSQLException{selectDateSource(username,password);returnthis.getBeused().getConnection(username,password);}privatevoidselectDateSource(booleannext,Stringusername,Stringpassword)throwsSQLException{Enumeration<DataSource>iter=this.getDatasources().elements();while(iter.hasMoreElements()){DataSourceds=iter.nextElement();try{Connectionconn=null;if(username==null&&password==null)conn=ds.getConnection();elseconn=ds.getConnection(username,password);if(checkConn(conn)){this.setBeused(ds);return;}else{continue;}}catch(Exceptione){continue;}}thrownewSQLException("novaliddataSource");}privatevoidselectDateSource(Stringusername,Stringpassword)throwsSQLException{try{Connectionconn_first=null;if(username==null&&password==null)conn_first=this.getBeused().getConnection();elseconn_first=this.getBeused().getConnection(username,password);if(checkConn(conn_first)){return;}else{selectDateSource(true,username,password);}}catch(Exceptione){selectDateSource(true,username,password);}}privatebooleancheckConn(Connectionconn)throwsSQLException{returnconn!=null;/*Statementst=null;try{st=conn.createStatement();returnst!=null;}catch(SQLExceptione){returnfalse;}finally{if(st!=null)st.close();}*/}//其他实现略
解决方案
解决方案二:
事务是加在连接上的吧,卡死应该是代码问题吧