1. Spring整合MyBatis切换SqlSessionFactory有两种方法,第一、 继承SqlSessionDaoSupport,重写获取SqlSessionFactory的方法。第二、继承SqlSessionTemplate 重写getSqlSessionFactory、getConfiguration和SqlSessionInterceptor这个拦截器。其中最为关键还是继承SqlSessionTemplate 并重写里面的方法。

我们一般使用第二种方法,第二种方法有2 种配置:

单个sqlSessionFactory情况:需要在程序中(action 里面动态指定使用那个数据库连接池)

spring-mybatis.xml配置如下:

  1. <!-- ========================================配置数据源========================================= -->
  2. <!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 -->
  3. <bean name="pepos" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  4. <property name="url" value="${pepos.url}" />
  5. <property name="username" value="${pepos.username}" />
  6. <property name="password" value="${pepos.password}" />
  7. <!-- 密码解密-->
  8. <property name="filters" value="config" />
  9. <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${pepos.publickey}" />
  10. <!-- 初始化连接大小 -->
  11. <property name="initialSize" value="0" />
  12. <!-- 连接池最大使用连接数量 -->
  13. <property name="maxActive" value="20" />
  14. <!-- 连接池最大空闲 <property name="maxIdle" value="20" /> -->
  15. <!-- 连接池最小空闲 -->
  16. <property name="minIdle" value="0" />
  17. <!-- 获取连接最大等待时间 -->
  18. <property name="maxWait" value="60000" />
  19. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
  20. <property name="poolPreparedStatements" value="true" />
  21. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  22. <property name="validationQuery" value="SELECT 1" />
  23. <property name="testOnBorrow" value="false" />
  24. <property name="testOnReturn" value="false" />
  25. <property name="testWhileIdle" value="true" />
  26. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  27. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  28. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  29. <property name="minEvictableIdleTimeMillis" value="25200000" />
  30. <!-- 打开removeAbandoned功能 -->
  31. <property name="removeAbandoned" value="true" />
  32. <!-- 1800秒,也就是30分钟 -->
  33. <property name="removeAbandonedTimeout" value="1800" />
  34. <!-- 关闭abanded连接时输出错误日志 -->
  35. <property name="logAbandoned" value="true" />
  36. </bean>
  37. <!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 -->
  38. <bean name="payment" class="com.alibaba.druid.pool.DruidDataSource"
  39. init-method="init" destroy-method="close">
  40. <property name="url" value="${payment.url}" />
  41. <property name="username" value="${payment.username}" />
  42. <property name="password" value="${payment.password}" />
  43. <!-- 密码解密 -->
  44. <property name="filters" value="config" />
  45. <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" />
  46. <!-- 初始化连接大小 -->
  47. <property name="initialSize" value="0" />
  48. <!-- 连接池最大使用连接数量 -->
  49. <property name="maxActive" value="20" />
  50. <!-- 连接池最大空闲 <property name="maxIdle" value="20" /> -->
  51. <!-- 连接池最小空闲 -->
  52. <property name="minIdle" value="0" />
  53. <!-- 获取连接最大等待时间 -->
  54. <property name="maxWait" value="60000" />
  55. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
  56. <property name="poolPreparedStatements" value="true" />
  57. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  58. <property name="validationQuery" value="SELECT 1" />
  59. <property name="testOnBorrow" value="false" />
  60. <property name="testOnReturn" value="false" />
  61. <property name="testWhileIdle" value="true" />
  62. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  63. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  64. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  65. <property name="minEvictableIdleTimeMillis" value="25200000" />
  66. <!-- 打开removeAbandoned功能 -->
  67. <property name="removeAbandoned" value="true" />
  68. <!-- 1800秒,也就是30分钟 -->
  69. <property name="removeAbandonedTimeout" value="1800" />
  70. <!-- 关闭abanded连接时输出错误日志 -->
  71. <property name="logAbandoned" value="true" />
  72. </bean>
  73. <!-- 需要基础spring的 AbstractRoutingDataSource 来实现动态设置数据库连接池  -->
  74. <bean id="dynamicDataSource" class="com.threeweidu.mallmanage.utils.DynamicDataSource">
  75. <property name="targetDataSources">
  76. <map key-type="java.lang.String">
  77. <entry value-ref="pepos" key="pepos"></entry>
  78. <entry value-ref="payment" key="payment"></entry>
	<!-- ========================================配置数据源========================================= -->
