当我在回顾Spring mvc 二的时候,总觉的有那么点不好,到底是那里呢?到底是那里呢?我一直反问自己。哦~~现在总算明白了,就是Bean的请求管理,如果我们一直都是用
<bean name="/test.htm" class="com.lap.taobaouse.controller.SampleController" />这样管理请求的bean,是不是很不合理或者说没有实现各自的责任?对头了,我觉得(个人感觉,大家不要把他当作是理所当然而拿去跟别人吵架,呵呵)请求的url应该在统一管理,不应该零散在spring配置文件的各个地方,然后我们的普通bean应该这样简单明了的写:
<!-- 普通的bean实体 --> <bean name="sampleController" class="com.lap.taobaouse.controller.SampleController" />
那么,我们接下来就去了解下spring为我们提供的 SimpleUrlHandlerMapping,大概配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans default-autowire="byName"> <!-- 普通的bean实体 --> <bean name="sampleController" class="com.lap.taobaouse.controller.SampleController" /> <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/test.htm">sampleController</prop> </props> </property> </bean> <!-- 管理视图对象 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="cache" value="true" /> <property name="prefix" value="/static/template/" /> <property name="suffix" value=".jsp" /> <property name="contentType" value="text/html;charset=utf-8" /> </bean> </beans>
Ok,到现在位置,我们都已经的把请求,视图归类管理了。
好了,这一次我们的记录内容比较简短,但是也是非常有用的,这个 SimpleUrlHandlerMapping不但可以统一管理请求资源,后面我们还可以对这些请求进行权限管理
呵呵,这次就暂时到这里,如果有不明白的,可以联系我大家一次探讨学习哦,如果您转载本文,记得保留出处哦
说明:专栏中的内容是《TCP/IP详解》这本书,博主分享在此。
第1章 概 述
1.1 引言
很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但 TCP/IP协议 族允许它们互相进行通信。这一点很让人感到吃惊,因为它的作用已远远超出了起初的设想。 TCP/IP起源于 60年代末美国政府资助的一个分组交换网络研究项目,到 90年代已发展成为计 算机之间最常应用的组网形式。它是一个真正的开放系统,因为协议族的定义及其多种实现 可以不用花钱或花很少的钱就可以公开地得到。它成为被称作“全球互联网”或“因特网 (Internet)”的基础,该广域网( WAN)已包含超过 100万台遍布世界各地的计算机。
本章主要对 TCP/IP协议族进行概述,其目的是为本书其余章节提供充分的背景知识。如 果读者要从历史的角度了解有关 TCP/IP的早期发展情况,请参考文献 [Lynch 1993]。
1.2 分层
网络协议通常分不同层次进行开发,每一层分别 负责不同的通信功能。一个协议族,比如 TCP/IP,是 一组不同层次上的多个协议的组合。 TCP/IP通常被认 为是一个四层协议系统,如图 1-1所示。
应用层 运输层 网络层
Telnet、FTP和e-mail等 TCP和UDP IP、ICMP和IGMP
每一层负责不同的功能:
1) 链路层,有时也称作数据链路层或网络接口层通常包括操作系统中的设备驱动程序和计算机
链路层 设备驱动程序及接口卡
图1-1 TCP/IP协议族的四个层次
中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
2) 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在 TCP/IP协议族中,网络层协议包括 IP协议(网际协议),ICMP协议( Internet互联网控 制报文协议),以及 IGMP协议( Internet组管理协议)。
3) 运输层主要为两台主机上的应用程序提供端到端的通信。在 TCP/IP协议族中,有两个 互不相同的传输协议: TCP(传输控制协议)和 UDP(用户数据报协议)。 TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分 成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。 而另一方面, UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组 从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。 这两种运输层协议分别在不同的应用程序中有不同的用途,这一点将在后面看到。
4) 应用层负责处理特定的应用程序细节。几乎各种不同的 TCP/IP实现都会提供下面这些 通用的应用程序:
• Telnet 远程登录。
• FTP 文件传输协议。
• SMTP 简单邮件传送协议。
• SNMP简单网络管理协议。 另外还有许多其他应用,在后面章节中将介绍其中的一部分。
假设在一个局域网( LAN)如以太网中有两台主机,二者都运行 FTP协议,图 1-2列出了 该过程所涉及到的所有协议。
应用层
FTP
客户
FTP协议 FTP
服务器
用户进程
处理应用 程序细节
运输层
TCP协议
内核 处理通信细节
网络层
IP协议
链路层
以太网驱 动程序
以太网协议
以太网
以太网驱 动程序
图1-2 局域网上运行FTP的两台主机
这里,我们列举了一个 FTP客户程序和另一个 FTP服务器程序。大多数的网络应用程序都 被设计成客户—服务器模式。服务器为客户提供某种服务,在本例中就是访问服务器所在主 机上的文件。在远程登录应用程序 Telnet中,为客户提供的服务是登录到服务器主机上。
在同一层上,双方都有对应的一个或多个协议进行通信。例如,某个协议允许 TCP层进 行通信,而另一个协议则允许两个 IP层进行通信。
在图 1-2的右边,我们注意到应用程序通常是一个用户进程,而下三层则一般在(操作系 统)内核中执行。尽管这不是必需的,但通常都是这样处理的,例如 UNIX操作系统。
在图 1-2中,顶层与下三层之间还有另一个关键的不同之处。应用层关心的是应用程序的 细节,而不是数据在网络中的传输活动。下三层对应用程序一无所知,但它们要处理所有的通信细节。
在图 1-2中列举了四种不同层次上的协议。 FTP是一种应用层协议, TCP是一种运输层协 议, IP是一种网络层协议,而以太网协议则应用于链路层上。 TCP/IP 协议族是一组不同的协 议组合在一起构成的协议族。尽管通常称该协议族为 TCP/IP,但 TCP和IP 只是其中的两种协 议而已(该协议族的另一个名字是 Internet协议族 (Internet Protocol Suite))。
网络接口层和应用层的目的是很显然的—前者处理有关通信媒介的细节(以太网、令牌 环网等),而后者处理某个特定的用户应用程序( FTP、Telnet等)。但是,从表面上看,网络层和运输层之间的区别不那么明显。为什么要把它们划分成两个不同的层次呢?为了理解这一点,我们必须把视野从单个网络扩展到一组网络。
在80年代,网络不断增长的原因之一是大家都意识到只有一台孤立的计算机构成的“孤 岛”没有太大意义,于是就把这些孤立的系统组在一起形成网络。随着这样的发展,到了 90 年代,我们又逐渐认识到这种由单个网络构成的新的更大的“岛屿”同样没有太大的意义。于是,人们又把多个网络连在一起形成一个网络的网络,或称作互连网 (internet)。一个互连 网就是一组通过相同协议族互连在一起的网络。
构造互连网最简单的方法是把两个或多个网络通过路由器进行连接。它是一种特殊的用于网络互连的硬件盒。路由器的好处是为不同类型的物理网络提供连接:以太网、令牌环网、 点对点的链接和 FDDI(光纤分布式数据接口)等等。
这些盒子也称作 IP路由器(IP Router),但我们这里使用路由器 (Router)这个术语。 从历史上说,这些盒子称作网关( gateway),在很多 TCP/IP文献中都使用这个术语。 现在网关这个术语只用来表示应用层网关:一个连接两种不同协议族的进程(例如, TCP/IP和IBM的SNA),它为某个特定的应用程序服务(常常是电子邮件或文件传输)。
图1-3是一个包含两个网络的互连网:一个以太网和一个令牌环网,通过一个路由器互相 连接。尽管这里是两台主机通过路由器进行通信,实际上以太网中的任何主机都可以与令牌环网中的任何主机进行通信。
在图 1 - 3 中,我们可以划分出端系统( End system )(两边的两台主机)和中间系统
(Intermediatesystem)(中间的路由器)。应用层和运输层使用端到端( End-to-end)协议。在 图中,只有端系统需要这两层协议。但是,网络层提供的却
目前为止,已经介绍了选择索引、维护索引。如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索引供查询之用,因为SQLServer优化器是基于开销的优化。当在where和on上的列上的数据需要显示在结果集的时候,如果有实时的统计信息,优化器会选择最好的执行方式,因为优化器会从统计信息中获得这些数据的明细情况。
在创建索引的时候,SQLServer就会在索引列上创建统计信息。简单来说,统计信息就是索引或者列上能够描述数据分布的数据。
查询选择性:
公式:列上不重复数据的总数/列上的数据总数
选择性越高,索引性能越好,当上述公式的值为1时,可以用于做为主键或者唯一键。
创建和更新统计信息:
统计信息有助于SQLServer优化引擎选择合适的索引及相关操作用于执行SELECT语句。有两个方式创建和更新统计信息:
1、 手动创建和更新统计信息
2、 自动创建和更新统计信息
准备工作:
在开始之前,先来看看如何查找数据库的当前统计信息设置:
SELECT CASE WHEN DATABASEPROPERTYEX('master', 'IsAutoCreateStatistics') = 1 THEN 'Yes' ELSE 'No' END AS 'IsAutoCreateStatistics?' , CASE WHEN DATABASEPROPERTYEX('Master', 'IsAutoUpdateStatistics') = 1 THEN 'Yes' ELSE 'No' END AS 'IsAutoUpdateStatistics?' , CASE WHEN DATABASEPROPERTYEX('Master', 'Is_Auto_Update_stats_async_on') = 1 THEN 'Yes' ELSE 'No' END AS 'IsAutoUpdateStatsaAyncOn?' GO
下面的语句用于显示where子句中的数据库或者表的统计信息情况:
SELECT object_id , OBJECT_NAME(object_id) AS TableName , name AS StatisticsName , auto_created FROM sys.stats --where object_id=OBJECT_ID('Sales.SalesOrderHeader') ORDER BY object_id DESC GO
还可以使用以下方式查看:
sp_helpstats 'Sales.SalesOrderHeader'
步骤:
1、 现在开始来看看创建和更新统计信息的不同方式,在数据库级别,有一个选项,默认为ON,这个选项是:Auto_Create_Statistics:
ALTER DATABASE AdventureWorks SET AUTO_CREATE_STATISTICS ON
2、 启用同步创建列上统计信息的选项,Auto_Create_Statistics,当执行一个查询一个精确数据量的数据时,优化引擎会在这个列上创建一个柱状图表。由SQLServer创建的统计信息以_WA开头,可以看看这些列表:
SELECT st.name AS StatName , COL_NAME(stc.object_id, stc.column_id) AS ColumnName , OBJECT_NAME(st.object_id) AS TableName FROM sys.stats AS st INNER JOIN sys.stats_columns AS stc ON st.object_id = stc.object_id AND st.stats_id = stc.stats_id WHERE st.name LIKE '_WA%'
3、 上面的统计信息不会因为Auto_Create_Statistics选项设为ON而结束。这些是强制你的统计信息更新以保证性能优秀。这个只是定义你的统计信息是否同步更新。默认情况下这个选项是为ON的。但是有时候不一定符合你的要求,此时可以使用手动更新计划:
ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS ON
4、 Auto_Update_Statistics选项会在创建索引时、通过Auto_Create_Statistics或者用户使用CREATE STATISTICS命令手动创建统计信息时自动更新统计信息,下面命令使用异步方式更新统计信息:
ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS_ASYNC ON
5、 此时来看看执行上面语句后的数据库统计信息配置情况:
SELECT is_auto_update_stats_async_on , is_auto_create_stats_on , is_auto_update_stats_on FROM sys.databases WHERE name = 'AdventureWorks'
6、 上面的方式均为自动创建和更新统计信息,现在来看看如何手动实现:
--创建统计信息在Sales.SalesOrderHeader表的DueDate列上 CREATE STATISTICS st_DueDate_SalesOrderHeader ON Sales.SalesOrderHeader(DueDate) GO --更新Sales.SalesOrderHeader表的全部统计信息 UPDATE STATISTICS Sales.SalesOrderHeader GO --更新Sales.SalesOrderHeader表的st_DueDate_SalesOrderHeader统计信息 UPDATE STATISTICS Sales.SalesOrderHeader st_DueDate_SalesOrderHeader GO --更新数据库中所有可用的统计信息 EXEC sys.sp_updatestats GO --手动删除统计信息 DROP STATISTICS Sales.SalesOrderHeader.st_DueDate_SalesOrderHeader GO
当索引创建时,优化器会创建统计信息到索引列所在的表或者视图上,除此之外,如果对Auto_Create_Statistics选项设置了ON,优化器会创建一个单列统计信息,及时它没有出现在查询的所需列上。如果你觉得一些查询性能有问题,检查所有谓词,如果这些列缺失了统计信息,你可以手动增加,有时候,DTA(数据库优化顾问)也会建议你创建统计信息。
一般情况下,在查询编译之前,如果开启了同步更新统计信息,SQLServer如果发现统计信息过时,会引发更新统计信息的操作,然后你的查询就会使用上实时的统计信息。而这个操作会阻塞查询,知道更新结束,但是不会保留这些查询,它会更新统计信息以便下次运行查询的时候可以使用上较新的统计信息。
扩充知识:
默认情况下,只有sysadmin/db_owner/对象的创建者这三种角色的成员才有权限创建和更新统计信息。