• 风轻扬
    2023-05-21 来自北京
    读写分离的实现,按照老师的思路,实现了一下。 1、增加sqlType参数。 首先改造MapperNode,增加sqlType参数. 2、注入双数据源。 因为我们配置到applicationContext.xml中的是SqlSessionFactory,所以数据源的注入要在这个类中。 public class DefaultSqlSessionFactory implements SqlSessionFactory { ........ @Autowired private DataSource readDataSource; @Autowired private DataSource writeDataSource; @Override public SqlSession openSession() { ....... defaultSqlSession.setReadDataSource(readDataSource); defaultSqlSession.setWriteDataSource(writeDataSource); return defaultSqlSession; ....... } ........ } 3、根据sqlType将不同的数据源注入jdbcTemplate中 之后在openSession的时候,塞给SqlSession对象。当用户执行操作的时候,根据操作类型的不同,给JdbcTemplate注入不同的数据源 public class DefaultSqlSession implements SqlSession{ ......... private DataSource readDataSource; private DataSource writeDataSource; ....省略readDataSource和writeDataSource的set方法.... @Override public Object selectOne(String sqlId, Object[] args, PrepareStatementCallBack pstmtcallback) throws Exception { MapperNode mapperNode = this.sqlSessionFactory.getMapperNode(sqlId); if (mapperNode.getSqlType().equals("3")) { jdbcTemplate.setDataSource(readDataSource); } return jdbcTemplate.queryObject(mapperNode.getSql(), args, pstmtcallback); } @Override public Integer delete(String sqlId, Object[] args) throws Exception { MapperNode mapperNode = this.sqlSessionFactory.getMapperNode(sqlId); if (mapperNode.getSqlType().equals("1")) { jdbcTemplate.setDataSource(writeDataSource); } return jdbcTemplate.delete(mapperNode.getSql(), args); } ......... }
    展开

    作者回复: 赞一个!

    
    1
  • peter
    2023-04-17 来自北京
    请教老师几个问题: Q1:会讲解MiniTomcat吗? 很期望针对Tomcat也出一个类似的专栏。 Q2:MVC会导致低并发吗? MVC用一个单一的 Servlet 拦截所有请求,这个设计会降低系统的并发吗?

    作者回复: 会跟平台商量是不是要出MiniTomcat。 并发问题需要系统级的解决(web server, servlet 容器,缓存,连接池等等),不是单一servlet这一点可以决定的,servlet本身也是单实例多线程的。

    
    