• 讲讲“池”的概念---线程池,数据库连接池,常量池


    1.池,说白了就是提前创建好了东西放在池子里,你直接去池子里拿去用就行了,有现成的可用的,节省了你临时创建的时间。

    2.jdbc connection,线程thread,对象,这些东西的创建和销毁都是很消耗时间的,所以我们一般都是提前创建好很多这种创建消耗高的东西,用的时候直接去用就行。

    3.数据库连接池用的地方是:mybatis/hibernate这种sql语句操作时,临时创建connection是很消耗时间的,所以为了提高获取数据库数据的效率,在开机阶段都创建很多connection。且connection是tcp长连接的,这些数据库连接池中的connetcion可以存货很长时间。

    可以设置connection的maxage,数据库连接池c3p0等,都有保持connection连接存货的机制,通过connecton发送空数据包保证connection存活。

    4.线程池:线程池,主要是因为thread的创建和销毁是要消耗时间的,thread创建大概消耗0.02秒。java ee服务器在启动的时候,它已经创建好了很多的thread,用以来http request连接的时候,用这些创建好的thread去处理这些http连接。这些都是tomcat已经帮你做好的功能,Apache早就写好了类似的代码。

    当处理Io操作时,我们习惯用线程池,因为io操作是阻塞的。所以就是在处理阻塞方法时,我们用多线程来提高效率。

    5.常量池:字符创常量池,string那些具体final对象,下次用直接去常量池拿就行,很快 ,免去再次创建。string name="tom";

    6.因为池子的特性是容纳多个数据,所以池子都是list等集合类,因为要一直保持住这些数据,所以list这些集合类,又要一直保存在内存中,所以很消耗资源的,并且得是静态的来保证常驻内存。

    7.附数据库连接池代码和tomcat服务器线程池处理http request方法。

    tomcat服务器处理http连接请求,采用多线程,bio,线程池方法

    try
    { ServerSocket ss = new ServerSocket(10000); System.out.println("server start..."); while (true) { Socket s = ss.accept(); new LogicThread(s);//开一个线程来处理请求,这里面调用InputStream.read()读取请求信息 } } catch (Exception e) { e.printStackTrace(); } } } 4.可以分析创建服务器的每个具体步骤。首先创建ServerSocket,然后接受新的连接请求,在LogicThread中处理请求。 传统IO方式(阻塞I/O)在调用InputStream.read()/buffer.readLine()方法时是阻塞的,它会一直等到数据到来或缓冲区已满时或超时时才会返回,并且产生了大量String类型垃圾,尽管可以使用StringBuffer优化;同样,在调用ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回,每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。并且多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部未准备好的时候,都会阻塞掉。阻塞的结果就是会带来大量的进程上下文切换。且大部分进程上下文切换可能是无意义的。比如假设一个线程监听某一个端口,一天只会有几次请求进来,但是该 cpu 不得不为该线程不断做上下文切换尝试,大部分的切换以阻塞告终。
  • 相关阅读:
    实现第三方系统单点登录
    python爬虫
    webot设备motor的api
    webots学习
    python学习算术运算
    python快捷键与命令函数
    python学习构造和析构
    python学习对象相关的bif
    python学习对象:拾遗
    matlab基础知识
  • 原文地址:https://www.cnblogs.com/panxuejun/p/6480746.html
Copyright © 2020-2023  润新知