&lt;!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 --&gt;
&lt;bean name="pepos" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"&gt;
&lt;property name="url" value="${pepos.url}" /&gt;
&lt;property name="username" value="${pepos.username}" /&gt;
&lt;property name="password" value="${pepos.password}" /&gt; &lt;!-- 密码解密--&gt;
&lt;property name="filters" value="config" /&gt;
&lt;property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${pepos.publickey}" /&gt; &lt;!-- 初始化连接大小 --&gt;
&lt;property name="initialSize" value="0" /&gt;
&lt;!-- 连接池最大使用连接数量 --&gt;
&lt;property name="maxActive" value="20" /&gt;
&lt;!-- 连接池最大空闲 &lt;property name="maxIdle" value="20" /&gt; --&gt;
&lt;!-- 连接池最小空闲 --&gt;
&lt;property name="minIdle" value="0" /&gt;
&lt;!-- 获取连接最大等待时间 --&gt;
&lt;property name="maxWait" value="60000" /&gt; &lt;!-- 打开PSCache,并且指定每个连接上PSCache的大小 --&gt;
&lt;property name="poolPreparedStatements" value="true" /&gt;
&lt;property name="maxPoolPreparedStatementPerConnectionSize" value="20" /&gt; &lt;property name="validationQuery" value="SELECT 1" /&gt;
&lt;property name="testOnBorrow" value="false" /&gt;
&lt;property name="testOnReturn" value="false" /&gt;
&lt;property name="testWhileIdle" value="true" /&gt;
&lt;!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --&gt;
&lt;property name="timeBetweenEvictionRunsMillis" value="60000" /&gt;
&lt;!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --&gt;
&lt;property name="minEvictableIdleTimeMillis" value="25200000" /&gt;
&lt;!-- 打开removeAbandoned功能 --&gt;
&lt;property name="removeAbandoned" value="true" /&gt;
&lt;!-- 1800秒,也就是30分钟 --&gt;
&lt;property name="removeAbandonedTimeout" value="1800" /&gt;
&lt;!-- 关闭abanded连接时输出错误日志 --&gt;
&lt;property name="logAbandoned" value="true" /&gt;
&lt;/bean&gt; &lt;!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 --&gt;
&lt;bean name="payment" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close"&gt;
&lt;property name="url" value="${payment.url}" /&gt;
&lt;property name="username" value="${payment.username}" /&gt;
&lt;property name="password" value="${payment.password}" /&gt; &lt;!-- 密码解密 --&gt;
&lt;property name="filters" value="config" /&gt;
&lt;property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" /&gt; &lt;!-- 初始化连接大小 --&gt;
&lt;property name="initialSize" value="0" /&gt;
&lt;!-- 连接池最大使用连接数量 --&gt;
&lt;property name="maxActive" value="20" /&gt;
&lt;!-- 连接池最大空闲 &lt;property name="maxIdle" value="20" /&gt; --&gt;
&lt;!-- 连接池最小空闲 --&gt;
&lt;property name="minIdle" value="0" /&gt;
&lt;!-- 获取连接最大等待时间 --&gt;
&lt;property name="maxWait" value="60000" /&gt; &lt;!-- 打开PSCache,并且指定每个连接上PSCache的大小 --&gt;
&lt;property name="poolPreparedStatements" value="true" /&gt;
&lt;property name="maxPoolPreparedStatementPerConnectionSize" value="20" /&gt; &lt;property name="validationQuery" value="SELECT 1" /&gt;
&lt;property name="testOnBorrow" value="false" /&gt;
&lt;property name="testOnReturn" value="false" /&gt;
&lt;property name="testWhileIdle" value="true" /&gt;
&lt;!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --&gt;
&lt;property name="timeBetweenEvictionRunsMillis" value="60000" /&gt;
&lt;!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --&gt;
&lt;property name="minEvictableIdleTimeMillis" value="25200000" /&gt;
&lt;!-- 打开removeAbandoned功能 --&gt;
&lt;property name="removeAbandoned" value="true" /&gt;
&lt;!-- 1800秒,也就是30分钟 --&gt;
&lt;property name="removeAbandonedTimeout" value="1800" /&gt;
&lt;!-- 关闭abanded连接时输出错误日志 --&gt;
&lt;property name="logAbandoned" value="true" /&gt;
&lt;/bean&gt; &lt;!-- 需要基础spring的 AbstractRoutingDataSource 来实现动态设置数据库连接池 --&gt;
&lt;bean id="dynamicDataSource" class="com.threeweidu.mallmanage.utils.DynamicDataSource"&gt;
&lt;property name="targetDataSources"&gt;
&lt;map key-type="java.lang.String"&gt;
&lt;entry value-ref="pepos" key="pepos"&gt;&lt;/entry&gt;
&lt;entry value-ref="payment" key="payment"&gt;&lt;/entry&gt;
</pre><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 496px; top: 2131px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=16&amp;height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/map&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"defaultTargetDataSource"</span><span>&nbsp;ref=</span><span class="string">"pepos"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;id=<span class="string">"jdbcTemplate"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.springframework.jdbc.core.JdbcTemplate"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"dataSource"</span><span>&nbsp;ref=</span><span class="string">"dynamicDataSource"</span><span>&gt;&lt;/property&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;!--&nbsp;MyBatis配置&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class=""><span>&lt;bean&nbsp;id=<span class="string">"sqlSessionFactory"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.mybatis.spring.SqlSessionFactoryBean"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"dataSource"</span><span>&nbsp;ref=</span><span class="string">"dynamicDataSource"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;自动扫描entity目录,&nbsp;省掉Configuration.xml里的手工配置&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"typeAliasesPackage"</span><span>&nbsp;value=</span><span class="string">"com.threeweidu.mallmanage.entity"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;显式指定Mapper文件位置&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"mapperLocations"</span><span>&nbsp;value=</span><span class="string">"classpath:/com/threeweidu/mallmanage/dao/mybatis/mapper/*Mapper.xml"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&lt;!--&nbsp;配置扫描器&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;bean&nbsp;<span class="keyword">class</span><span>=</span><span class="string">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;扫描me.gacl.dao这个包以及它的子包下的所有映射接口类&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"basePackage"</span><span>&nbsp;value=</span><span class="string">"com.threeweidu.mallmanage.dao.mybatis"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"sqlSessionFactoryBeanName"</span><span>&nbsp;value=</span><span class="string">"sqlSessionFactory"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;!--&nbsp;配置Spring的事务管理器&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class=""><span>&lt;bean&nbsp;id=<span class="string">"transactionManager"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<span class="string">"dataSource"</span><span>&nbsp;ref=</span><span class="string">"dynamicDataSource"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&lt;/bean&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:annotation-driven&nbsp;transaction-manager=<span class="string">"transactionManager"</span><span>&nbsp;proxy-target-</span><span class="keyword">class</span><span>=</span><span class="string">"true"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&lt;!--&nbsp;拦截器方式配置事务&nbsp;--&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;tx:advice&nbsp;id=<span class="string">"transactionAdvice"</span><span>&nbsp;transaction-manager=</span><span class="string">"transactionManager"</span><span>&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:attributes&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"get*"</span><span>&nbsp;&nbsp;&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"true"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"find*"</span><span>&nbsp;&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"true"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"load*"</span><span>&nbsp;&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"true"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"init*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"save*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"add*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"register*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"update*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"delete*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"remove*"</span><span>&nbsp;rollback-</span><span class="keyword">for</span><span>=</span><span class="string">"java.lang.Exception"</span><span>&nbsp;propagation=</span><span class="string">"REQUIRED"</span><span>&nbsp;read-only=</span><span class="string">"false"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tx:method&nbsp;name=<span class="string">"*"</span><span>&nbsp;propagation=</span><span class="string">"SUPPORTS"</span><span>&nbsp;/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tx:attributes&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;/tx:advice&gt;&nbsp;&nbsp;</span></li><li class=""><span>&lt;aop:config&gt;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;aop:pointcut&nbsp;id=<span class="string">"transactionPointcut"</span><span>&nbsp;expression=</span><span class="string">"execution(*&nbsp;com.threeweidu.mallmanage.service..*Impl.*(..))"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;aop:advisor&nbsp;pointcut-ref=<span class="string">"transactionPointcut"</span><span>&nbsp;advice-ref=</span><span class="string">"transactionAdvice"</span><span>/&gt;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&lt;/aop:config&gt;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>lt;/beans&gt;&nbsp;&nbsp;</span></li></ol></div><pre class="java" name="code" style="display: none;"> &lt;/map&gt;
&lt;/property&gt;
&lt;property name="defaultTargetDataSource" ref="pepos"&gt;
&lt;/property&gt;
&lt;/bean&gt; &lt;bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"&gt;
&lt;property name="dataSource" ref="dynamicDataSource"&gt;&lt;/property&gt;
&lt;/bean&gt; &lt;!-- MyBatis配置 --&gt;
&lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&gt;
&lt;property name="dataSource" ref="dynamicDataSource" /&gt;
&lt;!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --&gt;
&lt;property name="typeAliasesPackage" value="com.threeweidu.mallmanage.entity" /&gt;
&lt;!-- 显式指定Mapper文件位置 --&gt;
&lt;property name="mapperLocations" value="classpath:/com/threeweidu/mallmanage/dao/mybatis/mapper/*Mapper.xml" /&gt;
&lt;/bean&gt; &lt;!-- 配置扫描器 --&gt;
&lt;bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&gt;
&lt;!-- 扫描me.gacl.dao这个包以及它的子包下的所有映射接口类 --&gt;
&lt;property name="basePackage" value="com.threeweidu.mallmanage.dao.mybatis" /&gt;
&lt;property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /&gt;
&lt;/bean&gt; &lt;!-- 配置Spring的事务管理器 --&gt;
&lt;bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;
&lt;property name="dataSource" ref="dynamicDataSource" /&gt;
&lt;/bean&gt; &lt;tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /&gt; &lt;!-- 拦截器方式配置事务 --&gt;
&lt;tx:advice id="transactionAdvice" transaction-manager="transactionManager"&gt;
&lt;tx:attributes&gt;
&lt;tx:method name="get*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="find*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="load*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="init*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="save*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="add*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="register*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="delete*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="remove*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="*" propagation="SUPPORTS" /&gt;
&lt;/tx:attributes&gt;
&lt;/tx:advice&gt;
&lt;aop:config&gt;
&lt;aop:pointcut id="transactionPointcut" expression="execution(* com.threeweidu.mallmanage.service..*Impl.*(..))"/&gt;
&lt;aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/&gt;
&lt;/aop:config&gt;

