java-web 小知识点
Servlet并发问题
纯理论:1 合理决定在Servlet中定义变量的作用域类型
局部变量(方法中定义)------->每一个线程执行局部变量所在的方法时,在线程堆栈就会创建这个局部变量,线程执行完毕方法,局部变量就over. 多个线程同时执行该局部变量,那么每个线程都拥有自己的局部变量
实例变量(类中,非方法中)--->每一个类实例都拥有自己的实例变量,实例生命周期,则变量也就over.多个线程同时执行一个实例方法A,若该实例方法A会访问一个实例变量,这么多的线程访问的是同一个实例变量
2 多个线程同时访问共享数据而导致并发问题的情况,使用java同步机制对线程进行同步 在Servlet需要执行的方法中添加 synchronized (this)
3 废弃的SingleThreadModel接口
任一时刻,只允许有一个线程执行Servlet中的service()方法,多个用户访问的时候,则会将客户请求被放入等待队列,容器会依次响应队列中的每个客户请求,实际上禁止了多个客户端对一个Servlet的并发访问
Servlet容器为每个Servlet创建一个对象池,池中存放了同一个Servlet类的多个实例。若多个用户访问该Servlet,该Servlet会为每一个请求分配一个工作线程,并且从对象池中取出一个空闲的Servlet实例,将它分配给工作线程
每个工作线程执行自己的Sevlet实例的service()方法,实际上不同客户端访问的是同一个Servlet类的不同实例
动态部署文件,修改web代码能够及时响应,并且tomcat在启动的时候要点击的按钮是debug的那个按钮
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" reloadable="true" docBase="D:\apache-tomcat-7.0.35\webapps"/>
</Host>
配置log4日志文件输出的位置时
System.getProperty("user.dir");//项目所在的文件夹下面
模拟多次访问一个页面的时候,要使用类似下面的代码,URL加上参数是不能用模拟Post请求的
如下代码仅供参考
URL url = new URL("http://localhost:8010/AGFSDataService/servlet/LoginJudge"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(10000);//连接超时 单位毫秒 conn.setReadTimeout(2000);//读取超时 单位毫秒 conn.setDoOutput(true);// 是否输入参数 StringBuffer params = new StringBuffer(); // 表单参数与get形式一样 params.append("TxtUserName").append("=").append("1").append("&") .append("TxtPassword").append("=").append("1").append("&") .append("choseDate").append("=").append("week");