/images/avatar.jpg

我的个人博客

剪绳子

算术几何均值不等式: $$ \frac{n_1+n_2+…+n_a}{a}\geq a\sqrt{n_1n_2…n_a} $$ 当且仅当$n_1=n_2=…=n_a$时等号成立,$\sqrt{n_1n_2…n_a}$取最大值。 根据上述不等式可以得知,当每段绳子的相等时,乘积最大。设绳子的总长度为n,每段绳子的长度为x,共有a段绳子,即$ax=n$,则最大的乘积为$x^a$,即 $$ x^a=x^{\frac{n}{x}}=(x^{\frac{1}{x}})^{n} $$ 设$y=x^\frac{1}{x}$,问题转换为求$y$的最大值,对$y$进行分析 $$ \begin{align} y&=x^\frac{1}{x}\ \ln y&=\frac{1}{x} \ln x \end{align} $$ 两端求导 $$ \begin{align} \frac{1}{y}\dot{y}&=\frac{-1}{x^2} \ln x+\frac{1}{x^2} \end{align} $$ 整理得 $$ \begin{align} \dot{y}&=y(\frac{-1}{x^2} \ln x+\frac{1}{x^2})\ \dot{y}&=x^\frac{1}{x}(\frac{1- \ln x}{x^2}) \end{align} $$ 令$\dot{y}=0$得$x=e\approx2.7$,又有当$x>e$时,$\dot{y}$小于0,当$x<e$时,$\dot{y}$大于0,所以$x=e$为最大值点。但是绳子的长度$x$必须为整数,比较 $$ y(3)=3^{\frac{1}{3}}\approx1.44 y(3)=2^{\frac{1}{2}}\approx1.41 $$ 所以当$x=3$时,可以取得乘积得最大值。 切分规则: 当将绳子尽可能多以长度为3进行切分时,乘积最大,当存在余数得时候,存在3种情况 余数为0,最大乘积为$3^a$ 余数为1,因为$2\times 2 >1\times 3$,所以最大乘积为$3^{a-1}\times 4$ 当余数为2时,最大乘积为$3^a*2$

JDBC核心技术-宋红康

JDBC核心技术 讲师:宋红康 微博:尚硅谷-宋红康 第1章:JDBC概述 1.1 数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。 持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。 1.2 Java中的数据存储技术 在Java中,数据库存取技术可分为如下几类: JDBC直接访问数据库 JDO (Java Data Object )技术 第三方O/R工具,如Hibernate, Mybatis 等 JDBC是java访问数据库的基石,JDO、Hibernate、MyBatis等只是更好的封装了JDBC。 1.3 JDBC介绍 JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。 JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。 JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。 如果没有JDBC,那么Java程序访问数据库时是这样的: 有了JDBC,Java程序访问数据库时是这样的: 总结如下: 1.4 JDBC体系结构 JDBC接口(API)包括两个层次: 面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。 JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。

MyBatis

参考 参考 中文文档 基本概念 业务层—处理业务需求 持久层—和数据库交互, 持久层技术解决方案 JDBC技术(最底层):Connection、PreparedStatement、ResultSet Spring的JdbcTemplate:Spring中对jdbc的简单封装 Apache的DBUtils:和Spring的JdbcTemplate类似 以上都不是框架,jdbc是规范,剩下两个是工具包 封装不够细致,需要关注加载驱动、创建连接、创建Statement等繁杂过程。 功能简单,sql语句编写在java代码里,硬编码高耦合(sql变化时需要修改源码) 框架:整体解决方案 Hibernate:全自动全映射ORM框架,旨在消除sql。但是存在开发人员无法自主优化sql语句的缺点。 mybatis是优秀的基于java持久层的框架(半自动),它内部封装了jdbc,sql与java编码分离(sql单独提取到配置文件中,由开发者控制),开发者只需要关注sql语句本身(剩下的预编译、设置参数、执行sql、封装结果由框架完成)。它使用了ORM的思想实现了结果集的封装。 MyBatis实现总结 全局配置文件MyBatis.xml 包含数据源、事务管理器、运行环境的信息 sql映射文件EmployeeMapper.xml –>关键文件,mybatis从该文件抽取出sql 配置每个sql,以及sql的封装规则(查出相应记录后如何封装) 将sql映射文件注册在全局配置文件中 写测试代码(EmployeeTest.java) 关键: 根据配置文件获得SqlSessionFactory 使用SqlSessionFactory获取到SqlSession对象,使用该SqlSession对象中的方法进行增删查改 一个SqlSession就是和数据库的一次会话,使用完要关闭 使用sql的唯一标识(如selectOne方法的第一个参数)来告诉mybatis执行哪个sql SqlSession对象中的方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 // // Source code recreated from a .