</beans>

多个sqlsessionFactroy 模式

spring-mybatis.xml 配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  8. http://www.springframework.org/schema/tx
  9. http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  12. ">
  13. <import resource="spring-mybatis-shop.xml" />
  14. <import resource="spring-mybatis-payment.xml" />
  15. <!--
  16. <import resource="spring-mybatis-pepos.xml" />
  17. <import resource="spring-mybatis-peposlog.xml" />
  18. <import resource="spring-mybatis-peposchat.xml" />
  19. <import resource="spring-mybatis-vaservice.xml" />
  20. -->
  21. </beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
">
&lt;import resource="spring-mybatis-shop.xml" /&gt;
&lt;import resource="spring-mybatis-payment.xml" /&gt;
&lt;!--
&lt;import resource="spring-mybatis-pepos.xml" /&gt;
&lt;import resource="spring-mybatis-peposlog.xml" /&gt;
&lt;import resource="spring-mybatis-peposchat.xml" /&gt;
&lt;import resource="spring-mybatis-vaservice.xml" /&gt;
--&gt;

</beans>

spring-mybatis-payment.xml 配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  8. http://www.springframework.org/schema/tx
  9. http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  12. ">
  13. <!-- 数据库连接池 -->
  14. <bean id="dataSource_payment" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  15. <property name="url" value="${payment.url}" />
  16. <property name="username" value="${payment.username}" />
  17. <property name="password" value="${payment.password}" />
  18. <!-- 密码解密 -->
  19. <property name="filters" value="config" />
  20. <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" />
  21. <!-- 初始化连接大小 -->
  22. <property name="initialSize" value="3" />
  23. <!-- 连接池最大使用连接数量 -->
  24. <property name="maxActive" value="200" />
  25. <!-- 连接池最大空闲 <property name="maxIdle" value="20" /> -->
  26. <!-- 连接池最小空闲 -->
  27. <property name="minIdle" value="0" />
  28. <!-- 获取连接最大等待时间 -->
  29. <property name="maxWait" value="60000" />
  30. <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
  31. <property name="poolPreparedStatements" value="true" />
  32. <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
  33. <property name="validationQuery" value="SELECT 1" />
  34. <property name="testOnBorrow" value="false" />
  35. <property name="testOnReturn" value="false" />
  36. <property name="testWhileIdle" value="true" />
  37. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  38. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  39. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  40. <property name="minEvictableIdleTimeMillis" value="25200000" />
  41. <!-- 打开removeAbandoned功能 -->
  42. <property name="removeAbandoned" value="true" />
  43. <!-- 1800秒,也就是30分钟 -->
  44. <property name="removeAbandonedTimeout" value="1800" />
  45. <!-- 关闭abanded连接时输出错误日志 -->
  46. <property name="logAbandoned" value="true" />
  47. </bean>
  48. <!-- MyBatis配置 -->
  49. <bean id="sqlSessionFactory_payment" class="org.mybatis.spring.SqlSessionFactoryBean">
  50. <property name="dataSource" ref="dataSource_payment" />
  51. <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
  52. <property name="typeAliasesPackage" value="com.threeweidu.supplier.entity" />
  53. <!-- 显式指定Mapper文件位置 -->
  54. <property name="mapperLocations" value="classpath:/com/threeweidu/supplier/dao/mybatis/payment/mapper/*Mapper.xml" />
  55. </bean>
  56. <!-- 配置扫描器 -->
  57. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  58. <!-- 扫描me.gacl.dao这个包以及它的子包下的所有映射接口类 -->
  59. <property name="basePackage" value="com.threeweidu.supplier.dao.mybatis.payment" />
  60. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_payment" />
  61. </bean>
  62. <!-- 配置Spring的事务管理器 -->
  63. <bean id="transactionManager_payment" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  64. <property name="dataSource" ref="dataSource_payment" />
  65. </bean>
  66. <tx:annotation-driven transaction-manager="transactionManager_payment" proxy-target-class="true" />
  67. <!-- 拦截器方式配置事务 -->
  68. <tx:advice id="transactionAdvice_payment" transaction-manager="transactionManager_payment">
  69. <tx:attributes>
  70. <tx:method name="get*"   propagation="REQUIRED" read-only="true"/>
  71. <tx:method name="find*"  propagation="REQUIRED" read-only="true"/>
  72. <tx:method name="load*"  propagation="REQUIRED" read-only="true"/>
  73. <tx:method name="init*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  74. <tx:method name="save*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  75. <tx:method name="add*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  76. <tx:method name="register*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  77. <tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  78. <tx:method name="delete*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  79. <tx:method name="remove*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/>
  80. <tx:method name="*" propagation="SUPPORTS" />
  81. </tx:attributes>
  82. </tx:advice>
  83. <aop:config>
  84. <aop:advisor advice-ref="transactionAdvice_payment" pointcut="execution(* com.threeweidu.supplier.service..*Impl.*(..))" />
  85. </aop:config>
  86. </beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
