当前位置: 首页 > news >正文

怎样做彩票网站代理网站开发 软件有哪些

怎样做彩票网站代理,网站开发 软件有哪些,性价比高的做网站公司,杭州网站开发制作公司Spring动态配置多数据源#xff0c;即在大型应用中对数据进行切分#xff0c;并且采用多个数据库实例进行管理#xff0c;这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案#xff0c;这就要程序在运行时根据当时的请求及系统状态来动态…   Spring动态配置多数据源即在大型应用中对数据进行切分并且采用多个数据库实例进行管理这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中以及从哪个数据库提取数据。   Spring配置多数据源的方式和具体使用过程。 Spring对于多数据源以数据库表为参照大体上可以分成两大类情况 一是表级上的跨数据库。即对于不同的数据库却有相同的表表名和表结构完全相同。 二是非表级上的跨数据库。即多个数据源不存在相同的表。   1、根据用户的选择使用不同的数据源。   2、解决思路锁定将sessionFactory的属性dataSource设置成不同的数据源以达到切换数据源的目的。   3、问题产生因为整个项目用的几乎都是单例模式当多个用户并发访问数据库的时候会产生资源争夺的问题。即项目启动时候所有的bean都被装载到内存并且每个bean都只有一个对象。正因为只有一个对象所有的对象属性就如同静态变量静态变量跟单例很相似常用静态来实现单例。整个项目系统的dataSource只有一个如果很多用户不断的去改变dataSource的值那必然会出现资源的掠夺问题造成系统隐患。   4、多资源共享解决思路同一资源被抢夺的时候通常有两种做法a、以时间换空间 b、以空间换时间。   5、线程同步机制就是典型的“以时间换空间”采用排队稍等的方法一个个等待直到前面一个用完后面的才跟上多人共用一个变量用synchronized锁定排队。      6、“ThreadLocal”就是典型的“以空间换时间”她可以为每一个人提供一份变量因此可以同时访问并互不干扰。   7、言归正传sessionFactory的属性dataSource设置成不用的数据源首先不能在配置文件中写死我们必须为她单独写一个类让她来引用这个类在这个类中再来判断我们到底要选择哪个数据源。       spring mybatis 多数据源切换   DbContextHolder.java   1 package com.easyway.stage.commons; 2 3 public class DbContextHolder 4 { 5 6 // ThreadLocal是线程安全的并且不能在多线程之间共享。 7 private static final ThreadLocalString contextHolder new ThreadLocalString(); 8 9 public static void setDbType(String dbType) 10 { 11 contextHolder.set(dbType); 12 } 13 14 public static String getDbType() 15 { 16 return ((String) contextHolder.get()); 17 } 18 19 public static void clearDbType() 20 { 21 contextHolder.remove(); 22 } 23 24 }     MultiDataSource.java   1 package com.easyway.stage.commons; 2 3 import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 4 5 public class MultiDataSource extends AbstractRoutingDataSource 6 { 7 8 Override 9 protected Object determineCurrentLookupKey() 10 { 11 return DbContextHolder.getDbType(); 12 } 13 14 }     Xml代码 applicationContext.xml 1 ?xml version1.0 encodingUTF-8? 2 beans 3 xmlnshttp://www.springframework.org/schema/beans 4 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:aophttp://www.springframework.org/schema/aop 5 xmlns:txhttp://www.springframework.org/schema/tx xmlns:jdbchttp://www.springframework.org/schema/jdbc 6 xmlns:contexthttp://www.springframework.org/schema/context 7 xsi:schemaLocation 8 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 9 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 11 http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd 12 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 13 14 context:annotation-config/ 15 16 !-- 数据源 -- 17 bean idparentDataSource classcom.alibaba.druid.pool.DruidDataSource 18 !-- 配置初始化大小、最小、最大 -- 19 property nameinitialSize value1 / 20 property namemaxActive value20 / 21 property nameminIdle value1 / 22 23 !-- 配置获取连接等待超时的时间60s -- 24 property namemaxWait value60000 / 25 26 !-- 配置间隔多久才进行一次检测检测需要关闭的空闲连接单位是毫秒 -- 27 property nametimeBetweenEvictionRunsMillis value60000 / 28 !-- 配置一个连接在池中最小生存的时间单位是毫秒 -- 29 property nameminEvictableIdleTimeMillis value300000 / 30 31 property namevalidationQuery valueSELECT x / 32 property nametestWhileIdle valuetrue / 33 property nametestOnBorrow valuefalse / 34 property nametestOnReturn valuefalse / 35 36 !-- 打开PSCache并且指定每个连接上PSCache的大小 -- 37 property namepoolPreparedStatements valuetrue / 38 property namemaxPoolPreparedStatementPerConnectionSize value20 / 39 40 !-- 配置监控统计拦截的filters -- 41 property namefilters valuewall,stat,slf4j / 42 43 !-- 对于长时间不使用的连接强制关闭 -- 44 property nameremoveAbandoned valuetrue / 45 !-- 超过30分钟开始关闭空闲连接 -- 46 property nameremoveAbandonedTimeout value1800 / 47 !-- 关闭abanded连接时输出错误日志 -- 48 property namelogAbandoned valuetrue / 49 /bean 50 bean idlocal parentparentDataSource init-methodinit destroy-methodclose 51 property nameurl value${local.jdbc.url} / 52 property nameusername value${local.jdbc.username} / 53 property namepassword value${local.jdbc.password} / 54 /bean 55 bean idserver parentparentDataSource init-methodinit destroy-methodclose 56 property nameurl value${jdbc.url} / 57 property nameusername value${jdbc.username} / 58 property namepassword value${jdbc.password} / 59 /bean 60 61 bean iddataSource classcom.autrade.stage.commons.MultiDataSource 62 property nametargetDataSources 63 map key-typejava.lang.String 64 entry value-reflocal keylocal/entry 65 entry value-refserver keyserver/entry 66 /map 67 /property 68 !-- 默认使用server的数据源 -- 69 property namedefaultTargetDataSource refserver/property 70 /bean 71 72 !-- MyBatis -- 73 bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean 74 property namedataSource refdataSource / 75 property nameconfigLocation valueclasspath:resources/mybatis/myBatisConfig.xml / 76 property namemapperLocations valueclasspath:resources/mybatis/mapper/*.xml/ 77 /bean 78 bean classorg.mybatis.spring.SqlSessionTemplate 79 constructor-arg refsqlSessionFactory/ 80 /bean 81 !-- MyBatis -- 82 83 !-- 配置事务管理对象-- 84 bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager 85 property namedataSource refdataSource/ 86 /bean 87 !-- 将所有具有Transactional注解的Bean自动配置为声明式事务支持 -- 88 tx:annotation-driven transaction-managertransactionManager proxy-target-classtrue/ 89 90 !-- 自定义的拦截器 -- 91 bean idmethodAdvisor classcom.easyway.app.interceptor.InjectorManager / 92 93 aop:config proxy-target-classtrue 94 aop:pointcut idbaseMethods 95 expressionexecution(* com.easyway.app.service..*.*(..)) / 96 aop:advisor advice-refmethodAdvisor pointcut-refbaseMethods / 97 /aop:config 98 99 /beans   Test.java测试类   1 package com.easyway.stage.test; 2 3 import javax.sql.DataSource; 4 5 import org.apache.ibatis.session.SqlSession; 6 import org.apache.ibatis.session.SqlSessionFactory; 7 import org.mybatis.spring.SqlSessionFactoryBean; 8 import org.springframework.context.ApplicationContext; 9 import org.springframework.context.support.ClassPathXmlApplicationContext; 10 import org.springframework.core.io.FileSystemResource; 11 import org.springframework.core.io.Resource; 12 13 import com.easyway.stage.commons.DbContextHolder; 14 15 public class Test 16 { 17 18 /** 19 * param args 20 */ 21 public static void main(String[] args) 22 { 23 ApplicationContext appContext new ClassPathXmlApplicationContext(client-beans.xml); 24 25 DbContextHolder.setDbType(local); 26 String res resources/mybatis/myBatisConfig.xml; 27 DataSource datasource (DataSource) appContext.getBean(dataSource); 28 29 SqlSessionFactoryBean bean new SqlSessionFactoryBean(); 30 bean.setDataSource(datasource); 31 Resource resource new FileSystemResource(res); 32 bean.setConfigLocation(resource); 33 try 34 { 35 SqlSessionFactory sessionfactory bean.getObject(); 36 SqlSession session sessionfactory.openSession(); 37 User user session.selectOne(com.easyway.mybatis.mapper.findOne); 38 System.out.println(user.getName()); 39 } 40 catch (Exception e) 41 { 42 e.printStackTrace(); 43 } 44 45 DbContextHolder.setDbType(server); 46 String res1 resources/mybatis/myBatisConfig.xml; 47 DataSource datasource1 (DataSource) appContext.getBean(dataSource); 48 49 SqlSessionFactoryBean bean1 new SqlSessionFactoryBean(); 50 bean1.setDataSource(datasource1); 51 Resource resource1 new FileSystemResource(res1); 52 bean1.setConfigLocation(resource1); 53 54 try 55 { 56 SqlSessionFactory sessionfactory bean.getObject(); 57 SqlSession session sessionfactory.openSession(); 58 User user session.selectOne(com.easyway.mybatis.mapper.findOne); 59 System.out.println(user.getName()); 60 } 61 catch (Exception e) 62 { 63 e.printStackTrace(); 64 } 65 66 } 67 68 }   注意当切换数据源时需要在service层之外如果需要在service层中切换非默认数据源则不能开启事务而且下次使用时线程仍然绑定此时若需要使用默认数据源则需要显示的手动切换数据源否则会出现xxx.table doesnt exist的问题。   --------------------------------------------------------------------------------------------------------------------------------------------------------------------------       Spring动态配置多数据源即在大型应用中对数据进行切分并且采用多个数据库实例进行管理这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中以及从哪个数据库提取数据。        Spring2.x以后的版本中采用Proxy模式就是我们在方案中实现一个虚拟的数据源并且用它来封装数据源选择逻辑这样就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文因为这是Client所知道的由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。 实现 具体的实现就是虚拟的DataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey在其中封装数据源的选择逻辑。   一、动态配置多数据源 1. 数据源的名称常量类 [java] view plain copy    print? /**  * 动态配置多数据源  * 数据源的名称常量类  * author LONGHUI_LUO  *  */  public class DataSourceConst {      public static final String TESTtest;      public static final String USERUser;  }   2. 建立一个获得和设置上下文环境的类主要负责改变上下文数据源的名称   [java] view plain copy    print? /**  * 获得和设置上下文环境 主要负责改变上下文数据源的名称  *   * author LONGHUI_LUO  *   */  public class DataSourceContextHolder {      private static final ThreadLocal contextHolder  new ThreadLocal(); // 线程本地环境        // 设置数据源类型      public static void setDataSourceType(String dataSourceType) {          contextHolder.set(dataSourceType);      }        // 获取数据源类型      public static String getDataSourceType() {          return (String) contextHolder.get();      }        // 清除数据源类型      public static void clearDataSourceType() {          contextHolder.remove();      }    }   3. 建立动态数据源类注意这个类必须继承AbstractRoutingDataSource且实现方法determineCurrentLookupKey该方法返回一个Object一般是返回字符串   [java] view plain copy    print? /**  * 建立动态数据源  *   * author LONGHUI_LUO  *   */  public class DynamicDataSource extends AbstractRoutingDataSource {     protected Object determineCurrentLookupKey() {    // 在进行DAO操作前通过上下文环境变量获得数据源的类型    return DataSourceContextHolder.getDataSourceType();   }    }   4. 编写spring的配置文件配置多个数据源 [html] view plain copy    print?         !-- 数据源相同的内容 --  bean          idparentDataSource          classorg.apache.commons.dbcp.BasicDataSource          destroy-methodclose          property              namedriverClassName              valuecom.microsoft.sqlserver.jdbc.SQLServerDriver /          property nameusername valuesa /          property namepassword valuenet2com /  /bean   [html] view plain copy    print? !-- start以下配置各个数据源的特性 --  bean parentparentDataSource idtestDataSource           propertynamepropertynameurl valuejdbc:sqlserver://localhost:1433;databaseNametest /  /bean   bean parentparentDataSource idUserDataSource               property              nameurl              valuejdbc:sqlserver://localhost:1433;databaseNameUser /  /bean    [html] view plain copy    print? !-- end 配置各个数据源的特性 --   5. 编写spring配置文件配置多数据源映射关系 [html] view plain copy    print? bean classcom.xxxx.datasouce.DynamicDataSource iddataSource      property nametargetDataSources          map key-typejava.lang.String              entry value-reftestDataSource keytest/entry             entry value-refUserDataSource keyUser/entry         /map       /property       property namedefaultTargetDataSource reftestDataSource /property  /bean           在这个配置中第一个property属性配置目标数据源map key-typeJava.lang.String中的key-type必须要和静态键值对照类DataSourceConst中的值的类型相 同entry keyUser value-refuserDataSource/中key的值必须要和静态键值对照类中的值相同如果有多个值可以配置多个 entry标签。第二个property属性配置默认的数据源。   动态切换是数据源 [java] view plain copy    print? DataSourceContextHolder.setDataSourceType(DataSourceConst.TEST);     该方案的优势        首先这个方案完全是在spring的框架下解决的数据源依然配置在spring的配置文件中sessionFactory依然去配置它的dataSource属性它甚至都不知道dataSource的改变。唯一不同的是在真正的dataSource与sessionFactory之间增加了一个MultiDataSource。 其次实现简单易于维护。这个方案虽然我说了这么多东西其实都是分析真正需要我们写的代码就只有MultiDataSource、SpObserver两个类。MultiDataSource类真正要写的只有getDataSource()和getDataSource(sp)两个方法而SpObserver类更简单了。实现越简单出错的可能就越小维护性就越高。 最后这个方案可以使单数据源与多数据源兼容。这个方案完全不影响BUS和DAO的编写。如果我们的项目在开始之初是单数据源的情况下开发随着项目的进行需要变更为多数据源则只需要修改spring配置并少量修改MVC层以便在请求中写入需要的数据源名变更就完成了。如果我们的项目希望改回单数据源则只需要简单修改配置文件。这样为我们的项目将增加更多的弹性。 该方案的缺点        没有能够解决多用户访问单例“sessionFactory”时共享“dataSource”变量导致产生争抢“dataSource”的结果本质类似于操作系统中的“生产者消费者”问题。因此当多用户访问时多数据源可能会导致系统性能下降的后果。 转载于:https://www.cnblogs.com/wyb628/p/7240061.html
http://www.yutouwan.com/news/394680/

