详解Tomcat连接池与连接数
引言在使用Tomcat时,经常会遇到连接数、线程数之类的配置,然后自己就去谷歌、百度,没有真正理解Tomcat配置的作用及当前业务环境、服务器配置等情况下Tomcat最优配置。
12345<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" maxThreads="1000" minSpareThreads="100" maxSpareThreads="200" acceptCount="900" enableLookups="false" compression="on" compressionMinSize="1024" compressableMimeType="text/ht ...
Tomcat入门
引言Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器。说是经常用到,也只是熟悉,还没没有真正达到了解其中的原理和其中配置的意义,最近也找了一些书籍来看,先入门。
Tomcat简介Tomcat的下载包解压之后的目录
Tomcat根目录在Tomcat中叫<CATALINA_HOME>
<CATALINA_HOME>/bin:存放各种平台下启动和关闭Tomcat的脚本文件。其中有个是catalina.bat,打开这个windows配置文件,在非注释行加入JDK路径,例如 : SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_141,其中对JDK的优化也在catalina.bat中配置,保存后就配置好Tomcat环境了。 startup.bat是windows下启动Tomcat的脚本文件,shutdown.bat是关闭Tomcat的脚本文件。
<CATALINA_HOME>/conf:存放不同的配置文件(如:server.xml和web.xml)
server.xml文 ...
JVM类加载机制
引言之前的博客说了Java虚拟机的运行时数据区域、GC算法、垃圾回收器等知识。距离深入了解还有一段距离,包括虚拟机的类加载机制、性能调优、线程并发等等还都没有涉及到,一直在看周志明的《深入理解Java虚拟机》,越深入去读发现这本书写的真的是经典,解决了自己很多的疑惑。
JVM的类加载机制。虚拟机把描述类的数据从class文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
类加载过程类被加载到虚拟机内存中开始,到卸载出内存为止。它的生命周期分7个阶段,加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)。其中验证、准备、解析三个部分统称为连接(Linking)。
## 加载
通过一个类的全限定名来获取定义此类的二进制字节流。
将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
在Java堆中生成一个代表这个类的java.lang.Class对 ...
UML工具-PowerDesigner设计数据库
引言在数据库的开发设计中,PowerDesiger(PD)是一个较为常用的UML工具。PowerDesiger为各类数据模型提供了直观的符号表示,不仅使设计人员能更方便、更快捷地使非计算机专业技术人员展示数据库设计和应用系统设计,使系统设计人员与使用系统的业务人员更易于相互理解和交流,同时也使项目组内的交流更为直观、准确,更便于协调工作,从而加速系统的设计和开发过程。PowerDesiger设计完成后的数据库可直接生成SQL语句。
使用ODBC连接MySQL准备工作PowerDesigner本身是32位的程序(特别重要),故不管在32位或者64位操作系统中,都需要安装32位的MySQL Connector /ODBC。
MySQL Connector /ODBC下载地址:https://dev.mysql.com/downloads/connector/odbc/
连接数据库
安装完ODBC之后,打开PowerDesigner,新建一个Model,File—>New Model
选择工具栏中的Database—> Update Model from Databa ...
Java String intern方法
引言String类我们经常使用,但是它的intern()方法之前还真的不太了解,通过谷歌百度一番之后终于搞明白了。
intern()方法设计的初衷,就是重用String对象,以节省内存消耗。
案例123String str1 = new String("rainbow") + new String("horse");System.out.println(str1.intern() == str1);System.out.println(str1 == "rainbowhorse");
在JDK1.7下输出结果为:
12truetrue
再将上面的例子加上一行代码:
1234String str2 = "rainbowhorse"; //新加的一行代码,其余不变 String str1 = new String("rainbow") + new String("horse");System.out.println(str1.intern() == str1); ...
JVM入门
引言JVM(Java Virtual Machine)Java 虚拟机是整个 Java 平台的基石,是 Java 系统实现硬件无关与操作系统无关的关键部分,是保障用户机器免于恶意代码损害的屏障。Java开发人员不需要了解JVM是如何工作的,但是,了解 JVM 有助于我们更好的开发java 程序。近些天一直在看周志明的《深入理解Java虚拟机》这本书,这本书写的堪称经典,对于JVM的学习非常有帮助。
运行时数据区域JVM将内存主要划分为:方法区、虚拟机栈、本地方法栈、堆、程序计数器。JVM运行时数据区如下:
程序计数器(线程私有)程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
由于Java虚拟机的虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的 ...
Java生成PDF
引言在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同、证书等。方便用户查看,下载,打印。目前常用的解决方案是,把相关数据信息,生成对应的PDF文件返回给用户。之前有写过一篇博客关于JAVA实现HTML转PDF,不同场景下的业务不同,现在需要使用PDF生成证书,这篇博客主要介绍iText的使用。
本博客项目地址:https://github.com/mx-go/java_pdf_demo
iText介绍iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个JAVA类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、HTML文件转化为PDF文件。
iText 官网:http://itextpdf.com/
iText 开发文档: http://developers.itextpdf.com/developers-home
iText目前有两套版本iText5和iText7。iText5应该是网上用的比较多的一个版本。iText5因为是很多开发者参与贡献代码,因此在一些规范和设计上存在不合理 ...
分布式下ID生成算法 SnowFlake
引言在做系统开发时,系统唯一ID是我们在设计一个系统的时候经常遇到的问题,也常常为这个问题纠结。生成ID的方法有很多,适应不同的场景、需求及性能要求。所以有些比较复杂的系统会有多个ID生成策略。在这里总结一下常用到的ID生成策略。
数据库自增长序列或字段最常见的方式,利用数据库,全表中唯一。如MySQL的AUTO_INCREMENT。
优点
简单,代码方便,性能可以接受。
数字ID天然排序,对分页或者需要排序的结果很有帮助。
缺点
不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理。
在单个数据库或读写分离或一主多从的情况下,只有一个主库可以生成。有单点故障的风险。
在性能达不到要求的情况下,比较难于扩展。
如果遇见多个系统需要合并或者涉及到数据迁移会相当痛苦。
分表分库的时候会有麻烦。
优化方案针对主库单点,如果有多个Master库,则每个Master库设置的起始数字不一样,步长一样,可以是Master的个数。比如:Master1 生成的是 1, 4, 7, 10,Master2生成的是2, 5, 8, 11,Master3生成的是3, 6, 9, 12。 ...