">
&lt;!-- 数据库连接池 --&gt;
&lt;bean id="dataSource_payment" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"&gt;
&lt;property name="url" value="${payment.url}" /&gt;
&lt;property name="username" value="${payment.username}" /&gt;
&lt;property name="password" value="${payment.password}" /&gt; &lt;!-- 密码解密 --&gt;
&lt;property name="filters" value="config" /&gt;
&lt;property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${payment.publickey}" /&gt; &lt;!-- 初始化连接大小 --&gt;
&lt;property name="initialSize" value="3" /&gt;
&lt;!-- 连接池最大使用连接数量 --&gt;
&lt;property name="maxActive" value="200" /&gt;
&lt;!-- 连接池最大空闲 &lt;property name="maxIdle" value="20" /&gt; --&gt;
&lt;!-- 连接池最小空闲 --&gt;
&lt;property name="minIdle" value="0" /&gt;
&lt;!-- 获取连接最大等待时间 --&gt;
&lt;property name="maxWait" value="60000" /&gt; &lt;!-- 打开PSCache,并且指定每个连接上PSCache的大小 --&gt;
&lt;property name="poolPreparedStatements" value="true" /&gt;
&lt;property name="maxPoolPreparedStatementPerConnectionSize" value="20" /&gt; &lt;property name="validationQuery" value="SELECT 1" /&gt;
&lt;property name="testOnBorrow" value="false" /&gt;
&lt;property name="testOnReturn" value="false" /&gt;
&lt;property name="testWhileIdle" value="true" /&gt;
&lt;!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --&gt;
&lt;property name="timeBetweenEvictionRunsMillis" value="60000" /&gt;
&lt;!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --&gt;
&lt;property name="minEvictableIdleTimeMillis" value="25200000" /&gt;
&lt;!-- 打开removeAbandoned功能 --&gt;
&lt;property name="removeAbandoned" value="true" /&gt;
&lt;!-- 1800秒,也就是30分钟 --&gt;
&lt;property name="removeAbandonedTimeout" value="1800" /&gt;
&lt;!-- 关闭abanded连接时输出错误日志 --&gt;
&lt;property name="logAbandoned" value="true" /&gt;
&lt;/bean&gt; &lt;!-- MyBatis配置 --&gt;
&lt;bean id="sqlSessionFactory_payment" class="org.mybatis.spring.SqlSessionFactoryBean"&gt;
&lt;property name="dataSource" ref="dataSource_payment" /&gt;
&lt;!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --&gt;
&lt;property name="typeAliasesPackage" value="com.threeweidu.supplier.entity" /&gt;
&lt;!-- 显式指定Mapper文件位置 --&gt;
&lt;property name="mapperLocations" value="classpath:/com/threeweidu/supplier/dao/mybatis/payment/mapper/*Mapper.xml" /&gt;
&lt;/bean&gt; &lt;!-- 配置扫描器 --&gt;
&lt;bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&gt;
&lt;!-- 扫描me.gacl.dao这个包以及它的子包下的所有映射接口类 --&gt;
&lt;property name="basePackage" value="com.threeweidu.supplier.dao.mybatis.payment" /&gt;
&lt;property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_payment" /&gt;
&lt;/bean&gt; &lt;!-- 配置Spring的事务管理器 --&gt;
&lt;bean id="transactionManager_payment" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;
&lt;property name="dataSource" ref="dataSource_payment" /&gt;
&lt;/bean&gt; &lt;tx:annotation-driven transaction-manager="transactionManager_payment" proxy-target-class="true" /&gt; &lt;!-- 拦截器方式配置事务 --&gt;
&lt;tx:advice id="transactionAdvice_payment" transaction-manager="transactionManager_payment"&gt;
&lt;tx:attributes&gt;
&lt;tx:method name="get*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="find*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="load*" propagation="REQUIRED" read-only="true"/&gt;
&lt;tx:method name="init*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="save*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="add*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="register*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="update*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="delete*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="remove*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/&gt;
&lt;tx:method name="*" propagation="SUPPORTS" /&gt;
&lt;/tx:attributes&gt;
&lt;/tx:advice&gt;
&lt;aop:config&gt;
&lt;aop:advisor advice-ref="transactionAdvice_payment" pointcut="execution(* com.threeweidu.supplier.service..*Impl.*(..))" /&gt;
&lt;/aop:config&gt;

