整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Tomcat 原理、調優和錯誤匯總

          Tomcat 原理、調優和錯誤匯總

          地環境:Tomcat 6、Windows 10、Java 1.7、myeclipse 10

          一、使用方法

          1.1 Tomcat 部署靜態頁面

          參考鏈接:https://blog.csdn.net/qq_32786873/article/details/79609314

          二、使用錯誤

          2.1 503 Service Unavailable

          原因:

          2.2 The web application [/project-name] registered the JDBC driver [oracle.jdbc.driver.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

          或者The web application [/project-name] registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

          可能存在的問題

          • 數據庫賬號密碼錯誤
          • 有多個數據庫配置源
          • jar包問題,把連接jdbc的jar包,拷貝到tomcate的lib目錄下就可以了,如:ojdbc14.jar
          • 服務器內存沖突,重啟系統
          • Tomcat內存不夠
          • Window->Preferences->tomcat 點擊右側的按鈕,
          • Creat Launch Configuration,在你對應的tomcat屬性Aarguments下面添加一句話:
          • -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256m
          • 誤報:https://github.com/alibaba/druid/issues/1699

          實現ServletContextListener,然后再contextDestroyed()方法中添加如下代碼:

          Enumeration drivers=DriverManager.getDrivers();

          while (drivers.hasMoreElements()) {

          Driver driver=drivers.nextElement();

          try {

          DriverManager.deregisterDriver(driver);

          logger.info(String.format(“deregistering jdbc driver: %s”, driver));

          } catch (SQLException e) {

          e.printStackTrace();

          logger.error(String.format(“deregistering jdbc driver: %s”, driver));

          }

          }

          最后在web.xml中注冊自己的監聽器,問題解決。

          2.3 lib1.so: lib2.so: 無法打開共享對象文件: 沒有那個文件或目錄

          (1)如果共享庫文件安裝到了/lib或/usr/lib目錄下, 那么需執行一下ldconfig命令

          (2)

           # cat /etc/ld.so.conf
           include ld.so.conf.d/*.conf
           # echo "/usr/local/lib" >> /etc/ld.so.conf
           # ldconfig
          

          (3) export LD_LIBRARY_PATH=…/webapps/項目名稱/WEB-INF/classes

          參考鏈接:https://www.cnblogs.com/Anker/p/3209876.html

          myeclipse修改代碼后無法實時加載到tomcat

          暫未解決

          三、原理

          概述

          HTTP server主要用來給瀏覽器等客戶端提供靜態資源的訪問功能,還有代理服務器、負載均衡等功能。當然,通過CGI/Servlet技術,也可以將處理過的動態內容通過HTTP Server分發,但是一個HTTP Server始終只是把服務器上的文件如實的通過HTTP協議傳輸給客戶端。

          而tomcat屬于application server,也是綁定服務器IP并監聽TCP端口。它實現了部分HTTP server的功能,沒有nginx和Apache的功能豐富。主要用于處理動態內容。沒有提供java EE規范,如下圖:

          架構

          兩大核心部分connector(連接器)和container(容器)。

          tomcat的work目錄是工作目錄,在瀏覽器訪問jsp=》java=》.class。tomcat定時掃描work目錄,不是實時的,因此修改jsp文件后不會立馬生效,可以立即刪除work目錄。

          針對由jsp轉換成的java文件,比如my-jsp.java,tomcat編譯支持的文件大小最大為64k。改進:1.把jsp中的業務邏輯寫入單獨的類,在jsp中通過調用這個類的靜態方法來執行;2.將jsp頁面中的js提取出來放到單獨的js文件內。

          AJP協議:二進制協議

          客戶端< - http / s->代理< - http / s - >應用

          VS

          客戶端< - http / s->代理< - AJP - >應用

          xshell 關閉后 linux的tomcat斷掉解決

          方法一:

          輸入命令

          nohup ./catalina.sh run &

          顯示為:

          [1]8579

          如何關掉?

          輸入命令查看進程號

          ps -ef |grep tomcat
          

          顯示處root 456 33345 99。。。省略

          其中33345為端口號

          輸入命令結束進程 kill -9 進程號

          kill -9 33345

          方法二:

          啟動方式

          (1)Catania

          (2)startup

          使用startup方式啟動tomcat,tomcat運行不受shell影響。

          Several ports (8005, 8080, 8009) required by Tomcat Server at localhost are already in use

          方法一:進入tomcat bin目錄執行shutdown.sh或者shutdown.bat。

          方法二:進一步排查——任務管理器或者命令行kill殺掉Java、tomcat相關進程,重啟eclipse。

          tomcat 調優

          動靜分離

          nginx+tomcat,使用nginx實現靜態資源的訪問,tomcat處理jsp。

          tomcat線程池

          打開tomcat的server.xml

          配置Executor

          ??<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4" maxIdLeTime="60000"/>

          參數解釋

          name

          給執行器(線程池)起一個名字

          namePrefix

          指定線程池中的每一個線程的name前綴

          maxThreads

          線程池中最大的線程數量

          假設:請求的數量超過了“750”,這將不是意味著將maxThreads屬性值設置為“750”,它的最好解決方案是使用“Tomcat集群”。

          也就是說,如果有“1000”請求,兩個Tomcat實例設置“maxThreads=500”,而不在單Tomcat實例的情況下設置maxThreads=1000。

          minSpareThreads

          線程池中允許空閑的線程數量(多余的線程都殺死)

          maxIdLeTime

          一個線程空閑多久算是一個空閑線程

          其他的配置其實閱讀官方文檔是最好的。

           <Connector port="8081" protocol="HTTP/1.1" executor="tomcatThreadPool"
           connectionTimeout="20000"
           redirectPort="8443" enableLookups="false"/>
          

          enableLookups="false"

          關閉dns解析,減少性能損耗

          minProcessors

          服務器啟動時創建的最少線程數

          maxProcessors

          最大可以創建的線程數

          acceptCount=“1000”

          線程池中的線程都被占用,允許放到隊列中的請求數

          maxThreads=“3000”

          最大線程數

          minSpareThreads=“20”

          最小空閑線程數,這里是一直會運行的線程

          和壓縮有關系的配置

          通過修改tomcat的運行模式

          BIO

          Tomcat8以下版本,默認使用的就是BIO(阻塞式IO)模式。

          對于每一個請求都要創建一個線程來進行處理,不適合高并發

          APR(Apache Portable Runtime)

          是Tomcat生產環境運行的首選方式

          如果操作系統未安裝apr或者apr路徑未指到Tomcat默認可識別的路徑,

          則apr模式無法啟動,自動切換啟動nio模式。

          所以必須要安裝apr和native,直接啟動就支持apr

          apr是從操作系統級別解決異步IO問題,apr的本質就是使用jni(java native interface)

          技術調用操作系統底層的IO接口,所以需要提前安裝所需要的依賴

          提升Tomcat對靜態文件的處理性能,當然也可以采用動靜分離。

          禁用AJP連接器 Apache JServer Protocol

          使用Nginx+tomcat的架構,所以用不著AJP協議,所以把AJP連接器禁用

          Linux 下修改 TOMCAT_HOME/bin/catalina.sh,在其中加入,可以放在 CLASSPATH=下面:

          JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"

          windows 下修改 TOMCAT_HOME/bin/catalina.bat,在其中加入,可以放在 set CLASSPATH=下面:

          set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m

          這些參數在我們學習 JVM 部分文章時已經都認識過了,不過這里還是簡單介紹下:

          -server:啟用 JDK的 server 版本;

          -Xms:Java虛擬機初始化時堆的最小內存,一般與 Xmx配置為相同值,這樣的好處是GC不必再為擴展內存空間而消耗性能;

          -Xmx:Java虛擬機可使用堆的最大內存;

          -XX:PermSize:Java虛擬機永久代大小;

          -XX:MaxPermSize:Java虛擬機永久代大小最大值;

          線程池配置

          <Executor name="tomcatThreadPool" 
           namePrefix="catalina-exec-" 
           maxThreads="1000" 
           minSpareThreads="100" 
           maxIdleTime="60000" 
           maxQueueSize="Integer.MAX_VALUE" 
           prestartminSpareThreads="false" 
           threadPriority="5" 
           className="org.apache.catalina.core.StandardThreadExecutor"/> 
          

          name:線程池名稱,用于 Connector中指定。 namePrefix:所創建的每個線程的名稱前綴,一個單獨的線程名稱為

          namePrefix+threadNumber。 maxThreads:池中最大線程數。

          minSpareThreads:活躍線程數,也就是核心池線程數,這些線程不會被銷毀,會一直存在。

          maxIdleTime:線程空閑時間,超過該時間后,空閑線程會被銷毀,默認值為6000(1分鐘),單位毫秒。

          maxQueueSize:在被執行前最大線程排隊數目,默認為Int的最大值,也就是廣義的無限。除非特殊情況,這個值不需要更改,否則會有請求不會被處理的情況發生。

          prestartminSpareThreads:啟動線程池時是否啟動 minSpareThreads部分線程。默認值為false,即不啟動。

          threadPriority:線程池中線程優先級,默認值為5,值從1到10。

          className:線程池實現類,未指定情況下,默認實現類為org.apache.catalina.core.StandardThreadExecutor。如果想使用自定義線程池首先需要實現

          org.apache.catalina.Executor接口。

          線程池配置完成后需要在 Connector 中指定:

          <Connector executor="tomcatThreadPool" 
          ... 
          

          <Connector port="9027"
             ...........
             compression="on"
             compressionMinSize="2048"
           connectionTimeout="20000"
           compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
           ................
             />
          

          compression 打開壓縮功能

          compressionMinSize 啟用壓縮的輸出內容大小,這里面默認為2KB

          compressableMimeType 壓縮類型

          connectionTimeout 定義建立客戶連接超時的時間. 如果為 -1, 表示不限制建立客戶連接的時間

          參考鏈接:1.Tomcat 性能優化——

          https://gitbook.cn/books/5ad3405a1b0f9f64ea5f7758/index.html#writeCommentDiv

          本信息

          姓名:七分簡歷

          年齡:28歲

          電話:186****7462

          郵箱:449375****@qq.com

          經驗:6年

          意向:java軟件工程師

          教育背景

          時間:2012-09 - 2014-06

          學校:【七分簡歷】師范大學 | 專業:計算機軟件 | 學歷:大專

          工作經歷

          工作時間:2014-08 - 2017-07

          公司名稱:【七分簡歷】信息科技有限公司 | 所在部門: | 所在崗位:java軟件工程師

          工作描述:

          職 位:Java軟件工程師

          工作描述:

          1.參與項目的需求分析,研究項目功能實現細節。

          2.根據新項目開發進度和任務分配,開發相應軟件;根據需求及時修改完善軟件。

          3.在編程中積累解決問題的經驗能高效且規范書寫代碼。

          4.在自行編寫完成時進行軟件的測試和修復。

          工作時間:2015-09 - 2016-04

          公司名稱:【七分簡歷】網絡科技有限公司 | 所在部門: | 所在崗位:java軟件開發實習工程師

          工作描述:

          在該公司,作為java開發實習生主要負責的工作有:

          1、按照軟件開發管理規范等的要求,根據主管分配的任務,參與程序開發、測試以及文檔準備工作;

          2、根據業務需求參與業務系統的系統設計或開發實現模塊的設計、編碼和單元測試工作;

          項目經歷

          項目時間:2015-04 - 2016-04

          項目名稱:鮮果之家 | 項目工具:Windows

          項目描述:

          項目介紹

          此電商系統屬于B2C模式的一個水果商城,該商城致力于為客戶提供選購、定制、配送、售后的全方位服務。商城主要功能模塊有:用戶管理、角色管理、權限管理、商品管理、公告管理、產品交易,訂單管理,退款管理,賬目統計,有問有答,界面管理。

          根據項目需求,采用 Spring, SpringMVC,Mybatis作為底層框架,對項目進行一個分布式開發,采用MySql數據庫,使用SVN對代碼進行版本控制。使用Ajax異步以及正則表達式驗證輸入信息是否合法;使用fileupload組件實現用戶信息的文件上傳,使用init函數實現用戶管理、商品管理、角色管理四個模塊的分頁操作;使用BootStrap 設計后臺管理界面;使用 Shiro 實現用戶登錄的權限控制;使用redis緩存技術高效獲取顯示列表數據,以減輕服務器所承載的壓力。

          我的職責

          主要負責后臺管理模塊:用戶管理、商品管理、角色管理、公告管理,根據所需求的業務進行開發,代碼編寫,實現功能

          項目時間:2015-07 - 2016-04

          項目名稱:夠潮網女性購物商城

          項目描述:

          項目介紹

          “夠潮網女性購物商城”針對廣大女性消費群眾,為她們提供便利,從而提高生活水平的一個網上購物商城。該項目主要分為用戶管理、公告管理、商品類型管理、商品管理、商品屬性管理、評論管理、客戶管理、訂單管理、物流管理等模塊。

          我的職責

          1.對負責的模塊進行分析和設計。主要采用UML的用例圖、順序圖和狀態圖。

          2. 模塊管理:完成對該系統中各個模塊的管理。主要為CRUD操作。

          3. 角色管理和用戶管理:除基本的CRUD操作外,主要為權限的管理;該系統采用RBAC模式實現權限管理。將權限

          授予如普通管理員和超級管理員,再將角色分配給用戶的方式,實現對用戶的授權;同時系統也可以對用戶直接進行

          授權。授權的具體實現采用DWR框架。

          4. 工作流程:采用JBPM實現工作流程開發。

          個人評價

          1、為人穩重踏實,具有一定的邏輯思維能力,有較強的解決和分析問題能力;

          2、工作能吃苦,做事積極、踏實,能獨立完成功能模塊的開發。

          3、有較強的自學能力,能較快熟悉新技術。

          4、待人熱誠,能很好的與人溝通,具有較強的團隊意識,集體榮譽感及組織協調能力。

          5、熟練使用SSM、SSH等主流框架技術,對shiro框架有一定了解。

          6、熟悉Bootscrap、EasyUI、jquery前端技術。

          7、熟練SQLServer,MySQL數據庫,了解Oracle數據庫。

          8、熟練掌握Tomcat服務器的安裝部署。

          9、熟練使用MyEclipse、Eclipse等開發工具進行開發。

          個人技能

          J2EE的主流框架SSH(hibernate,Struts2,Spring)

          能運用SVN,Maven的功具

          SQL Server,MySQL,oracle

          Tomcat,jboss

          Eclipse,MyEclipse

          HTML,JSP,jQuery,Ajax,div+css,echarts

          oop

          JUnit代碼的單元測試

          linux常用的命令

          了解io、多線程、集合

          織良好的業務數據可以顯著改善關鍵的決策過程。使用MyEclipse Reports?工具來開發各種Web報表。在本教程中,您將學習到:

          • 創建一個報表Web項目和數據源
          • 創建、布局和格式化的報表
          • 創建一個數據集
          • 排序報表數據
          • 部署和測試報表項目

          持續時間:30分鐘

          沒有MyEclipse?立即下載

          1. 創建一個報表Web項目

          這里有兩種方法來創建報表Web項目。第一種方法是使用報表向導來創建一個新的項目;第二種方法是添加報表Web Runtime Facet到一個現有的MyEclipse Web項目中。

          注意:MyEclipse標準用戶不能使用報表功能。

          1.1 創建一個新的報表Web項目

          (1)選擇File>New>Report Web Project。

          (2)在項目名稱字段中輸入reportdemo,然后單擊下一步。

          注意:本教程使用默認的JavaEE 6版本;然而,在創建新的項目是JavaEE 7也是可行的。

          創建一個新的報表Web項目

          (3)配置項目文件夾結構,然后單擊下一步。

          項目文件夾配置

          (4)更改或接受默認的Web模塊文件夾名稱,然后單擊下一步。

          設置Web模塊的文件夾名稱

          (5)配置部署設置,指定報表引擎的日志記錄級別,然后單擊完成。

          指定報表引擎的日志記錄級別

          報表項目結構

          1.2 添加報表Web Runtime Facet到現有的Web項目中

          您可以安裝報表Web Runtime facet到任何現有的MyEclipse Web項目中。

          (1)右鍵單擊該項目,并選擇MyEclipse>Project Facets>Install MyEclipse Report Web Runtime Facet。

          添加report web runtime facet

          (2)完成向導,然后單擊Finish來更新項目。

          當向導關閉時,系統會提示您打開MyEclipse Report Design視角,此時選擇Yes。否則,您打開視角只能通過選擇Window>Open Perspective>Other,然后選擇MyEclipse Report Design才能打開。

          2. 創建報表

          (1)選擇reportdemo項目,并選擇File>New>Report。(當使用MyEclipse Report Design perspective時會出現報表工具欄選項)

          (2)在文件名稱字段中輸入demo_report.rptdesign。報表的擴展名應該被命名為.rptdesign。

          (3)請選中生成報表訪問的網頁選項,然后單擊下一步。

          選擇項目報表

          (4)從模板列表中選擇空白報表,然后單擊下一步。

          選擇一個報表模板

          下一個頁面,您可以創建一個示例JSP網頁來演示如何使用新的報表進行工作。示例的樣本JSP網頁可以適當配置一個鏈接到您的報表中,或者直接將其嵌入報表中。

          注意:如果您不在此時選擇生成一個示例報表訪問頁面,以后可以隨時通過右鍵單擊該報表,并選擇MyEclipse>Generate Sample Report Access WebPage。

          (5)使用默認的文件夾位置,并輸入demo_report.jsp作為JSP文件名。

          (6)選擇嵌入式報表查看器[JSP Tag]選項,然后單擊Finish。

          報表訪問的網頁選項

          (7)為檢索報表數據創建一個JDBC數據源,這個示例使用MyEclipse Derby數據庫中的表。

          3. 創建一個數據集

          數據組是一個從數據源檢索數據的集合。此數據將會顯示在一個報表中,本示例中使用的是SQL數據源。

          (1)在數據資源管理器中,右鍵單擊數據集,并選擇New Data Set。

          創建一個新的數據集

          (2)選擇在上一節中創建的數據源。

          (3)接受默認的MyEclipse SQL Select Query數據集類型。

          (4)在數據集名稱字段中輸入Customers,然后單擊下一步。

          選擇數據源

          (5)輸入以下SQL查詢,然后單擊Finish來執行SQL查詢和創建數據集。

          select CUSTOMERNAME, CONTACTFIRSTNAME, CONTACTLASTNAME, PHONE

          from CLASSICCARS.CUSTOMER

          數據集查詢編輯器

          對該數據集進行SQL查詢檢索數據。當您輸入一個SQL查詢時,查詢編輯器提供內容輔助的模式和表名。您也可以在樹形視圖中雙擊一個表或列,并在編輯最后的地方插入查詢該元素的限定名稱。

          如果創建數據集沒有問題,那么打開編輯數據集窗口,讓您進一步自定義數據集。選擇Preview Results來顯示SQL查詢的數據結果。

          數據集編輯器

          4. 制定報表

          下一個步驟就是將用戶界面元素添加到報表中,用于從Customers數據集中顯示數據。您可以通過右鍵單擊報表頁面來將報表元素插入到Report Designer中,然后從插入菜單中選擇一個項目。或者在Palette視圖中使用palette。Report Designer底部的標簽允許您切換視圖。

          Report Designer

          首先報表使用palette來添加表格元素。然后,從報表的數據表的列集合元素中綁定列。對于理解表功能是很重要的:

          • 表遍歷所有數據行的數據集。
          • 它使您能夠在一個行和列的格式中很容易地布局數據。

          (1)打開Palette來查看報表元素。

          Palette視圖

          (2)從palette中拖出一個表元素,并將其放在編輯器的報表中。

          (3)指定3列、1行,然后單擊下一步。

          創建新表

          (4)從數據集的下拉列表中選擇Customers,點擊全選,然后單擊Finish。表的3列、1行會出現在編輯器中。

          綁定數據集

          (5)在數據資源管理器中,展開Customers數據集,查看您在查詢中指定的列。

          (6)從數據資源瀏覽器中拖動CUSTOMERNAME列,并將其放置在詳細行的第一個單元格來綁定表格列的數據集元素。

          表格中的詳細行定義了數據集的列和它們表格中每一個數據行的顯示順序。在已完成的報表中,詳細列的每一行數據都會在數據集中被重復。

          拖動一個數據集列并放到表格單元格中

          當CUSTOMERNAME列表從數據集被拖放到詳細行時,在布局編輯器中加入[CUSTOMERNAME]數據綁定元素。此外標題行在新的[CUSTOMERNAME]數據元素上面,布局編輯器添加列標題標簽,例如CUSTOMERNAME。

          在表中的數據和標簽要素

          (7)拖放PHONE列在詳細行的第二個單元格中。

          (8)拖放CONTACTFIRSTNAME列在詳細行的第三個單元格中。

          (9)拖放CONTACTLASTNAME列在詳細行的第三個單元格中,下面是CONTACTFIRSTNAME。

          該報表的布局應該如下所示。

          將Customer聯系信息添加到表中

          (10)為了確認該報表的數據和表格布局是正確的,在Report Designer底部單擊預覽選項。

          預覽報表數據

          本站文章除注明轉載外,均為本站原創或翻譯


          主站蜘蛛池模板: 精品人妻码一区二区三区| 亚洲一区在线视频| 91成人爽a毛片一区二区| 亚洲国产成人久久一区二区三区 | 中文字幕av日韩精品一区二区| 国产一国产一区秋霞在线观看| 国产午夜福利精品一区二区三区 | 人妻无码视频一区二区三区| chinese国产一区二区| 日本一区二区三区爆乳| 奇米精品一区二区三区在| 成人精品一区久久久久| 偷拍激情视频一区二区三区| 精品国产福利第一区二区三区| 无码人妻久久一区二区三区蜜桃 | 黄桃AV无码免费一区二区三区| 亚洲AV无码一区二区三区牲色| 久久精品国产一区| 日本人真淫视频一区二区三区| 无码乱码av天堂一区二区| 人妻体内射精一区二区三四| 国产免费一区二区三区免费视频 | 在线精品亚洲一区二区三区| 国产伦精品一区三区视频| 日韩av片无码一区二区不卡电影 | 丰满岳乱妇一区二区三区| 亚洲AV无码一区二区三区电影| 人妻体内射精一区二区三四| 国产成人精品视频一区二区不卡| 国模丽丽啪啪一区二区| 久久国产三级无码一区二区| 一区二区精品视频| 一区二区在线播放视频| 杨幂AV污网站在线一区二区| 福利一区在线视频| 天码av无码一区二区三区四区 | 亚洲一区二区三区高清不卡 | 无码少妇一区二区三区芒果| 日本国产一区二区三区在线观看 | 久久一区二区精品| 久久精品视频一区|