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

  • 欢迎大家提出自己的疑问点
  • 本人在web应用开发的学习过程中,以Java语言为主线,在用户访问服务器的过程中,涉及到的一些细节问题,所以作此文,希望大家能够指点一二。
Web应用架构图

焦点
  • 本文围绕HTTP连接,并发处理(Java线程池),数据库连接池三方面进行逐一思考和解决,是一个学习的过程,希望得到大家的解答
重点疑问
  • 主要是思考我们平时学习的Java并发,为什么在平时开发web应用时,完全没有去使用?
  • 是不是Spring体系框架已经内部处理这种并发访问的连接?
  • 那我们平时学习这些创建线程,线程池的作用在哪里?为了面试?
  • 一般我们都是使用main方法来启动多线程,学习多线程,但是我们有没有思考过,大量的访问到来时,需要我们去写并发来处理这些访问?我们是如何让每个线程自动去接收这些请求并处理的 ?
  • 这些都是我的疑问,也是写这个文章的原因,但愿大家能够分享自己的见解
  • 如果没能够理解我的问题,可以留言,我会一一完善。
客户端
  • 1、首先我们经常在网上看到一些文章,类似名为《从浏览器输入url到页面的显示的全过程》,文章能够为了阐述整个思路
  • 2、我们在浏览器上输入url后,会进行DNS解析,再根据IP进行访问。当有大量的用户同时访问同一个站点时,根据HTTP各版本的类型,针对HTTP连接有不同的进化(HTTP1.0默认使用短连接,HTTP使用长连接)
  • 3、长连接,当一个网页打开后,客户端和服务端之间的连接不会关闭,保持一个设定的时间,客户端再次访问这个服务器时,会继续使用这个连接。
服务器端
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应用的整个流程,只有打通各个环节,架起一座大厦的框架,其余的事就是不断地搬砖添瓦。

转载于:https://juejin.im/post/5cc3e54fe51d456e883339d9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值