</beans>

参考:http://blog.csdn.net/xingxiupaioxue/article/details/51094091

Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory(转)的更多相关文章

  1. Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory

    一.摘要 上两篇文章分别介绍了Spring3.3 整合 Hibernate3.MyBatis3.2 配置多数据源/动态切换数据源 方法 和 Spring3 整合Hibernate3.5 动态切换Ses ...

  2. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

    一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...

  3. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源方法

    一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...

  4. Spring Boot整合Druid配置多数据源

    Druid是阿里开发的数据库连接池,功能强大,号称Java语言中最好的数据库连接池.本文主要介绍Srping Boot下用Druid配置多个数据源,demo环境为:Spring Boot 2.1.4. ...

  5. Spring Boot数据访问之多数据源配置及数据源动态切换

    如果一个数据库数据量过大,考虑到分库分表和读写分离需要动态的切换到相应的数据库进行相关操作,这样就会有多个数据源.对于一个数据源的配置在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的 ...

  6. Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)

    一.缘由 上一篇文章Spring3.3 整合 Hibernate3.MyBatis3.2 配置多数据源/动态切换数据源 方法介绍到了怎么样在Sping.MyBatis.Hibernate整合的应用中动 ...

  7. SpringBoot整合MyBatisPlus配置动态数据源

    目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...

  8. Spring3.2+mybatis3.2+Struts2.3整合

    1.Spring3.2不能用于JDK1.8,只能用于JDK1.7.JDK1.8用spring4.0. 2.导入的jar包 3.目录结构: 4.配置Spring 配置数据库信息: <?xml ve ...

  9. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...

