- 欢迎大家提出自己的疑问点
- 本人在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
- 连接这类知识,无非就是创建和销毁会消耗大量资源,保持个别连接存活,不但节省资源,而且还能够提高性能
总结
- 这篇文章也许没什么干货,但它让我的思考找到了一些解决的思路
-
- 自己动手去实现一个简单的多线程处理多个用户请求的服务器
-
- 不断探索tomcat,Servlet的原理,它是其他框架,如SpringMVC的鼻祖
-
- 多思考web应用的整个流程,只有打通各个环节,架起一座大厦的框架,其余的事就是不断地搬砖添瓦。