- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多数据源的解决
多数据源的解决java——suzl
2010年1月6日
根据用户的选择,使用不同的数据源。
解决思路锁定:将sessionFactory的属性dataSource设置成不同的数据源,以达到切换数据源的目的。
问题产生:因为整个项目用的几乎都是单例模式,当多个用户并发访问数据库的时候,会产生资源争夺的问题。即项目启动时候,所有的bean都被装载到内存,并且每个bean都只有一个对象。正因为只有一个对象,所有的对象属性就如同静态变量(静态变量跟单例很相似,常用静态来实现单例)。整个项目系统的dataSource只有一个,如果很多用户不断的去改变dataSource的值,那必然会出现资源的掠夺问题,造成系统隐患。
多资源共享解决思路:同一资源被抢夺的时候,通常有两种做法,a、以时间换空间 b、以空间换时间。
线程同步机制就是典型的“以时间换空间”,采用排队稍等的方法,一个个等待,直到前面一个用完,后面的才跟上,多人共用一个变量,用synchronized锁定排队。
“ThreadLocal”就是典型的“以空间换时间”,她可以为每一个人提供一份变量,因此可以同时访问并互不干扰。
言归正传:sessionFactory的属性dataSource设置成不用的数据源,首先不能在配置文件中写死,我们必须为她单独写一个类,让她来引用这个类,在这个类中再来判断我们到底要选择哪个数据源。
我们把这类取个名字:MultiDataSource.,java,在这个类中要有DataSource的属性,还有方便我们取得配置文件中的数据源,我们还需要ApplicationContext这个属性,有这两个属性就够了。下面是我自己写的MultiDataSource类的源代码:
public class MultiDataSource implements DataSource {
private DataSource dateSource=null;
public void setDateSource(DataSource dateSource) {
this.dateSource = dateSource;
}
public DataSource getDateSource() {
return this. dateSource;
}
//其他实现方法自己写,主要是上面几个;
}
在单例模式下,我们的系统中只有一个DataSource对象,我们每次调用MultiDataSource都可能是不同的,所以我们把DataSource放在实例变量中,最直接的方法是在getDataSource中告诉她,增加参数让她知道我们需要哪个数据源。
public DataSource getDateSource(String dataSourceName) {
try{
if(dataSourceName==null || dataSourceName.equals()){
return this.dateSource;
}
return (DataSource)this.applicationContext.getBean(dataSourceName); }catch(NoSuchBeanDefinitionException ex){
return this.dateSource;
}
}
注意的是:DataSourceName就是配置文件中对应的数据源Id
ApplicationContext.xml中数据源的代码:
bean id=DateSource1
class=com.mchange.v2.c3p0.ComboPooledDataSource
property name=driverClass
value=oracle.jdbc.driver.OracleDriver
/property
property name=jdbcUrl
value=jdbc:oracle:thin:@13:1521:orcl
/property
property name=user value=hycs/property
property name=password value=hycs/property
property name=maxPoolSize value=40/property
property name=minPoolSize value=1/property
property name=initialPoolSize value=1/property
property name=maxIdleTime value=2
文档评论(0)