Nginx基本原理

参考 参考 (engine x)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 Nginx不仅能做反向代理,实现负载均衡;还能可以作正向代理来进行上网等功能。 反向代理 客户端不需要任何配置就能访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外就一个服务器,暴露的是反向代理服务器地址,隐藏了真实服务器IP地址。代理对象是服务端,不知道客户端是谁。 负载均衡 客户端发送多个请求到服务器,服务器处理请求,有些可能要访问数据库,服务器处理完毕后再将结果返回客户端。 这种架构模式单一,适合并发请求少的情况,但并发量大的时候如何解决? 首先可能想到升级服务器配置,但硬件的性能提升不能满足日益增长的需求,此时想到服务器集群,增加服务器数量,然后将原先请求单个服务器的情况改为将请求分发到多个服务器上,将负载分发到多个服务器上,也就是我们讲的负载均衡。 动静分离 为了加快网站的解析速度,可以把动态页面和静态页面交由不同的服务器来解析,减少服务器压力,加快解析速度。 原理 master和worker master接收信号后将任务分配给worker进行执行,worker可有多个。 worker如何工作 客户端发送一个请求到master后,worker获取任务的机制不是直接分配也不是轮询,而是一种争抢的机制,“抢”到任务后再执行任务,即选择目标服务器tomcat等,然后返回结果。

Toncat

Toncat运行原理分析 Tomcat 是一个免费的、开源的、轻量级的 Web 应用服务器。 Web项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(main方法),,意味着Web项目中的方法不会自动运行起来。 Web项目部署进Tomcat的webapp中的目的是很明确的,那就是希望Tomcat去调用 写好的方法去为客户端返回需要的资源和数据。 对于Tomcat而言,它并不知道我们会有什么样的方法,这些都只是在项目被部署进webapp下后才确定的,由此分析,必然用到了Java的反射来实现类的动态加载、实例化、获取方法、调用方法。但是我们部署到Tomcat的中的Web项目必须是按照规定好的接口来进行编写,以便进行调用 Tomcat如何确定调用什么方法呢。这取却于客户端的请求,http://127.0.0.1:8080/JayKing.Tomcat.Study/index.java?show这样的一个请求,通过http协议,在浏览器发往本机的8080端口,携带的参数show方法,包含此方法的路径为JayKing.Tomcat.Study,文件名为:index.java。 HTTP工作原理 浏览器发送给服务端的是一个HTTP格式的请求,HTTP服务器接收到这个请求后,需要调用服务端程序来处理,所谓的服务端程序就是你写的Java类(业务类),一般来说不同的请求需要由不同的Java类来处理。 图1表示HTTP服务器直接调用具体业务类,他们是紧耦合的 图2中Http服务器不直接调用业务类,而是将请求交给容器进行处理,容器通过Servlet接口调用业务类。 功能组件结构 Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。 连接器(Connector) 核心功能 一、监听网络端口,接收和响应网络请求。 二、网络字节流处理。将收到的网络字节流转换成 Tomcat Request 再转成标准的 ServletRequest 给容器,同时将容器传来的 ServletResponse 转成 Tomcat Response 再转成网络字节流。 连接器模块设计 为满足连接器的两个核心功能,我们需要 通讯端点:监听端口; 处理器来:处理网络字节流; 适配器:将处理后的结果转成容器需要的结构。 对应的源码包路径 org.apache.coyote 容器(Container) 容器结构分析 每个 Service 会包含一个容器。容器由一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 Web 应用。每个 Web 应用会有多个 Servlet 包装器。Engine、Host、Context 和 Wrapper,四个容器之间属于父子关系。

框架常见面试问题

Spring 、SpringMVC Spring Bean 的生命周期? Spring有几种方式定义Bean? Spring两个重要的特性是什么(AOP, IOC), 原理? IOC和DI的关系 依赖注入的方式 Spring中, 你用过@Controller, @Service, @Component注解吗? 他们的作用是什么? (作用一样) 为什么要单独弄出来这么多个作用一样的? @Autowired和@Inject注解都是用来干嘛的, 有什么区别? @RequestBody的原理 springmvc的工作流程 MVC设计模式 SpringMVC 如何将URL映射到指定的方法上 SpringMVC的注解 @HandleMapping接收的是什么 MyBatis MyBatis中#和$的区别? MyBatis你写的XML怎么绑定对应的接口?namespace.id