随机推荐

  1. python2中打印列表与字典内的中文字符

    在开发过程中,我们经常需要打印一些变量的值,便于调试.这个时候就会发现如果在列表与字典这些容器中,如果包含中文字符,不管是str类型,还是unicode类型,都打印不出来.如下: >>&g ...

  2. bzoj 1088 [SCOI2005] 扫雷

    SCOI2005 扫雷 一道很有趣的(水)题 “这道题有四种解法,你知道么” 给你矩阵的第二列的数字,求出第一列雷有多少种可能的摆法. 不懂扫雷规则的自行按win+R然后输入winmine 思考过后我 ...

  3. CF37E Trial for Chief(最短路)

    题意 题意是给你一张 NMNMNM 的图,每个点有黑色和白色,初始全为白色,每次可以把一个相同颜色的连续区域染色,求最少的染色次数:(n,m<=50) 题解 转化为最短路.对于每一个点与它相邻的 ...

  4. [USACO14FEB]路障Roadblock

    题目:洛谷P2176. 题目大意:有n个点m条无向边,一个人要从1走到n,他会走最短路.现在可以让一条边的长度翻倍,求翻倍后这个人要多走多少距离. 解题思路:首先可以知道,翻倍肯定是在最短路上的某条边 ...

  5. HTTP状态码以及其含义大全 _IT技术小趣屋

    原文:HTTP状态码以及其含义大全 _IT技术小趣屋 HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码.我们在开发过程中比较常见的状态码 ...

  6. socket 编程的端口和地址复用

    在linux socket网络编程中,大规模并发TCP或UDP连接时,经常会用到端口复用:   int opt = 1;   if(setsockopt(sockfd, SOL_SOCKET,SO_R ...

  7. CodeForces 383C Propagating tree

    Propagating tree Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...

  8. Exception: Operation xx of contract xx specifies multiple request body parameters to be serialized without any wrapper elements.

    Operation 'CreateProductCodeStock' of contract 'IChileService' specifies multiple request body param ...

  9. apiCloud手动检测更新

    有时候需要给用户一个自主的权利,自主检测app是否是最新版本. 如何实现? 1.点击调用接口,检测是否有更新. 默认APICloud会自动检测版本更新,用户也可以在config.xml里配置autoU ...

  10. XML结构,写到TreeView树上

    http://blog.csdn.net/ztzi321/article/details/44077563