从客户端到服务器再到数据库的一些思考与疑问

  • 欢迎你们提出本身的疑问点
  • 本人在web应用开发的学习过程当中,以Java语言为主线,在用户访问服务器的过程当中,涉及到的一些细节问题,因此做此文,但愿你们可以指点一二。

Web应用架构图

焦点

  • 本文围绕HTTP链接,并发处理(Java线程池),数据库链接池三方面进行逐一思考和解决,是一个学习的过程,但愿获得你们的解答
重点疑问
  • 主要是思考咱们平时学习的Java并发,为何在平时开发web应用时,彻底没有去使用?
  • 是否是Spring体系框架已经内部处理这种并发访问的链接?
  • 那咱们平时学习这些建立线程,线程池的做用在哪里?为了面试?
  • 通常咱们都是使用main方法来启动多线程,学习多线程,可是咱们有没有思考过,大量的访问到来时,须要咱们去写并发来处理这些访问?咱们是如何让每一个线程自动去接收这些请求并处理的 ?
  • 这些都是个人疑问,也是写这个文章的缘由,希望你们可以分享本身的看法
  • 若是没可以理解个人问题,能够留言,我会一一完善。

客户端

  • 一、首先咱们常常在网上看到一些文章,相似名为《从浏览器输入url到页面的显示的全过程》,文章可以为了阐述整个思路
  • 二、咱们在浏览器上输入url后,会进行DNS解析,再根据IP进行访问。当有大量的用户同时访问同一个站点时,根据HTTP各版本的类型,针对HTTP链接有不一样的进化(HTTP1.0默认使用短链接,HTTP使用长链接)
  • 三、长链接,当一个网页打开后,客户端和服务端之间的链接不会关闭,保持一个设定的时间,客户端再次访问这个服务器时,会继续使用这个链接。

服务器端

Spring框架内置线程池
  • 毋庸置疑,平时咱们写web应用网站时,都是由于咱们使用了框架,因此才会感受到一直在写业务逻辑代码,学习过的并发从未派上过用场,这是由于框架使并发透明化,“摸不着,看不见”。
  • 对于Spring的系统,通常都分为Controller,Service,DAO;对于Service,通常会注入DAO,而DAO就回用到数据链接Connection,咱们知道Connection是有状态的,在多线程环境下,确定会遇到问题,Spring为咱们考虑到了这种状况,对此作了特殊处理,只要使用Spring提供的线程绑定资源获取工具获得的Connection就是线程安全的,JDBC或MyBatis对应DataSourceUtils,Hibernate对应SessionFactoryUtils,从相应的工具类中获取的Connection,经过了ThreadLocal处理,因此不会出现线程安全问题。另外Spring为咱们作了更多事情,咱们能够没必要本身取获取Connection,Spring为咱们提供了DAO模板类,JDBC对应JdbcTemplate,Hibernate对应HibernateTemplate,MyBatis对应SqlMapClientTemplate,直接使用模板进行数据访问操做彻底不用担忧线程安全问题(其内部其实也是调用了相应的工具类)。因此咱们的DAO彻底能够成为singletion 对象。而后只要使用Spring提供的事务管理,咱们的Service也一样能够成为singletion 对象。而咱们的Controller,若是只注入了Service,而没有其余状态对象,一样能够成为singletion 对象。固然了,若是还包含其余有状态的成员属性,Spring也是无能为力的,这时候只能定义为request或者其余合适的对象了。(摘抄https://www.oschina.net/question/661185_116863)
  • 配置线程池
<!-- spring thread pool executor -->           
    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!-- 线程池维护线程的最少数量 -->
        <property name="corePoolSize" value="5" />
        <!-- 容许的空闲时间 -->
        <property name="keepAliveSeconds" value="200" />
        <!-- 线程池维护线程的最大数量 -->
        <property name="maxPoolSize" value="10" />
        <!-- 缓存队列 -->
        <property name="queueCapacity" value="20" />
        <!-- 对拒绝task的处理策略 -->
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
    </bean>
复制代码
本身搭建一个处理并发访问的框架??
  • 线索1:咱们平时接触的tomcat,套接字Socket就是专门接收客户端请求的,能否从这入手理解?
  • 线索2:利用多线程来实现一个简单的服务器,来实现处理多个用户的请求??
  • 线索3:多线程+Socket实现多用户多功能并行请求的服务端设计
  • 线索4: 多线程阻塞I/O模型
  • 线索5:多线程非阻塞I/O模型

数据库

  • 数据库链接池druid
  • 链接这类知识,无非就是建立和销毁会消耗大量资源,保持个别链接存活,不但节省资源,并且还可以提升性能

总结

  • 这篇文章也许没什么干货,但它让个人思考找到了一些解决的思路
    1. 本身动手去实现一个简单的多线程处理多个用户请求的服务器
    1. 不断探索tomcat,Servlet的原理,它是其余框架,如SpringMVC的鼻祖
    1. 多思考web应用的整个流程,只有打通各个环节,架起一座大厦的框架,其他的事就是不断地搬砖添瓦。
相关文章
相关标签/搜索