相关文章:

  • 上海网站建设服务多少钱2021年新闻摘抄
  • 做商业地产的网站电子商务网站建设理解
  • 南京公司网站建设怎么收费个人备案做分站的网站吗
  • 怎么建设官方网站专业网站发展趋势
  • asp.net mvc5网站开发之美 pdf丹阳建站推广管理
  • 措美网站建设免费的微商城平台
  • 淘宝网客网站建设社交网络的推广方法
  • 什么是网站建设需求分析展览展会网站建设
  • 网站建设推广专员岗位职责运用asp做购物网站的心得
  • 网站建设专家怎么样山西省建设厅网站打不开
  • 网站打不开怎么解决看设计比较好的网站
  • 怎样可以快速增加网站的反链系统那个网站好
  • 资格证网站怎么做新淘客wordpress插件
  • 网站开发企划书局域网内做网站
  • 网络营销导向企业网站建设静态页面是什么意思
  • 建立一个网站需要花多少钱网站建站公司
  • 石家庄网站外包公司网站关键词过多
  • 建网站是什么技术甘肃住房与城乡建设厅网站
  • 网站建设的目的及功能定位杭州市建设工程招标平台
  • 女頻做的最好的网站找天津网站建设公司做个网站多少钱
  • 6生肖竞猜网站建设android官网
  • 一个营业执照可以做两个网站宿州市住房和城乡建设局网站
  • 营销推广网站推广方案海外推广渠道
  • 网站公司如何推广网站ppt怎么做流程图
  • 二极管 东莞网站建设手机网站开发专业
  • 印刷建设网站seo研究协会
  • 手机网站菜单网页怎么做的网站建站网站看看
  • 网站平台 生态建设seo产品推广
  • 惠州网站建设哪家强wap网站模板下载
  • 如何韩国视频网站模板下载 迅雷下载网站建设 课程 说明