志当存高远,功到自然成!

少年强则中国强,少年进步则中国进步!

BlogJava 首页 新随笔 联系 聚合 管理
  53 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks

#

根 据网上搜索到的一些例子做的时候碰到了挺多的问题,经过不懈的努力终于完成了这个webservice的例子,实际上axis的文档上也写了一个例子,网 上的例子也大多都是照他上面所写的那样,只是有些讲的不算很详细,所以产生了不少错误,小弟知识浅薄,如有写的不清楚地地方,还请见谅

所需软件
tomcat        :http://tomcat.apache.org/index.html
axis          :http://ws.apache.org/axis/
jdk           :http://java.sun.com/javase/downloads/index.jsp
jaf           :http://java.sun.com/products/javabeans/jaf/downloads/index.html
xmlrpc        :http://ws.apache.org/xmlrpc

XML解析器
Xalan         :http://archive.apache.org/dist/xml/xalan-j/
Xerces        :http://xml.apache.org/dist/xerces-j/

本例讲解axis定制发布

本实例采用
j2sdk1.4.2_05,tomcat5.0.28,axis1.4,jbuilder X / Eclipse3.2

首先将axis解压至相应目录,如d:\下,安装tomcat至c:\tomcat5,安装jdk至c:\ j2sdk1.4.2_05
然后将d:\axis\webapp目录下的axis目录copy至c:\tomcat5\webapps目录下

设置axis的环境变量

AXIS_HOME=d:\axis

AXIS_LIB=%AXIS_HOME%\lib

AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\activation.jar;%AXIS_LIB%\xmlrpc-2.0.jar

 

(xml-apis.jar, xercesImpl.jar属于Xerces或Xalan, activation.jar属于jaf, xmlrpc-2.0.jar属于xmlrpc)

1. 配置完成后启动tomcat,在浏览器中键入http://localhost:8080/axis,将显示如下画面

查看更多精彩图片

2.在C:\Tomcat5\webapps\axis\WEB-INF目录下建立一个src目录,用于存放源程序
接着编写服务端程序server.AxisReturn
package server;
public class AxisReturn {
    public String ReturnMsg(String servicesName) {
      return "Axis Return: "+ servicesName;
    }
}
在 此我们利用了Jbuilder X作为我们java程序的开发工具,利用Jbuilder新建工程中的Project for Existing Code将C:\Tomcat5\webapps\axis\WEB-INF下的程序及目录导入作为Jbuilder的一个工程来操作

查看更多精彩图片
编译AxisReturn程序,Jbuilder将会把编译后的class文件自存放在C:\Tomcat5\webapps\axis\WEB-INF\classes\server目录下

3.编写wsdd文件,此处命名为deploy.wsdd,其内容为

<deployment xmlns=http://xml.apache.org/axis/wsdd/
              xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="AxisReturn" provider="java:RPC">
    <parameter name="className" value="server.AxisReturn"/>
    <parameter name="allowedMethods" value="*"/>
</service>
</deployment>


每个service就代表服务端的一个程序,如有多个可继续添加service,相关参数请查阅axis文档
此处的deployment代表发布服务,如改为undeployment则为撤销服务

4.发布服务
打开windows的命令窗口,转到wsdd文件的存放目录下,此处为C:\Tomcat5\webapps\axis\WEB-INF\src\server
在命令窗口中键入
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd

如果成功将显示<Admin>Done processing</Admin>
如失败,则检查AXISCLASSPATH是否设置正确,tomcat端口是否为默认的8080
在这里有一个问题需注意,不管是在axis目录下还是其他虚拟目录下,如直接执行这条命令,都将在axis的目录下发布service,如果想发布在其他的目录下,如pscsaxis,则应执行
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/pscsaxis/services/AdminService deploy.wsdd

-cp表示在AXISCLASSPATH环境变量中检索org.apache.axis.client.AdminClient方法

5.生成client stub文件
在命令窗口中将目录转至C:\Tomcat5\webapps\axis\WEB-INF\classes
然后执行
java -cp %AXISCLASSPATH% org.apache.axis.wsdl.Java2WSDL -oAxisReturn.wsdl -lhttp://localhost:8080/axis/services/AxisReturn -nAxisReturn server.AxisReturn

将会在C:\Tomcat5\webapps\pscsaxis\WEB-INF\classes下生成AxisReturn.wsdl文件
接着在执行
java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java AxisReturn.wsdl -p client

将会在C:\Tomcat5\webapps\axis\WEB-INF\classes\client目录下生成四个java文件
AxisReturn_PortType.java
AxisReturnService.java
AxisReturnServiceLocator.java
AxisReturnSoapBindingStub.java
将这四个文件剪切至C:\Tomcat5\webapps\pscsaxis\WEB-INF\src\client目录下,并编译

6.编写客户端
利用生成client stub文件编写

package client;
public class ClientAxisReturn {
    public static void main(String args[]) {
      try {
        AxisReturnService service = new client.AxisReturnServiceLocator();
        client.AxisReturn_PortType client = service.getAxisReturn();
        String retValue = client.returnMsg("BaoSteel");
        System.out.println(retValue);
      }
      catch (Exception e) {
        System.err.println("Execution failed. Exception: " + e);
      }
    }
}

编写完后,编译运行即可得到返回结果
如需传入多个参数,需在String retValue = client.returnMsg("BaoSteel");这句中增加参数,如
String retValue = client.returnMsg("BaoSteel","PSCS_IMS");
相应的服务端也要更改,如
package server;
public class AxisReturn {
    public String ReturnMsg(String servicesName,String serviceID) {
      return "Axis Return: "+ servicesName+ serviceID;
    }
}

利用发布服务的wsdl的URL编写
package client;
import org.apache.axis.AxisFault;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.encoding.XMLType;
public class ClientAxisReturnWsdl {
    public static void main(String args[]) throws Exception{
      String endPoint =
        
http://190.2.63.239:8080/pscsaxis/services/AxisReturn?wsdl;
      Service service = new Service();
      Call call = (Call) service.createCall();
      Object result;
      try {
        call.setTargetEndpointAddress(new java.net.URL(endPoint));
        call.setOperationName("ReturnMsg");
        call.addParameter("OP1", XMLType.XSD_STRING, ParameterMode.IN);
        call.setReturnType(XMLType.XSD_STRING);
        result = (Object) call.invoke(new Object[] {"BaoSteel"});
      }
      catch (AxisFault fault) {
        result = "Error is: " + fault.toString();
      }
      System.out.println(result);
    }
}

编写完后,编译运行即可得到返回结果
如许增加参数,则需添加语句
call.addParameter("OP1", XMLType.XSD_STRING, ParameterMode.IN);
将参数名OP1改为其他,如OP2
在result = (Object) call.invoke(new Object[] {" BaoSteel "});这句中增加参数,如
result = (Object) call.invoke(new Object[] {" BaoSteel "," PSCS_IMS "});
相应的服务端也要更改,如
package server;
public class AxisReturn {
    public String ReturnMsg(String servicesName,String serviceID) {
      return "Axis Return: "+ servicesName+ serviceID;
    }
}

★在这里,我们的服务端只有一个方法供我们调用,如果我们需要调用多个服务端的方法,则可在服务端中加入其他方法,如我们在增加一个xxMsg

package server;
public class AxisReturn {
    public String ReturnMsg(String servicesName,String systemID) {
      return "Axis Return: "+ str+servicesName+systemID;
    }
    public String xxMsg(String serviceName,String systemID) {
    return "XX Return: "+ str+serviceName+systemID;
}
}

★修改完后将其编译,并将其注销后重新发布,反之需要重起tomcat,否则服务将不被更新
★利用生成client stub文件编写的客户端程序,还需重新生成client stub文件,并将其编译,在客户端程序中调用其相应得方法即可

SOAPMonitor的配置

发 布了Web服务以后,如何观察请求和响应数据呢?记录运行日志是一种传统且有效的方法,但对于调试程序来讲还不够方便和直观。值得欣慰的是,Axis为我 们提供了在客户端观察SOAP请求和响应流数据的工具SoapMonitor,经过适当配置后,可以实时地观察到Web服务的SOAP请求和响应数据。 SoapMonitor是一个Java Applet程序,通过浏览器下载到客户端运行。下面就介绍SoapMonitor的配置和使用方法。

在C:\Tomcat5\webapps\axis的目录下有一个SOAPMonitorApplet.java的程序,axis默认没有给我们编译,我们需要自己进行编译

打开windows命令窗口,转到C:\Tomcat5\webapps\axis目录下,执行
javac -classpath %AXIS_HOME%\lib\axis.jar SOAPMonitorApplet.java

编译完成后需要发布服务,我们需要建立一个wsdd文件deploy-monitor.wsdd,内容如下

<deployment xmlns=http://xml.apache.org/axis/wsdd/
      xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <handler name="soapmonitor"
        type="java:org.apache.axis.handlers.SOAPMonitorHandler">
      <parameter name="wsdlURL" value="/axis/SOAPMonitorService-impl.wsdl"/>
      <parameter name="namespace" value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
      <parameter name="serviceName" value="SOAPMonitorService"/>
      <parameter name="portName" value="Demo"/>
    </handler>
    <service name="SOAPMonitorService" provider="java:RPC">
      <parameter name="allowedMethods" value="publishMessage"/>
      <parameter name="className" value="org.apache.axis.monitor.SOAPMonitorService"/>
      <parameter name="scope" value="Application"/>
    </service>
</deployment>

需要注意的是红色的那句语句,如果是在我们自己的web应用目录下的话需改成自己的目录。
建立完成后执行命令进行发布
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis/services/AdminService deploy-monitor.wsdd

发布SOAPMonitor服务后,还要对被监测的Web服务进行配置。方法是先注销该Web服务,然后修改该服务对应的WSDD文件,在其中增加请求流和响应流的配置,否则是观测不到SOAP请求和响应流的。以我们上面的程序为例,将deploy.wsdd修改为

 

<deployment xmlns=http://xml.apache.org/axis/wsdd/
              xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="AxisReturn" provider="java:RPC">
      <requestFlow>
        <handler type="soapmonitor"/>
      </requestFlow>
      <responseFlow>
        <handler type="soapmonitor"/>
      </responseFlow>
    <parameter name="className" value="server.AxisReturn"/>
    <parameter name="allowedMethods" value="*"/>
</service>
</deployment>


增加了
     <requestFlow>
        <handler type="soapmonitor"/>
      </requestFlow>
      <responseFlow>
        <handler type="soapmonitor"/>
      </responseFlow>
这两段

然后我们通过点击http://localhost:8080/axis/主页上的SOAPMonitor或直接访问http://localhost:8080/axis/SOAPMonitor,点击start或stop启动或停止监控,然后我们运行客户端程序,SOAPMonitor会监控到请求和响应流,如下图

查看更多精彩图片

在 这里,我们需要注意一个配置问题,如果tomcat下有多个axis应用,设置了多个SOAPmonitor,我们则需要更改SOAPmonitor的端 口(axis默认配置的是5001),否则会产生冲突,运行SOAPmonitor时会无法启动,提示the soap monitor is unable to communcate with the server,解决方法如下:

打开C:\Tomcat5\webapps\axis\WEB-INF目录下的web.xml,找到

<servlet>
      <servlet-name>SOAPMonitorService</servlet-name>
      <display-name>SOAPMonitorService</display-name>
      <servlet-class>
          org.apache.axis.monitor.SOAPMonitorService
      </servlet-class>
      <init-param>
        <param-name>SOAPMonitorPort</param-name>
        <param-value>5001</param-value>
      </init-param>
      <load-on-startup>100</load-on-startup>
</servlet>

这段,将其中的5001改成5002,依此类推

总结:
尽量将发布websrrvice的文件夹和axis分开放置
建立多个axis应用时,应注意一些端口的设置,命令的参数设置以及一些命令执行的路径设置等,否则会产生一些错误,如ClassNotFound,service发布错误等的错误

 

server-config.wsdd

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
     xmlns:handler="http://xml.apache.org/axis/wsdd/providers/handler"
     xmlns="http://xml.apache.org/axis/wsdd/"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     name="defaultClientConfig" xsi:type="deployment">
     <globalConfiguration>
         <parameter name="disablePrettyXML" value="true"/>
         <parameter name="dotNetSoapEncFix" value="true"/>
         <parameter name="enableNamespacePrefixOptimization" value="false"/>
         <requestFlow>
             <handler type="java:org.apache.axis.handlers.JWSHandler">
                 <parameter name="scope" value="session"/>
             </handler>
             <handler type="java:org.apache.axis.handlers.JWSHandler">
                 <parameter name="scope" value="request"/>
                 <parameter name="extension" value=".jwr"/>
             </handler>
         </requestFlow>
     </globalConfiguration>
     <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
     <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
     <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

    <service name="CallcenterWebServices" provider="java:RPC" style="rpc" use="encoded">
         <parameter name="scope" value="Request"/>
         <parameter name="className" value="com.isw2.ebay.callcenter.axis.CallcenterWebServices"/>
         <parameter name="allowedMethods" value="getStatus,getCsrBean,setStatus,createCase,showContactRecord,getWorkload"/>
         
    <beanMapping qname="myNS:CsrBean" xmlns:myNS="urn:CsrBean"
    languageSpecificType="java:com.isw2.ebay.callcenter.axis.CsrBean" />
   <beanMapping qname="myNS:ContactRecordBean" xmlns:myNS="urn:ContactRecordBean"
    languageSpecificType="java:com.isw2.ebay.callcenter.axis.ContactRecordBean" />  
   <beanMapping qname="myNS:DisputeContactRecord" xmlns:myNS="urn:DisputeContactRecord"
    languageSpecificType="java:com.isw2.ebay.callcenter.axis.DisputeContactRecord" />
   <beanMapping qname="myNS:WorkloadNumberBean" xmlns:myNS="urn:WorkloadNumberBean"
    languageSpecificType="java:com.isw2.ebay.callcenter.axis.WorkloadNumberBean" />  
  
     </service>
    
     <service name="AdminService" provider="java:MSG">
         <parameter name="allowedMethods" value="AdminService"/>
         <parameter name="enableRemoteAdmin" value="false"/>
         <parameter name="className" value="org.apache.axis.utils.Admin"/>
         <namespace>http://xml.apache.org/axis/wsdd/</namespace>
     </service>
     <service name="Version" provider="java:RPC">
         <parameter name="allowedMethods" value="getVersion"/>
         <parameter name="className" value="org.apache.axis.Version"/>
     </service>
     <transport name="http">
         <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
         <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
         <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
         <requestFlow>
             <handler type="URLMapper"/>
             <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
         </requestFlow>
     </transport>
     <transport name="local">
         <responseFlow>
             <handler type="LocalResponder"/>
         </responseFlow>
     </transport>
</deployment>
posted @ 2008-11-13 00:33 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(4950) | 评论 (0)编辑 收藏

项目组反应数据库有问题,
检查发现sga还用的默认参数,缓冲区命中率很低。根据系统内存调整后,好像系统正常了。数据库调整就算是结束了
一天后,我再登这个数据库的时候,发现一个提示说线程已经超过限制,不允许再登录。然后我去修改了process到250,增加并发连接数。然后重启了数据库。当天没发生什么事情,第二天,发现250又被撑满了,这个时候,我就开始换衣中间件有问题,登入中间件那边看了下日志,一直报错,提示无法打开新的连接。一般来说,中间件连接数据库能开10个都算可以了。至少websphere是这样,weblogic应该差不多。然后修改了一下,调整了weblogic的连接池,修改最大连接到100.

1、        报错信息

<2008-4-22 上午04时33分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
hread: '1' for queue: 'weblogic.kernel.Default' has been busy for "102" seconds
working on the request "Http Request: /guestAction.jsp", which is more than the
configured time (StuckThreadMaxTime) of "60" seconds.>
<2008-4-22 上午04时33分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
hread: '7' for queue: 'weblogic.kernel.Default' has been busy for "178" seconds
working on the request "Http Request: /guestAction.jsp", which is more than the
configured time (StuckThreadMaxTime) of "60" seconds.>
<2008-4-22 上午04时34分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
hread: '0' for queue: 'weblogic.kernel.Default' has been busy for "111" seconds
working on the request "Http Request: /guestAction.jsp", which is more than the
configured time (StuckThreadMaxTime) of "60" seconds.>
<2008-4-22 上午04时34分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
hread: '1' for queue: 'weblogic.kernel.Default' has been busy for "162" seconds
working on the request "Http Request: /guestAction.jsp", which is more than the
configured time (StuckThreadMaxTime) of "60" seconds.>
<2008-4-22 上午04时35分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
hread: '0' for queue: 'weblogic.kernel.Default' has been busy for "171" seconds
working on the request "Http Request: /guestAction.jsp", which is more than the
configured time (StuckThreadMaxTime) of "60" seconds.>
<2008-4-22 上午04时35分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
hread: '12' for queue: 'weblogic.kernel.Default' has been busy for "111" seconds
working on the request "Http Request: /guestAction.jsp", which is more than the
configured time (StuckThreadMaxTime) of "60" seconds.>
<2008-4-22 上午04时36分18秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
hread: '12' for queue: 'weblogic.kernel.Default' has been busy for "171" seconds
working on the request "Http Request: /guestAction.jsp", which is more than the
configured time (StuckThreadMaxTime) of "60" seconds.>
2、        判断可能存在部分sql语句未优化,造成执行时间过长(request超时)造成挂死

3、        解决
开发模式和产品模式的一些参数的默认值不同,可能会对性能造成影响,下面是对性能有影响的参数列表:
参数        开发模式默认值        产品模式默认值
Execute Queue: Thread Count        15 threads        25 threads
JDBC Connection Pool: MaxCapacity        15 connnections        25 connections
通过启动管理控制台,在域(如:mydomain)> 配置 > 常规选择产品模式。

修改了server-myserver参数中的threadcount参数,按照cpu数量,修改为100
修改jdbc数据库连接池,修改为初始15,最大100。

晚间进行跟踪,系统运行正常,高峰时段,尤其是早晨的高峰时段,系统没有再出现挂死的问题。
早晨点击页面查询发现有时会出现页面无法访问的情况。
跟踪发现weblogic最高时有100多并发,同时注意到内存占用比较高,检查发现,原来内存配置较低。

检查原配置文件:
:bea
if "%PRODUCTION_MODE%" == "true" goto
bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms96m -Xmx256m
set
JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto
continue
:bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms128m
-Xmx256m
goto continue


:sun
if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode
set
JAVA_VM=-client
set MEM_ARGS=-Xms32m -Xmx200m -XX:MaxPermSize=128m
set
JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto
continue
:sun_prod_mode
set JAVA_VM=-server
set MEM_ARGS=-Xms32m
-Xmx200m -XX:MaxPermSize=128m
goto continue

很明显配置为96m,最高256m。修改后的参数:
修改后结果为
:bea
if "%PRODUCTION_MODE%" == "true" goto
bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms256m -Xmx768m
set
JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto
continue
:bea_prod_mode
set JAVA_VM=-jrockit
set MEM_ARGS=-Xms256m
-Xmx768m
goto continue


:sun
if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode
set
JAVA_VM=-client
set MEM_ARGS=-Xms256m -Xmx768m -XX:MaxPermSize=128m
set
JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none
goto
continue
:sun_prod_mode
set JAVA_VM=-server
set MEM_ARGS=-Xms256m
-Xmx768m -XX:MaxPermSize=128m
goto continue

:continue


最低256,最高768.查看跟踪信息比较调整前后性能:

调整前内存


调整后情况:


现在垃圾回收不那么频繁了,整体稳定性应该有好处。再频繁打开一个页面的情况下,页面仍然能正常显示。
posted @ 2008-09-04 13:30 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(3567) | 评论 (0)编辑 收藏

 

前几天用spring+hibernate+struts写了个增/删/改/查的例子。调试期间问题就来了,当查询结果翻页好几次就没N久没有响应了。最后控制报错。网上查了,它说数据库连接(池)问题。

出现错误如下:

[2007-9-30 下午12时03分03秒 CST] [Error] [WebLogicServer] [BEA-000337] [ExecuteThread: '13' for queue: 'weblogic.kernel.Default' has been busy for "901" seconds working on the request "Http Request: /admin/school.do", which is more than the configured time (StuckThreadMaxTime) of "600" seconds.]

<转为[,>转为],才发得出以上面错误。可能是javaeye的bug。 

先说下我配置

1.环境:

spring 2.0.6,hibernate 3.2.3,struts 1.2.9,oracle 10.2,weblogic 8.1.4

jdbc是ojdbc14.jar

2.连接池用DBCP

xml 代码
  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2.     <property name="driverClassName" value="${jdbc.driverClassName}"/>  
  3.     <property name="url" value="${jdbc.url}"/>  
  4.     <property name="username" value="${jdbc.username}"/>  
  5.     <property name="password" value="${jdbc.password}"/>  
  6. bean>  

 3.分页方法(参考springside的),此类继承HibernateDaoSupport

java 代码
  1. public Page listByPage(Class entityClass, int pageNo, int pageSize, List criterions, List orders) {   
  2.     Criteria criteria = createCriteria(entityClass, criterions);   
  3.     CriteriaImpl impl = (CriteriaImpl) criteria;   
  4.   
  5.     // 先把Projection和OrderBy条件取出来,清空两者来执行Count操作   
  6.     Projection projection = impl.getProjection();   
  7.     //获取总记录数   
  8.     int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
  9.   
  10.        
  11.     if(totalCount < 1) {   
  12.         return new Page();   
  13.     }   
  14.        
  15.     //加排序   
  16.     if(orders != null) {   
  17.         for(int i=0; i
  18.             criteria.addOrder((Order) orders.get(i));   
  19.         }   
  20.     }   
  21.     //原来的投影   
  22.     criteria.setProjection(projection);   
  23.     int startIndex = Page.getStartOfPage(pageNo, pageSize);   
  24.     //取得结果   
  25.     List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
  26.        
  27.     return new Page(startIndex, totalCount, pageSize, list);   
  28. }   
  29.   
  30. public Criteria createCriteria(Class entityClass, List criterions) {   
  31.     Criteria criteria = getSession().createCriteria(entityClass);   
  32.     if(criterions != null) {   
  33.         for(int i=0; i
  34.             criteria.add((Criterion) criterions.get(i));   
  35.         }   
  36.     }   
  37.        
  38.     return criteria;   
  39. }  

另外,没有用OpenSessionInViewFilter,struts与spring的整合:DelegatingRequestProcessor、action path与bean name同名。

翻页不过10次,服务器就没响应了,最后出现上面的错误的了。



问题解决,问题的原因是数据库连接耗尽,我用HiberanteDaoSupport的getSession()方法取得Session后没有释放Session。

出问题的代码处:

java 代码
  1. public Criteria createCriteria(Class entityClass, List criterions) {       
  2.     Criteria criteria = getSession().createCriteria(entityClass);       
  3.     if(criterions != null) {       
  4.         for(int i=0; i    
  5.             criteria.add((Criterion) criterions.get(i));       
  6.         }       
  7.     }       
  8.            
  9.     return criteria;       
  10. }  

 

用完Session释放后就没事了,调用HiberanteDaoSupport的releaseSession(session);方法后即可解决。

现在正确的代码:

java 代码
  1. public Page listByPage(Class entityClass, int pageNo, int pageSize, List criterions, List orders) {   
  2.     Session session = getSession();   
  3.     //创建criteria   
  4.     Criteria criteria = session.createCriteria(entityClass);   
  5.     //为criteria添加criterions   
  6.     createCriteria(entityClass, criteria, criterions);   
  7.     CriteriaImpl impl = (CriteriaImpl) criteria;   
  8.   
  9.     // 先把Projection和OrderBy条件取出来,清空两者来执行Count操作   
  10.     Projection projection = impl.getProjection();   
  11.     //获取总记录数   
  12.     int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
  13.   
  14.        
  15.     if(totalCount < 1) {   
  16.         return new Page();   
  17.     }   
  18.        
  19.     //加排序   
  20.     if(orders != null) {   
  21.         for(int i=0; i<orders.size(); i++) {   
  22.             criteria.addOrder((Order) orders.get(i));   
  23.         }   
  24.     }   
  25.     //原来的投影   
  26.     criteria.setProjection(projection);   
  27.     int startIndex = Page.getStartOfPage(pageNo, pageSize);   
  28.     //取得结果   
  29.     List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
  30.     //释放hiberante资源,一定要释放,要不然就数据库连接耗尽.   
  31.     releaseSession(session);   
  32.     return new Page(startIndex, totalCount, pageSize, list);   
  33. }   
  34.   
  35. public Criteria createCriteria(Class entityClass, Criteria criteria, List criterions) {   
  36.     if(criterions != null) {   
  37.         for(int i=0; i<criterions.size(); i++) {   
  38.             criteria.add((Criterion) criterions.get(i));   
  39.         }   
  40.     }   
  41.        
  42.     return criteria;   
  43. }  
posted @ 2008-09-04 13:02 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(1033) | 评论 (0)编辑 收藏

最近想對一個表進行分區,在sybase版轉了半天,沒找著詳細介紹表分區有關的帖子. 終於找著一篇比較詳細的,故貼之:

Sybase ASE表分區的使用

表分區是目前各主流數據庫都提供的常用技術,各大數據庫基於不同的體系結構提供了各具特色的實現,如果能合理使用這種技術,將為系統性能的提升帶來意想不到的效果,本文以Sybase ASE數據庫為例來說明這種技術的使用方法。


在Sybase ASE中,未分區的不帶聚簇索引的表有一個雙向的數據庫頁鏈鏈接。在插入數據行時,將查找並鎖定頁鏈的最後一頁,如果最後一頁空間用盡,Sybase ASE將分配新的一頁,如果對表進行大量頻繁的數據插入,將引起對最後一頁鎖資源的競爭,如果一個事務(Transaction)正在使用最後一頁的排它鎖,那麼其他向同一張表插入數據的事務必須等待,直到該事務結束釋放資源,解除排它鎖。


Sybase ASE從11.5開始提供新的特性表分區。表分區將產生附加的頁鏈,每個頁鏈有自己的最後一頁,這樣插入操作可以獲得多個最後一頁,實現並發操作,從而提高數據庫插入性能。若包含表的段分佈在多個物理設備上,表分區通過降低服務器從高速緩存向磁盤進行數據刷新的I/O衝突而提高數據插入性能。對頻繁地追加數據到表中或進行大塊數據的拷入、拷出操作,採用表分區技術,將能極大地提升系統性能。


劃分表分區的操作步驟如下:


1. 在同一數據庫設備上劃分表分區時,先創建表,再用alter table 的 partition 語句劃分表分區。


create table opt_plnexrcd ( per_date datetime, per_sndstn char(4), ... )


alter table opt_plnexrcd partition 5


2. 在多個數據庫設備上劃分表分區時,先建一個數據庫段在多個數據庫上,然後再將表建在該段上,最後對表分區。


sp_addsegment seg1, oil, oil_data1


sp_extendsement seg1, oil, oil_data2


...


sp_extendsement seg1, oil, oil_data5


create table opt_plnexrcd ( per_date datetime, per_sndstn char(4), ... ) on seg1


或建完表後執行sp_placeobject:


sp_placeobject seg1, opt_plnexrcd


最後對表分區:


alter table opt_plnexrcd partition 5


如果表分為5個分區,表所在的段又分跨5個數據庫設備,那麼每個分區將分別映射到該段所在的5個數據庫設備上。一般劃分表分區的原則是:表分區數等於或大於表所在段分跨的數據庫設備數。但要注意有些表不能分區,它們是系統表、正在使用的表、臨時表和有聚簇索引的表。


Sybase ASE使用保存在分區控制頁上的統計數據,來評測基於分區的並行掃瞄方式,以挑選最優執行計劃。如果表中數據在多個分區上是分佈均衡的,表分區統計數據是精確的,那麼掃瞄效率就比較高,並行處理就有很好的性能,所以表分區的維護對於並行查詢處理十分重要。Sybase ASE的異常停止和某些情況下的事務回退都可能造成分區統計數據不精確,Sybase ASE提供了兩個系統函數data_pgs和ptn_data_pgs,用它們可分別計算數據頁面數量。如果兩者不相同,說明分區統計不精確,需要維護,Sybase ASE 提供如下命令來更新分區和頁面統計數據:


1.更新每個分區的頁面統計數據:


update partition statistics


2.更新表上索引的分佈頁面,同時更新各個表分區的控制頁面的統計數據:


update all statistics table_name


3.顯示表分區的當前信息:


sp_helpartition


如果對分區的表進行了大量的插入、更新和刪除後,數據有可能分佈不均勻,使用BCP加載大量數據後,也可能會出現數據分佈不均勻,此外一些其他原因也可能導致數據分佈不均勻。平衡分區數據有兩種方法:一是對有數據的表建聚簇索引,二是使用並行塊拷貝,指定數據加載到某個分區的方法,Sybase ASE 新的BCP允許用戶指定分區,把數據加載到指定的分區中。
posted @ 2008-09-04 10:52 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(899) | 评论 (0)编辑 收藏

为了使用户的大量的数据在读写操作和查询中速度更快,DM提供了对表和索引进行分区的技术,以改善超大规模应用的性能并方便数据管理。

  实现水平分区以后,可以达到以下目的:

  1. 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

  2. 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

  3. 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;

  4. 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

  DM数据库提供对表的分区方法有两种:

  1、范围分区:范围分区就是对表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。

  2、HASH分区:HASH分区是通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。

  除了对表进行分区,还可以对索引进行分区。DM支持下面三种类型的分区索引:

  1、本地索引:其分区方式与其所在基础表的分区方式一模一样的索引。本地索引的每个分区仅对应于其所在基础表的一个分区。

  2、全局分区索引:使用不同于其所在表的分区键进行分区的索引,其所在表可以是分区表或非分区表。

  3、全局非分区索引:全局非分区索引基本上和非分区表的索引一样。索引结构是不分区的。

  1.1 水平分区表的创建

  在介绍水平分区表的创建之前。先要了解分区键的概念。

  分区键:分区键是分区表的某一列,它决定了分区表中每一行数据划分到哪个分区。该列的数据类型为DM常用数据类型,不支持BLOB、TEXT、ROWID、BIT、BINARY、VARBINARY、时间间隔等类型和用户自定义类型。分区键不可以删除或修改。

  范围分区通过LEFT或RIGHT关键字来指定每个值是第一个分区的上边界 (LEFT) 还是第二个分区的下边界 (RIGHT)。边界值不要求是递增的序列,但是不能重复,边界值不可以为NULL,支持使用常量表达式或返回常量值的函数来指定分区的边界值。

  如:建立范围分区表CREATE TABLE TAB1(C1 INT, C2 INT, C3 VARCHAR(100)) PARTITION BY RANGE (C1) LEFT FOR VALUES (1, 100, 10000);

  PARTITION NO1234

  VALUESVAL<=11

  建立HASH分区表CREATE TABLE TAB2(C1 INT, C2 INT, C3 VARCHAR(100)) PARTITION BY HASH(C1) PARTITIONS 3; TAB2以C1为分区键,且分区数为3。

  范围区间或HASH分区数目不能超过64个。不同的分区可以指定到不同的文件组。。

  1.2 分区索引的创建

  本地索引、全局非分区索引、全局分区索引可以建立在范围分区表或HASH分区表上,普通表上可以建立全局分区索引。

  如:CREATE TABLE T(C1 INT, C2 INT, C3 VARCHAR(100)) PARTITION BY RANGE(C1) LEFT FOR VALUES(1, 100);

  CREATE INDEX T_IND1 ON T (C2); -- 本地索引,系统将自动创建3个分区子索引,这些分区子索引按照C1进行分区。

  CREATE NOT PARTIAL INDEX T_IND2 ON T (C2); -- 全局非分区索引,索引不分区。

  CREATE INDEX T_IND3 ON T (C2) PARTITION BY RANGE(C2) LEFT FOR VALUES(5, 55); -- 全局分区索引,索引按照C2列分区

  1.3 水平分区表和分区索引的维护

  DM支持对范围分区表和范围分区表上的索引进行合并和拆分。HASH分区表和HASH分区表上的索引不支持合并和拆分,本地分区索引不允许合并和拆分。

  分区合并通过指定分区号将相邻的两个分区合并成一个分区。MERGE分区时,相邻的两个分区可以是相同的文件组,也可以是不同的文件组。

  分区拆分通过指定常量表达式值将某一个分区拆分成两个分区,指定的常量表达式值不能是原有的分区范围值。SPLIT分区时,可以指定新的文件组,或者不指定文件组。

  1.4 水平分区的使用

  水平分区表、分区索引的使用和普通表、普通索引的使用一样。用户通过SQL语句建立范围分区和HASH分区表,以及水平分区索引以后,普通的INSERT、DELETE、UPDATE、SELECT语句的使用不受任何影响。

  分区拆分或合并以后,普通的INSERT、DELETE、UPDATE、SELECT语句的使用不受任何影响。

posted @ 2008-09-02 17:38 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(361) | 评论 (0)编辑 收藏

一、前言:在经过一段时间的存储过程开发之后,写下了一些开发时候的小结和经验与大家共享,希望对大家有益,主要是针对Sybase和SQL Server数据库,但其它数据库应该有一些共性。

二、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。

三、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。

四、内容

1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。

2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。

3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:

a)SQL的使用规范:

i.尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。

ii.尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。

iii.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。

iv.注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。

v.不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 vi.尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。

vii.尽量使用“>=”,不要使用“>”。

viii.注意一些or子句和union子句之间的替换

ix.注意表之间连接的数据类型,避免不同类型数据之间的连接。

x.注意存储过程中参数和数据类型的关系。

xi.注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。

b)索引的使用规范:

i.索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。

ii.尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引

iii.避免对大表查询时进行table scan,必要时考虑新建索引。 iv.在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。 v.要注意索引的维护,周期性重建索引,重新编译存储过程。

c)tempdb的使用规范:

i.尽量避免使用distinct、order by、group by、having、join、cumpute,因为这些语句会加重tempdb的负担。

ii.避免频繁创建和删除临时表,减少系统表资源的消耗。

iii.在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。

iv.如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。

v.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。

vi.慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。

d)合理的算法使用:

根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。

具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等。

posted @ 2008-09-02 15:35 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(576) | 评论 (0)编辑 收藏

1.1 性能指標
        數據庫性能一般用兩個方面的指標來衡量:響應時間和吞吐量。響應越快,吞吐量越大,數據庫性能越好。響應時間和吞吐量有些情況下不能一起得到改善。

1.2 調優級別
對Sybase數據庫性能調優,可以從四個方面進行:
一)        操作系統級:對網絡性能、操作系統參數、硬件性能等作改進。
二)        SQL Server級:調整存取方法,改善內存管理和鎖管理等。
三)        數據庫設計級:採用降範式設計,合理設計索引,分佈存放數據等。
四)        應用程序級:採用高效SQL語句,合理安排事務,應用游標,處理鎖。
本文對第一、第三、第四方面的內容不做討論,第二方面提到的概念只適用於Sybase數據庫。

1.3 調優工具
        在分析Sybase數據庫的性能時,要用到一些數據庫系統本身提供的性能調優工具,包括幾個系統存儲過程:
名稱        功能簡要介紹
sp_sysmon        企業級系統性能報告工具
sp_lock        查看鎖的情況
sp_who        查看線程的活動情況
sp_procqmode        存儲過程的查詢處理模式
sp_configure        配置SQL Server系統級參數
sp_estspace        估計創建一個表需要的空間和時間
sp_spaceused        估計表的總行數及表和索引佔用的空間
sp_monitor        監視CPU、I/O的統計活動情況

在利用isql等一些工具時,還可以設置查詢會話中的幾個選項,來顯示SQL語句執行時的各種統計分析結果:
指令        On 的含義
set noexec on/off                        分析SQL語句後,還要執行
set statistics io on/off        統計SQL執行所需I/O
set statistics time on/off        統計SQL語句執行耗時
set showplan on/off                        顯示查詢計劃

1.4 sp_sysmon 的使用
企業級性能報告工具、系統存儲過程 sp_sysmon 的使用方法:
在isql 下,首先輸入          sp_sysmon 'begin_sample'          啟動一個報告採樣過一段時間後,再輸入          sp_sysmon 'end_sample'                結束上次報告採樣
或者緊跟一參數                        sp_sysmon 'end_sample', "dcache" 結束上次報告採樣, 但只顯示數據緩衝(Data Cache Management)這一部分的情況。
能替換dcache的可選參數如下表所示:
參數        參數全稱,內容範圍解釋
Dcache        Data Cache Management,數據緩衝
Kernel        Kernel Utilization,有關引擎、網絡和I/O等情況
Wpm        Worker Process Management
Parallel        Parallel Query Management
Taskmgmt        Task Management
Appmgmt        Application Management
Esp        ESP Management
Housekeeper        Housekeeper Task Activity
Monaccess        Monitor Access to Executing SQL
Xactsum        Transaction Profile
Xactmgmt        Transaction Management
Indexmgmt        Index Management,索引管理
Mdcache        Metadata Cache Management
Locks        Lock Management,鎖管理
Pcache        Procedure Cache Management
Memory        Memory Management
Recovery        Recovery Management
Diskio        Disk I/O Management,磁盤I/O管理
Netio        Network I/O Management

1.5
用sp_sysmon可以得到數據庫系統的性能基準報告,但要在比較穩定的狀態下產生,方可作為參考和對照的依據。

1.6 理解存儲方法
只有清楚數據庫存儲數據的底層細節,如數據頁、索引頁的物理結構,每一行的大小計算,不同類型列佔用的寬度等等問題,才能對各種調優措施有個深入領會。關於這個問題,比較複雜和細緻,請自行參閱有關書籍。
一般地,對於更改數據的操作,要盡量促進數據庫進行直接更新( Direct Updates ),所以要遵守以下幾條原則:
1)除非必要,避免使用允許null值的列和可變長度的列。
2)如果varchar 和 varbinary 列填充得比較滿,毫不猶豫轉成 char 和 binary 列。對於建表時指定的頁填充率(page fillfactor)參數,要權衡確定數值大小。一般:小值,適合於有許多隨機插入的表,該表的數據經常被刪除,又經常被增加;大值,適合於大多數的數據被增加到表末尾,如客票系統的售票存根和退票存根表。

2 SQL Server級的調優
2.1 管理共享內存
        數據庫性能優化的首要方面是最優管理內存。數據庫佔用的共享內存分成數據緩衝(data cache)、存儲過程緩衝(Procedure cache)等幾塊。在isql 下使用 sp_configure 'cache' 可以看到存儲過程緩衝所佔百分比(procedure cache percent),整個數據緩衝大小(total data cache size) 等參數。

2.1.1 存儲過程緩衝(Procedure cache)
存儲過程緩衝保持以下對象的查詢計劃:
Procedures                        :存儲過程
Triggers                                :觸發器
Views                        :視圖
Rules                        :規則
Defaults                                :缺省
Cursors                                :游標
存儲過程不可重入,意即每個並發用戶調用都會在內存中產生一個拷貝。
Procedure, triggers, and views 當它們被裝載到procedure cache中時,被查詢優化器優化,建立查詢計劃。如果存儲過程在緩衝中,被調用時就不需要重新編譯。如果procedure cache太小,存儲過程就會經常被其他調入內存的存儲過程沖洗掉,當再次被調用時,存儲過程又被調入內存,再重新編譯,用戶請求因此不得不等待。最嚴重的情況,如果procedure cache不夠,存儲過程甚至都不能運行。所以在內存足夠的情況下,procedure cache percent 參數盡可能大一些。

2.1.2 數據緩衝(Data Cache)
        數據緩衝用來緩存數據頁和索引頁,是除去存儲過程緩衝,系統其他佔用的緩衝外的剩餘內存空間。通過給服務器增加物理內存擴大數據緩衝,是最有效的方法。當然,如果不能加內存,就只能通過減少存儲過程緩衝的比例等方法來擴大數據緩衝了。通過 sp_configure "extent I/O buffers", 20(可調) 命令,在Data Cache中保留一些頁專用於創建索引時使用,可以顯著提高創建索引的性能。但要注意每開闢一個緩衝佔用16K 字節的系統內存。

2.1.3 命名緩衝
        通過如下的命令:
1>; sp_helpcache
2>; go
查看某客票數據庫中命名緩衝,得到的結果如下:
Cache Name                Config Size     Run Size       Overhead

------------------------ -------------   ----------     ----------
DS30_Tran_Log              20.00 Mb       20.00 Mb        2.05 Mb
Systemtable                    20.00 Mb       20.00 Mb        2.05 Mb
default data cache          0.00 Mb     4462.86 Mb      464.97 Mb
left_base_center            16.00 Mb       16.00 Mb        1.57 Mb
price_cache                     8.00 Mb        8.00 Mb        0.85 Mb
可以看出有4個命名緩衝,分別綁定客票系統的應用日誌表、一些重要且常用的系統表、余票表、票價系列表,另外1個是缺省數據緩衝。這種配置還不是最合理,應該進一步把Systemtable這個命名緩衝細分成很多個,每一個單獨存放一張系統表。

2.1.4 緩衝策略
緩衝策略是指把數據提前讀入內存的機制,分預取策略(Prefetch rategy,即大I/O策略)和取後馬上丟棄策略(Fetch-and-Discard)、提示策(Hints)等幾種。可以在三個級別上設置表數據的預取策略(Prefetch Strategy,即大I/O策略)於:對像級,會話級,查詢級。如果三個級別上都有設置,它們發生作用的優先順序是:對像級 >; 會話級 >; 查詢級。對於如何在查詢級利用指定的緩衝池,可以查看下面例子(使用4K緩衝池):
select au_fname, au_lname
  from authers (prefetch 4)
where au_id in ( A372020631, ..., A1887081515 )
go
DSS應用往往得益於大的I/O,應該放開large I/O strategy預取策略。
如果一個應用傾向於OLTP特徵,用戶能在會話級關掉Prefetch來提高性能。對於OLTP應用,關閉large I/O strategy預取策略。對於所取到的頁不會有重用的情況,放開fetch-and-discard策略。客票系統對存根數據進行統計的應用,如財收日結賬,營銷分析數據整理模塊和綜合查詢等,都可以利用這一結論。查看幾個操作頻繁且較大的表上的緩衝策略,用如下命令:
sp_cachestrategy center,seat_area
sp_cachestrategy center,sale_record0505

2.2 管理鎖
2.2.1 頁鎖升級閥限
優化鎖的重要考慮是設置頁級鎖升級升級成表級鎖的閥限。要盡量避免頁鎖很快升級成表級鎖。在某客票數據庫中,用sp_configure 『lock』可以看到如下結果:
deadlock checking period           500           0        1000      1000
number of locks                  5000       46875      200000  200000
page lock promotion HWM      200           0       10000       10000
page lock promotion LWM       200           0         200         200
page lock promotion PCT         100           0          90          90
可以看到頁鎖升級的閥限有三個:HWM(最高點) 為10000,LWM(最低點)為200,PCT為90。Sybase數據庫內部根據PCT值按公式PCT*TAB_SZ/100得出計算閥限,如果計算閥限 < LWM, 鎖升級發生在LWM值;如果計算閥限 < HWM,鎖升級發生在HWM值。如果 LWM < 計算閥限 < HWM ,鎖升級發生在PCT*TAB_SZ/100值。
鎖升級閥限設置分對像級和服務器級兩種。
針對對像級設置(數據庫上的表或表上的索引),配置命令是:
sp_setpglockpromote {"database" | "table"}, objname, new_lwm,new_hwm, new_pct
針對服務器級設置,配置命令是:
sp_setpglockpromote server, NULL, new_lwm, new_hwm, new_pct。
如果要刪除掉對像級上的頁鎖升級閥限,用:
sp_dropglockpromote {"database" | "table"}, objname

2.2.2 減少鎖爭奪的方法:
1)降範式設計數據庫,創建冗余表。
2)把堆表(沒有聚族索引的表)分區。
3)對於小表,使用fillfactor和max_rows_per_page來減少行密度,從而使各行數據分佈到許多頁(此方法適用於SQL Server 11版,對於11.9.2版以後的Sybase數據,有了行級鎖,此方法必要性不大)。

2.3 管理臨時庫(tempdb)
管理臨時庫一個重要原則是要避免臨時表跨多個設備,可以把tempdb從master設備中分離出來,放到一個單獨的設備上去。這樣可以減少存取系統表時對I/O資源的爭奪。用sp_dropsegment 存儲過程從master設備中移除tempdb的default段和system段。為了進一步提高tempdb的I/O速度,可以考慮把tempdb整個放在RAM 驅動器或固態存儲設備上,存取速度是一般磁盤的1000倍。一般情況下,tempdb會非常頻繁地爭奪和佔用缺省數據緩衝,因為查詢會話中有許多臨時表要創建、計算和刪除。所以推薦把tempdb綁定到它自己的命名緩衝,這樣可以防止臨時對像在內存中的活動沖洗掉缺省數據緩衝中的其他對象,利於在多個緩衝間展開I/O。在使用臨時表的時候,還有一個原則:盡量縮小表規模和行的寬度,每一行只包括必要的列。例如在用select * into生成臨時表時,如果只需要幾個列的數值,就不要用這樣的語句,而直接選取需要的列。

2.4 使用多引擎(Multiple Network Engines)
如果操作系統使用了多個CPU,那麼用sp_configure 配置數據庫的參數:在線引擎數(max online engines),可以擴展系統的網絡I/O容量,分佈網絡I/O到各個引擎,從而提高性能,允許更多的用戶連接。
在用戶登錄數據庫時,總是先登錄到引擎0,由引擎0在可用引擎隊列中選擇一個掛最少連接的引擎來傳遞socket描述符,從而重定向連接到那個引擎,由該引擎去處理跟此用戶連接相關的所有網絡活動。
對於多引擎SMP結構,SQL Server引入了自旋鎖(spinlock)的一種數據結構,在多個引擎間共享。對於不同類型的任務,在哈希表上分配不同的自旋鎖,有頁鎖自旋鎖、表鎖自旋鎖和地址自旋鎖。
自旋鎖的配置:
sp_configure "page lock spinlock ratio", newval
sp_configure "table lock spinlock ratio", newval
sp_configure "address lock spinlock ratio", newval
增大數值,可以減少碰撞,提高並發操作度。但是每一個自旋鎖結構要佔用256字節的內存。
如果數據庫發生1279錯,可能原因:
1)不允許足夠的鎖,解決辦法是用sp_configure 調大 number of locks 數值
2)在engine freelock 緩衝中沒有足夠的鎖,解決辦法是用sp_configure調大 max engine freelocks 數值。
如果數據庫系統使用了4個引擎,那麼每個引擎的自由鎖緩衝中包含:each engine-specific freelock cache 包含 5000 * .20 /4 = 250 個鎖。
在平時,經常用sp_monitor和sp_sysmon監視CPU使用率,如果所有CPU的利用率高於85%,增加CPU,然後增大數據庫的引擎數,可以改善性能。

2.5 設備使用的優化
把最常插入的表分區,放在多個設備上,這樣可以創建多個頁鏈,從而改善多個並發插入時的性能,因為每一個插入都要找到頁鏈,頁鏈有多個,就允許多個插入同時進行。這一點,尤其適用於客票系統的存根表和訂票存根表(CG30_RRT),所帶來的性能改善會非常明顯。
物理I/O的代價遠大於邏輯I/O,所以要盡量減少磁盤進行物理I/O的次數,盡量多進行內存中的邏輯I/O。使用statistics io工具和sp_sysmon,來觀察磁盤I/O。可以配置使用大的I/O來減少物理I/O的次數,方法有三個:
1)用更多的磁盤;
2)表和索引分開到不同的磁盤;
3)增加一次I/O系統參數值的大小。
SQL Server總是為I/O請求建立一個磁盤檢查的調度環,用sp_configure "I/O polling process count"來提高數值,加長環,可以降低引擎的檢查次數,提高吞吐量。但較小的值一般有助於減少響應時間。
對於可用的磁盤I/O控制塊,要查看操作系統文檔,用sp_configure "disk i/o structures"配置,這個數值要盡可能高。
分離日誌和數據,到不同的設備;給tempdb自己的設備;分離表和索引到不同的設備。這些方法都可以減少I/O。

2.6 對事務處理的調優
2.6.1 事務類型
事務處理無外乎三種:1,OLTP; 2, DSS; 3, OLTP + DSS 的混合負載
OLTP(聯機事務處理)的特點:
        數據插入、修改和刪除頻繁。
        經常操作的是單個記錄。
        當不適當設計時,傾向於碰撞和衝突。
DSS(決策支持系統)的特點:
        數據修改不太頻繁。
        如果有插入和刪除,是大批量的。
        平時一般是只讀操作。
        表連接很常見。
        有比較特別的查詢。
OLTP + DSS 混合負載的特點權衡:
        在性能方面要比較,是要吞吐量還是響應時間。
        在鎖方面要比較,是要並發性強呢還是要數據一致性強。

2.6.2 事務管理原則
一般的事務管理原則有:
1)        分解大的事務成多個小的事務。如客票數據的備份操作中,要刪除過期數據,如果設計小事務做循環,便不會影響應用,完全可以做到任何時候備份和刪除,不一定非得等服務器閒的時候做。
2)        避免在單個事務中更新或刪除大量的數據行。比如客票系統的席位庫數據清理,即使在服務器閒的時候做這種操作,也會鎖定整個表,影響售票。
3)        盡量用可以接受的最低孤立級(isolation level),來提高並發度。如在余票查詢等功能的應用中,使用這種孤立級,便可以最大程度地降低對售票的影響。
4)        提高事務吞吐量的措施包括:避免延遲更新;盡可能使用存儲過程等等。

2.6.3 跟事務特徵相關的數據庫可調參數或特性
相對於OLTP應用,SQL Server有一些特性來滿足要求。
1)        命名緩衝(Named cache)
對於命名緩衝,可以配置多個不同大小的內存池,來滿足不同的應用需求。對於多個引擎的情況,命名緩衝還有一項重要的功能是降低自旋鎖的內部爭奪。
2)        日誌I/O緩衝大小可配置
sp_logiosize ["default" | "size" | "all" ]
缺省值是4K,但如果4K內存池沒有配置,SQL Server會使用2K大小的內存池
3)        堆表可分區,分佈插入操作到各個設備
適用於頻繁插入的表和有並發BCP倒入數據的表,如客票系統的售票存根和退票存根表。
4)        鎖升級閥限可配置。

相對於DSS應用,SQL Server也有一些特性來滿足要求
1)        應用大的 I/O 緩衝池
用sp_poolconfig來配置。
2)        綁定熱表到命名緩衝
如 sysindexes, syslogs, 注意如果把 syslogs 放到單獨的緩衝中,可以減少在缺省或其他命名緩衝上的自旋鎖爭奪。對於客票系統的train_dir, stop_time, 票價表, 取票存儲過程相關的表都可以放在單獨的命名緩衝上。
3)        取後丟棄緩衝策略 (Fetch-and-discard cache strategy)
不會沖洗掉緩衝中的常用對象,可以減少MRU鏈的爭奪,較少對OLTP事務的干擾。
對於收入統計應用,統計過往存根表中的數據,可以應用這一策略。

2.7 網絡方面的調優
Sybase客戶和服務器之建傳遞的是TDS包,缺省大小是512字節。對於要傳輸大批量數據的應用,如BCP、 文本/圖像的取用、大結果集SQL語句,要用下面的配置命令配置大的TDS包大小。
sp_configure "default network packet size", nnn
sp_configure "maximum network packet size", nnn
        對於isql 和bcp,可以在應用級指定TDS包的大小:isql -Usa -P –Annn,bcp -Usa -P –Annn。
注意在調大maximum network packet size的參數後,要增大 additional network memory 參數,來適應 maximum network packet size 的要求。
posted @ 2008-09-02 15:29 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(1422) | 评论 (0)编辑 收藏

最初发现遇到“IE7下拉框显示不全”这个问题时,一直以为是由于IE7的浏览器的兼容问题,并未找到这个问题的解决方案。但是开发应用系统过程中,不少用户都反应使用IE7浏览器时,出现下拉框显示不完整的情况。随着IE7不断的普及,会有更多的用户遇到同样的问题,所以这个问题必须解决,问题是怎么解决,问题出在哪里?
查找了几天,查看jsp是否哪里写错了,但是并未找到结果。后来安装了IE7浏览器后,在本地重现了一下,部分下拉框还是出现缺失的现象,我突然发现有的页面下拉框是完整的,而有的页面是缺失的,难道页面有什么区别?我仔细比较了一下完整显示下拉框和缺失显示下拉框的页面,发现它们的区别在于页面声明的部分"<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">",难道是IE7不支持该标签,或者说该标签在IE7浏览器已经过时了?我删除该标签后,验证了一下,确实问题是出在这里。

在网上收集整理了一些IE6和IE7关于CSS兼容表现的资料
JSP的DOCTYPE声明说明:
html
PUBLIC
"-// W3C// DTD
HTML 4.01 Transitional// EN" "http://www.w3.org/TR/html4/loose.dtd">
(1) (2) (3) (4) (5) (6) (7) (8)

[Top Element] [Availability] "[Registration]// [Organization]// [Type] [Label]// [Language]" "[URL]">
(1) (2) (3) (4) (5) (6) (7) (8)

(1) Top Element: DTD中声明的最顶层元素,例如html。
(2) Availability: 指示标识符是公共标识符号(PUBLIC)还是系统资源(SYSTEM),例如本地文件、url等。
(3) Registration: 指示组织是否注册为ISO成员,+表示已经注册为ISO成员,-表示没有注册。W3C没有注册,所以使用-。
(4) organization: 对于HTML、XHTML而言指维护DTD的组织标识符,W3C。
(5) Type: Public Text Class,引用对象的类型,对于HTML、XHTML而言为DTD。
(6) Label: Public Text Description,引用内容的唯一名称描述,Label里面可以包含一个版本号(4.01),可以包含一个Defintion(有三种Definition: Frameset, Strict, Transitional,下面会描述)。
(7) Language: 语言代码。
(8) URL: 引用DTD的url。
各个浏览器对HTML、CSS的处理,在细节上存在很多差异,为了向W3C标准靠近,并且HTML、CSS的标准也在不断的发展,因此同一个浏览器的不同版本之间,也会存在细节处理上的不一致性。现在浏览器使用DOCTYPE声明来决定该使用那种模式处理HTML、CSS,通常提到的有standards mode(标准模式,strict Mode)和quirks mode(兼容模式compliant mode)。标准模式指浏览器采用尽量靠近目前W3C规范的方式,支持目前版本的HTML、XHTML、CSS规范;兼容模式指浏览器按照以前的老版本的方式处理,以兼容那些旧版本的web应用。另外需要注意的是,虽然目前主要的浏览器都支持这两种模式,但都有差别,例如Firefox除了上面两种模式外,还有一个almost standards mode。
下面是HTML 4.01的DTD,分别为Strict, Transitional, Frameset

IE 6 CSS增强、IE 7 CSS兼容性
References: Cascading Style Sheet Compatibility in Internet Explorer 7、 CSS Enhancements in Internet Explorer 6
Label中的Definition三种类型:Frameset,支持FRAMESET文档;Transitional,支持除了FRAMESET以外其它所有元素;Strict,不支持W3C准备淘汰的元素、属性。这种描述有点让人糊涂,也无法跟标准standards mode、quirks mode对应上,至于具体的定义可以参考W3C标准。

下面这个表格是比较有用的:
Label Definition URL present URL not present
No !DOCTYPE present Off Off
HTML (No Version Present) Off Off
HTML 2.0 Off Off
HTML 3.0 Off Off
HTML 3.2 Off Off
HTML 4.0 No Definition Present On On
HTML 4.0 Frameset On Off
HTML 4.0 Transitional On Off
HTML 4.0 Strict On On
XHTML On On
XML On On
Unrecognized !DOCTYPE On On


其中On表示使用strict mode(standards mode),Off表示使用compliant mode(quirks mode)。URL present/URL not present表示DTD文档的url是否有在DOCTYPE中声明;Definition为空或者No Definition Present表示Definition没有定义。从IE 6开始支持这两种模式的切换,在strict mode下,IE尽量保持与W3C标准一致,而compliant mode下,IE将保持与以前的IE版本兼容。用这个表格,对照1中几种DOCTYPE可以知道,只有在strict mode下,IE 7才支持filter:progid:DXImageTransform.Microsoft.Alpha这个滤镜。让人奇怪的是,也只有在strict mode下,IE 7才支持filter: alpha(opacity=60),compliant mode下是不支持的,而这个写法是针对IE 5.5之前版本的。
在strict mode下面,两个比较重要的差异点:
a) Box的height、width计算问题



CSS标准中,width、height指图中Content的宽度、高度,而IE在计算宽度、高度时,将包括padding、border
posted @ 2008-08-23 11:15 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(2727) | 评论 (0)编辑 收藏

文章描述了通过sp_sysmon对Adaptive Server系统运行情况有一个全面系统了解,有利于更好地熟悉系统性能,更为有效地进行系统管理,合理地利用和配置系统资源,达到系统性能调优的目的。
从18个方面了解在用系统性能状况,并在适当的时候利用环境参数进行性能调优:

1、内核管理(kernal)
2、应用管理(appmgmt)
3、数据缓存管理(dcache)
4、ESP管理(esp)
5、索引管理(indexmgmt)
6、锁管理(locks)
7、内存管理(memory)
8、元数据高速缓存管理(mdcache)
9、任务管理(taskmgmt)
10、监视器访问SQL的执行(monaccess)
11、网络I/O管理(netio)
12、并行查询管理(parallel)
13、过程缓存管理(pcache)
14、恢复管理(recovery)
15、事务管理(xactmgmt)
16、事务概要(xactsum)
17、磁盘I/O管理(diskio)
18、工作进程管理(wpm)

括号后英文短词是该模块参数。
步骤:执行sp_sysmon “00:10:00”(server级系统存贮过程,不需要打开某个数据库),或者执行如下格式的过程,查看具体操作批命令对应系统性能情况:(10分钟系统查看)
sp_sysmon begin_sample
SQL语句或者存贮过程
sp_sysmon commit_sample
本实验采用 sp_sysmon “hh:mm:ss”,性能模块名。
可了解当前系统在各方面的系统运行状况,性能出现什么问题和不平衡不协调之处,学会使用相应的参数和措施进行解决和调优,不断比较对照调整前后的性能状况,最终改善系统性能。
说明:1、该命令执行结果集的开头相同如下:


======================================================================
Sybase Adaptive Server Enterprise System Performance Report
======================================================================
Server Version: Adaptive Server Enterprise/11.9.2/1031/P/NT (IX86)/OS 3.
Server Name: Server is Unnamed
Run Date: May 28, 2001
Statistics Cleared at: 15:57:27
Statistics Sampled at: 16:07:28
Sample Interval: 00:10:00


2、执行结果集的每列信息提示:

per sec : 采样期间每秒的平均值
per xact: 采样期间每提交一个事务的平均值
count : 采样期间每秒的总计值
% of total: 占总数的百分比,根据不同情况各有不同

3、结果集对应给出性能情况描述、分析以及可调性说明
4、只给出部分模块的监视结果(可能有删节),用sp_sysmon “hh:mm:ss”可看全部详细情况。
单元一:监视内核利用情况
命令行:sp_sysmon “00:10:00”,kernal
结果:

Kernel Utilization (内核利用)

------------------
Engine Busy Utilization
Engine 0 1.8 %
引擎繁忙程度应在80%-90%之间,如果长期在90%以上,应考虑增加引擎数来改善性能。因为此时内部管理进程无法向磁盘写入,则检查点需要将许多页写回磁盘,而检查点进程很可能将CPU的利用率提高到100%,导致响应时间明显增加。
CPU Yields by Engine per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Engine 0 6.6 0.6 3949 100.0 %
引擎放弃CPU次数:% of total=1个引擎放弃次数/所有引擎放弃次数,如果显示引擎利用率较低,可通过放弃数判断是否真实反映引擎的停止情况。增加“runnable process search count”(引擎放弃CPU给OS之前一个引擎循环查找可执行任务的次数)参数可增加CPU的驻留时间,而如果想减少引擎在空闲时检查I/O的时间,可减少该参数的值。
Network Checks
Total Network I/O Checks 0.0 0.0 0 n/a
引擎发送或接收网络包的次数。引擎空闲时频繁检查网络包,如果该值很低而“CPU Yields by Engine”的值高,表明引擎可能被频繁放弃。
可能包括阻塞和非阻塞两种检查方式。非阻塞方式不管有无I/O等待都对网络进行I/O检查。如果引擎已被放弃并正执行阻塞网络检查,则在网络包到达以后仍保持一段睡眠时间(潜伏期)。此时增加“runnable process search count”(缺省2000)参数可减少潜伏期,保持引擎有较长的循环检查时间,而不是过早被放弃。
Disk I/O Checks磁盘I/O检查情况:
Total Disk I/O Checks 693.2 58.8 415939 n/a
Checks Returning I/O 469.9 39.9 281921 67.8 %
引擎对I/O情况的有效检查(I/O完成次数),如过高或过低,用“i/o polling process count”(Server的调度程序在检查磁盘I/O或网络I/O之前可执行的最大进程数)参数增加或减少检查频率。通常说增加该值可增加有大量磁盘或网络I/O的应用的吞吐量,反之,减少该值有可改善其响应时间。
Avg Disk I/Os Returned n/a n/a 0.03020 n/a


增加引擎在检查期间的等待时间可改善吞吐量,因为减少引擎检查I/O时间相应增加执行进程的时间。

单元二:监视并行查询管理
命令行:sp_sysmon “00:10:00”,parallel
结果: 报告并行查询次数、执行期间调整了多少工作进程,以及在merge和sort操作时加锁情况。

Parallel Query Management
-------------------------
Parallel Query Usage per sec per xact count % of total
------------------------- --------- --------- ------- ----------
Total Parallel Queries 0.1 8.0 16 n/a
优化器自动确定是否并行操作,以及为此使用多少工作进程。
WP Adjustments Made
Due to WP Limit 0.0 0.0 0 0.0 %
会话级的限制受“set parallel_degree” or “set scan_parallel_degree”参数控制。
Due to No WPs 0.0 0.0 0 0.0 %
缺乏可用的工作进程导致申请工作进程数减少。可适当增加“number of worker processes”
Merge Lock Requests per sec per xact count % of total
报告并行merge操作的锁请求数,很快授予锁的数目,下面3种类型锁的等待情况:
------------------------- --------- --------- ------- ----------
Network Buffer Merge Locks
Granted with no wait 4.9 438.5 877 56.2 %
Granted after wait 3.7 334.5 669 42.9 %
Result Buffer Merge Locks
Granted with no wait 0.0 0.0 0 0.0 %
Granted after wait 0.0 0.0 0 0.0 %
Work Table Merge Locks
Granted with no wait 0.1 7.0 14 0.9 %
Granted after wait 0.0 0.0 0 0.0 %
------------------------- --------- --------- -------
Total # of Requests 8.7 780.0 1560
Sort Buffer Waits per sec per xact count % of total
------------------------- --------- --------- ------- ----------
Total # of Waits 0.00.0 0 n/a
并行排序所用“排序缓冲区等待”锁。如果等待数较高,可考虑加大“number of sort buffers”的值。
======================================================================

单元三:监视执行SQL的访问情况
命令行:sp_sysmon “00:10:00”,monaccess
结果:

Monitor Access to Executing SQL(监视执行SQL的访问情况)

-------------------------------
per sec per xact count % of total
------------ ------------ ---------- ----------
Waits on Execution Plans 0.0 0.00 n/a
每个试图使用sp_showplan但必须等待获得访问查询计划的读资格,报告等待次数。
Number of SQL Text Overflows 0.0 0.0 0 n/a
SQL批文本超过文本缓冲区大小的溢出次数。
Maximum SQL Text Requested n/a n/a 0 n/a
(since beginning of sample)
“max SQL text monitored”(缺省为0)参数指定分配给每个连接用户的内存量,用以保存SQL文本到内存,供sever监视器共享。推荐值为1024。
======================================================================
单元四:事务概要
命令行:sp_sysmon “00:10:00”,xactsum
结果:

Transaction Profile(事务概要)

报告提交的事务数,要尽量减少多数据库事务的提交(一个事务对多数据库的访问)
Transaction Summary per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Committed Xacts 11.8 n/a 7073 n/a
Transaction Detailper sec per xactcount% of total
------------------------- ------------ ------------ ---------- ----------
Inserts
APL Heap Table 13.6 1.2 8189 100.0 %
如果大量堆表数据插入,结合查看锁的堆表最后一页锁情况,是否引起严重的锁争夺,随之调整相应的数据表,避免因为锁资源争夺引起性能降低。
APL Clustered Table 0.0 0.0 0 0.0 %
对全页锁的表插入数据行,注意可能引起的页分裂。
Data Only Lock Table 0.0 0.0 0 0.0 %
------------------------- ------------ ------------ ---------- ----------
Total Rows Inserted 13.6 1.2 8189 100.0 %

单元五:事务管理
命令行:sp_sysmon “00:10:00”,xactmgmt
结果:

Transaction Management(事务管理)

----------------------
  用户日志cache(每个用户对应一个)降低了写入事务日志的次数,如果是多处理器系统还减少了事务日志当前页的争夺,因而提高了性能。可配置环境参数“user log cache size”(缺省最低2048字节),太小导致用户日志常满并频繁写入事务日志,太大则每个连接用户都扩大,又造成内存浪费。原则是配置不超过事务完成写入事务日志的长度。
ULC Flushes to Xact Log per sec per xact count % of total
各种类型导致写入事务日志的次数
------------------------- ------------ ------------ ---------- ----------
by Full ULC 0.0 0.0 0 0.0 %
如果% of total的值超过20%,考虑增加环境参数“user log cache size”的值。
by End Transaction 11.8 1.0 7095 95.5 %
以显式或隐式的rollback或commit标志事务结束。值大表示有很多短小事务。
by Change of Database 0.0 0.0 12 0.2 %
如果值大,考虑减低ULC中大于2K的缓冲池,降低或去除大块I/O池。
by System Log Record 0.5 0.0 321 4.3 %
其% of total值大于20%并且ULC长度大于2048,考虑降低ULC的长度。
by Other 0.0 0.0 0 0.0 %
------------------------- ------------ ------------ ----------


Total ULC Flushes 12.4 1.1 7428

单元六:索引管理
命令行:sp_sysmon “00:10:00”,indexmgmt
结果:

Index Management(索引管理)
索引可以加速数据检索,但同时又降低了更新的性能。

----------------
Nonclustered Maintenance per sec per xact count % of total
非聚簇索引维护情况:报告因为插入、删除、修改、页分裂等造成的索引维护次数。
------------------------- ------------ ------------ ---------- ----------
Ins/Upd Requiring Maint 0.0 0.0 0 n/a
影响索引的插入和修改的操作数,需要维护非聚簇索引。对于插入,有多少非聚簇索引,就需要增加多少索引维护的开销;对于修改,则只对相关的索引进行维护。
# of NC Ndx Maint 0.0 0.0 0 n/a
因为插入和修改需要对多少非聚簇索引进行维护。
Deletes Requiring Maint 0.0 0.0 0 n/a
# of NC Ndx Maint 0.0 0.0 0 n/a
影响索引的删除操作次数,以及需要维护的非聚簇索引数。
RID Upd from Clust Split 0.0 0.0 0 n/a
在APL(全页锁)的聚簇索引表发生页分裂次数,相应需要进行索引维护。
# of NC Ndx Maint 0.0 0.0 0 n/a
页分裂后对应的索引维护次数。
Upd/Del DOL Req Maint0.0 0.0 0 n/a
DOL表发生影响索引的修改删除操作次数。
# of DOL Ndx Maint 0.0 0.0 0 n/a
对应索引维护次数。
Page Splits 0.0 0.0 0 n/a
包括数据页、聚簇索引页和非聚簇索引页因为插入新行没有足够空间单元导致页分裂。页分裂造成修改索引页、修改页指针、增加锁资源争夺等从而降低性能。
如果页分裂度高(次数多),而又是对全页加锁表进行插入操作,并且表有组合键的聚簇索引,这时可通过改变那些索引的页分裂点来减少页分裂,即是说组合键的第一个键表中在用,第二个键列值按升序排列;也可考虑用fillfactor的合适配置来降低在聚簇索引的APL表的数据页以及非聚簇索引的叶子数据页上的页分裂。
建议对表插入行按照升序插入方式,这样发生页分裂点也是在插入行点而不是在页中间,这样能够提高性能。通过dbcc tune (ascinserts, 1, "表名")设置插入方式,0反之。
如果索引维护量大,会因为维护需要额外的进程、额外的I/O、额外的索引页锁从而影响性能。可以通过对比不同操作次数与导致的维护次数,如果维护次数很多,还发生页分裂、retries等现象,严重时可考虑不用索引。
单元七:锁管理
命令行:sp_sysmon “00:10:00”,locks
结果:

Lock Management(锁管理)
报告锁、死锁、锁提升和锁争夺的情况

---------------
Lock Summary(锁概述) per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Total Lock Requests 26.1 2.2 15676 n/a
总共的锁请求
Avg Lock Contention 0.0 0.0 0 0.0 %
平均锁争夺
Deadlock Percentage 0.0 0.0 0 0.0 %
死锁出现的比例
Lock Hashtable Lookups 26.1 2.2 15677 n/a
对hash表的表、页、行锁的查询次数。
Avg Hash Chain Length n/a n/a 0.00038 n/a
Hash链平均长度:采样期间每个hash桶的平均加锁数目。如果每个hash链超过4个锁,可用参数“lock hashtable size”调整扩大加锁hash表的大小,尤其是大型bcp可配置更大。
Lock Detail per sec per xactcount % of total
------------------------- ------------ ------------ ---------- ----------
对于各种类型的锁细节,重点查看其立即授予和等待情况。
Last Page Locks on Heaps 堆表最后页锁
Granted 13.6 1.2 8189 100.0 %
Waited 0.0 0.0 0 0.0 %
------------------------- ------------ ------------ ---------- ----------
Total Last Pg Locks 13.6 1.2 8189 100.0 %
如果堆表最后一页锁的争夺激烈(尤其是热对象的等待时间过长),考虑建立聚簇索引,或者表分区来解决锁资源争夺问题。
Deadlocks by Lock Type per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Total Deadlocks 0.0 0.00 n/a
死锁出现次数。当很多事务同时访问同一个数据库时,会加剧锁资源争夺,严重时事务之间会发生死锁。可用sp_object_stats查明死锁位置。该过程报告资源争夺最激烈的10张表、一个数据库中资源争夺的表和单个表的争夺情况。语法为sp_object_stats interval [, top_n
[, dbname [, objname [, rpt_option ]]]],查看锁争夺情况只需设置interval为“hh:mm:ss”。如果显示每种锁的争夺程度超过15%,应该改变加锁方式,比如表的全页锁改成数据页锁,数据页锁改成数据行锁等。
Deadlock Detection 死锁检测
Deadlock Searches 0.0 0.0 0 n/a
死锁检测次数。死锁检测将特花费时间,如果检测次数过多,用参数“deadlock checking period”(缺省500ms)调节死锁检测周期。
Lock Promotions 锁提升
Total Lock Promotions 0.0 0.0 0 n/a
锁提升指排它页锁到排它表锁、共享页锁到共享表锁、排它行锁到排它表锁、共享行锁到共享表锁、共享next_key锁到共享表锁。查看锁提升是否加剧了锁争夺或死锁发生,如果锁争夺激烈并且锁提升频繁,考虑调整锁的隔离级别,对全页锁表,需要2级也可强制为3级。
Lock Timeouts by Lock Type per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Total Timeouts 0.0 0.0 0 n/a

单元八:数据cache管理
命令行:sp_sysmon “00:10:00”,dcache
结果:

Data Cache Management(数据cache管理)

---------------------
  报告数据cache的自旋锁争夺、cache应用、cache击中错失、配置缓冲池的翻转、清洗缓存(包括脏页)、预取的请求与拒绝、读脏页请求等情况。
Cache Statistics Summary (All Caches)
-------------------------------------
per sec per xactcount % of total
------------ ------------ ---------- ----------
Cache Search Summary cache的击中和错失次数
Total Cache Hits 18.6 1.6 11171 89.9 %
Total Cache Misses2.1 0.2 1251 10.1 %
------------------------- ------------ ------------ ----------
Total Cache Searches 20.7 1.8 12422
Cache Turnover
Buffers Grabbed 0.2 0.0 102 n/a
缓存掠夺。Count表示cache缓存块链中从LRU末端取走的缓存块次数。
Buffers Grabbed Dirty 0.0 0.0 0 0.0 %
脏页掠夺。在从LRU末端取走脏页时必须等待将脏页写回磁盘。如果其值非零,可找出是什么cache受到影响,这事关cache的击中性能问题。
Cache Strategy Summary cache策略(对所有的cache)
Cached (LRU) Buffers 19.8 1.7 11880 100.0 %
报告有多少cache中的缓存块放置到MRU/LRU链的头部。
Discarded (MRU) Buffers 0.0 0.0 0 0.0 %
报告多少缓存块采用了获取-丢弃策略,缓存块用过以后被放到缓存块链的刷洗标记处。
Large I/O Usage
0.0 0.0 0 n/a
大块I/O请求使用次数,这里没有设置大块I/O,故均为0值,也没有其授权或拒绝使用情况。
Large I/O Effectiveness
大块I/O的使用效果,百分比值低表示很少的页被带入cache供查询使用,可进一步查看单个cache的使用情况。
Pages by Lrg I/O Cached 0.0 0.0 0 n/a
通过涉及的页数衡量性能是否有益。低的百分比值意味着表的存贮结构很碎,或是不恰当的cache配置策略。
Asynchronous Prefetch Activity
0.0 0.0 0 n/a
异步预取情况可结合磁盘I/O管理查看。可看参数“global async prefetch limit”。
Other Asynchronous Prefetch Statistics
APFs Used 0.0 0.0 0 n/a
异步预取合格的页数。
APF Waits for I/O 0.0 0.0 0 n/a
进程等待异步预取完成的次数。表示查询需要的页没有尽早地完成异步预取,这样进程处于等待状态。出现一定的百分比是合理的:查询的首次异步预取请求通常需要等待;每次的顺序扫描移动到新的分配单元时发出预取请求,查询必须等待第一次的I/O结束;每次非聚簇索引扫描找到合适的行集,也会发出对页的预取请求,也要等待第一次的页返回。
APF Discards 0.0 0.0 0 n/a
报告已经被异步预取读入但在使用之前就被放弃的页数。如果其值高,建议增加缓冲池的尺寸单位(比如从2K增加4K、8K、16K的缓冲池)以改善性能,或者表示预取进入cache的很多页并不为查询所需要。
Dirty Read Behavior
Page Requests 0.0 0.0 0 n/a
隔离级为0的脏读请求的页数。
-------------------------------------------------------------------------------
Cache: default data cache 缺省数据cache的情况:
per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Spinlock Contentionn/a n/a n/a 0.0 %
自旋锁只对SMP环境有用。当一个用户任务对cache的修改完成之前,其它任务将不能访问该cache而只有等待。虽然自旋锁驻留时间短,但对于高事务率的多处理器系统的性能依然有不好影响,如果自旋锁比例超过10%,应考虑建立命名cache或者是增加cache分片。
Utilization n/a n/a n/a 100.0 %
下面是cache检查的具体情况:
Cache Searches
Cache Hits 18.6 1.6 11171 89.9 %
Found in Wash 1.1 0.1 677 6.1 %
Cache Misses 2.1 0.2 1251 10.1 %
------------------------- ------------ ------------ ----------
Total Cache Searches 20.7 1.8 12422
Pool Turnover
2 Kb Pool
LRU Buffer Grab 0.2 0.0 102 100.0 %
Grabbed Dirty 0.0 0.0 0 0.0 %
------------------------- ------------ ------------ ----------
Total Cache Turnover 0.2 0.0 102
Buffer Wash Behavior
Statistics Not Available - No Buffers Entered Wash Section Yet
Cache Strategy
Cached (LRU) Buffers 19.8 1.7 11880 100.0 %
Discarded (MRU) Buffers 0.0 0.0 0 0.0 %
Large I/O Usage
Total Large I/O Requests 0.0 0.0 0 n/a
Large I/O Detail
No Large Pool(s) In This Cache
Dirty Read Behavior
Page Requests 0.0 0.0 0 n/a


单元九:内存管理
命令行:sp_sysmon “00:10:00”,memory
结果:
Memory Management(内存管理)
per secper xactcount % of total
--------------------------- ------------ ------------ ---------- ----------
Pages Allocated 0.0 0.0 13 n/a
Pages Released 0.0 0.0 13 n/a

内存中分配一个新页的次数(相当于分配新页数),以及释放内存的页数。

单元十:磁盘I/O管理
命令行:sp_sysmon “00:10:00”,diskio
结果:

Disk I/O Management(磁盘I/O管理)

-------------------报告server总体磁盘I/O行为,包括读、写和逻辑设备上的semaphore争夺。
Max Outstanding I/Os per sec per xact count % of total
最大显著I/O数:server总体开销的最大I/O数,分别通过server和引擎表示。
------------------------- ------------ ------------ ---------- ----------
Server n/a n/a 10 n/a
Engine 0 n/a n/a 10 n/a
I/Os Delayed by
系统遇到I/O延迟问题,类似于I/O被server或操作系统限制阻塞一样。多数操作系统都有一个参数限制异步I/O数。可用sp_configure查看参数“allow sql server async i/o”。
Disk I/O Structures n/a n/a 0 n/a
达到磁盘I/O结构极限从而被延迟的I/O数。当server超过了可用磁盘I/O的控制块数,I/O就会被延迟,因为server在开始一个I/O请求时需要通过任务来得到一个磁盘I/O控制块。如果其值非零,通过设置增加参数值“disk i/o structures”(缺省256)来增加磁盘I/O控制块数,如果操作系统允许尽可能设置大一些,以使用光磁盘I/O结构的机会降到最小。
Server Config Limit n/a n/a 0 n/a
用参数“max async i/os per server”(缺省2147483647)进行调整server一次所用异步磁盘I/O请求数。
Engine Config Limit n/a n/a 0 n/a
引擎配置最大异步磁盘I/O请求数限制,用参数“max async i/os per engine”查看和调整。
Operating System Limit n/a n/a 0 n/a
操作系统的限制数查看操作系统文档。
Device Activity Detail
----------------------
Device:
master.dat
master per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Reads
APF 0.0 0.0 0 0.0 %
Non-APF 0.2 0.0 102 78.5 %
Writes 0.0 0.0 28 21.5 %
------------------------- ------------ ------------ ---------- ----------
Total I/Os 0.2 0.0 130 1.5 %
Device Semaphore Granted 0.2 0.0 130 100.0 %
Device Semaphore Waited 0.0 0.0 0 0.0 %
-----------------------------------------------------------------------------

posted @ 2008-07-20 10:56 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(1229) | 评论 (0)编辑 收藏

以前的文档,整理时发现,贴出
常用的命令集合
一、配置命令
   1、检查CPU使用情况:
      sp_sysmon "internal","model"
      internal是监视时间。例如:"00:01:00"
      model是模块的名称。包括'kernel','wpm','parallel','taskmgmt','appmgmt','esp','housekeeper','monaccess','xactsum','xactmgmt','indexmgmt','mdcache','locks','dcache','pcache','memory','recovery','diskio','netio'

   2、检查使用的最大的引擎数(CPU)
      sp_configure "max online engines"
      此命令还可以改变sybase系统使用CPU的数量。
      注意:改变后需要重新启动sybase才可以使培植生效。引擎的数量是总的CPU数量减一

   3、显示引擎号、状态、相关任务数以及引擎启动的时间:
      select engine, status, affinitied, starttime from sysengines

   4、显示每个用户的繁忙程度
      sp_reportstats

   5、监视配置参数的运行情况
      sp_monitorconfig "open objects"
      参数见sp_monitorconfig中的值

二、权限命令
   1、给一个用户授所有的权限
      grant all to user_name

   2、给一个用户授对某张表的所有权限
      grant all on table_name to user_name

   3、添加一个登录(login)
      sp_addlogin

三、TSQL使用
   1、统计信息更新
      select "print '"+name+"'"+char(10)+"update statistics "+name+ char(10) + "go"
        from sysobjects
       where (type='U' or type='S')
       order by name

   2、显示所有触发器的名称、建立时间
      SELECT USER_NAME(A.uid) 'Table Owner',
             B.name 'Table Name',
             A.name 'Trigger Name',
             CONVERT(char(10),A.crdate,101)+SUBSTRING(CONVERT(char(20),A.crdate,0),13,7) 'Create Date'
      FROM sysobjects A,
           sysobjects B
      WHERE A.type='TR'
        AND (A.id=B.instrig OR A.id=B.updtrig OR A.id=B.deltrig)

   3、关于参照
      --生成建立已有参照的SQL语句
      select distinct result_sql='alter table '+rtrim(object_name(tableid))+' add constraint '
      +rtrim(object_name(constrid))+' foreign key('+
      +col_name(sysreferences.tableid,sysreferences.fokey1)+substring(',',1,sysreferences.fokey2)
      +col_name(sysreferences.tableid,sysreferences.fokey2)+substring(',',1,sysreferences.fokey3)
      +col_name(sysreferences.tableid,sysreferences.fokey3)+substring(',',1,sysreferences.fokey4)
      +col_name(sysreferences.tableid,sysreferences.fokey4)+substring(',',1,sysreferences.fokey5)
      +col_name(sysreferences.tableid,sysreferences.fokey5)+substring(',',1,sysreferences.fokey6)
      +col_name(sysreferences.tableid,sysreferences.fokey6)+substring(',',1,sysreferences.fokey7)
      +col_name(sysreferences.tableid,sysreferences.fokey7)+') '
      +'references '+rtrim(object_name(reftabid))+'('
      +col_name(sysreferences.reftabid,sysreferences.refkey1)+substring(',',1,sysreferences.refkey2)
      +col_name(sysreferences.reftabid,sysreferences.refkey2)+substring(',',1,sysreferences.refkey3)
      +col_name(sysreferences.reftabid,sysreferences.refkey3)+substring(',',1,sysreferences.refkey4)
      +col_name(sysreferences.reftabid,sysreferences.refkey4)+substring(',',1,sysreferences.refkey5)
      +col_name(sysreferences.reftabid,sysreferences.refkey5)+substring(',',1,sysreferences.refkey6)
      +col_name(sysreferences.reftabid,sysreferences.refkey6)+substring(',',1,sysreferences.refkey7)
      +col_name(sysreferences.reftabid,sysreferences.refkey7)+')'
      +char(10)+"go"
       from sysreferences,syscolumns,sysobjects
      where sysreferences.tableid=sysobjects.id
        and sysobjects.id=syscolumns.id
        and sysobjects.type='U'
      order by sysobjects.name
      go
      --生成删除参照的SQL语句
      select distinct result_sql='alter table '+rtrim(object_name(sysreferences.tableid))+' drop constraint '+rtrim(object_name(sysreferences.constrid))+char(10)+"go"
        from sysreferences,syscolumns,sysobjects
       where sysreferences.tableid=sysobjects.id
         and sysobjects.id=syscolumns.id
         and sysobjects.type='U'
       order by object_name(sysreferences.tableid)
      go

   4、关于表级锁
      --列出所有锁类型为行锁的表
      select name
        from sysobjects
       where type='U'
         and sysstat2 & 57344 = 32768
         and name not like "XT%"
       order by name

      --调优的方法有:调整锁类型,调整表的聚簇索引
      --调整表锁类型为行锁,可以提高对表的并发访问性能,但是同时也会占用更多的系统资源
      --修改行锁的SQL语句:alter table [table_name] lock [datarows|allpages]
      --
      --调整表的聚簇索引在数据插入时,降低对表的最后一页的争用
      --Sybase规定一张表只能有一个聚簇索引,所以在调整聚簇索引时,要先删除原有的聚簇索引,然后再建立新的
      --例如将SB_ZSXX表的在ZSXH上聚簇索引修改为在NSRSBH上的聚簇索引.
      --删除原聚簇索引PK_SB_ZSXX
      drop index SB_ZSXX.PK_SB_ZSXX
      go
      create  nonclustered index PK_SB_ZSXX on SB_ZSXX(ZSXH)
      go
      -- 建立IDX_SB_ZSXX_NSRSBH的聚簇索引
      drop index SB_ZSXX.IDX_SB_ZSXX_NSRSBH
      go
      create  clustered index IDX_SB_ZSXX_NSRSBH on SB_ZSXX(NSRSBH)
      go
      --以上的索引信息可以用sp_help命令列出

   5、求出指定字段等于指定值的记录数
      declare @lc_colname varchar(30)
      --declare @lc_colvalue /*定义欲求值的变量,随着变量的类型定义不同的值*/
      --取包含指定列名的表
      select distinct name=object_name(id) into #AA from syscolumns where name = @lc_colname
      --生成SQL,求出指定字段等于指定值的记录数
      select "insert into #BB select tname='"+name+"',cnt=count(*) from "+name+" where " + @lc_colname + "='" + @lc_colvalue + "'"+char(10)+"go"
        from #AA
      --运行SQL
      --检查记录不为零的表,既为求出的表
      select * from #BB where cnt>0

   6、列出所有无主键的表
      select name from sysobjects
       where name not in (
                           SELECT object_name(id)
                           FROM   sysindexes
                           WHERE  indid > 0
                                  AND status2 & 2 = 2
                                  and status & 2048 = 2048
                         )
       and type="U"
     order by name

   7、关于用户登录
      --锁定用户
      select "sp_locklogin "+name+",'lock'"+char(10)+"go"
        from syslogins
       where name not like "%prim%"
         and name not like "%maint%"
         and name not like "sa"
       order by name

       --解除锁定的用户
       select "sp_locklogin "+name+",'unlock'"+char(10)+"go"
        from syslogins
       where name not like "%prim%"
         and name not like "%maint%"
         and name not like "sa"
       order by name
   8、为ctais_maint授权
      select "grant all on "+name+" to ctais_maint"+char(10)+"go" from sysobjects where type="U"

   9、整理出字段类型有text和image的表
      --text类型
      select distinct name=object_name(id)
        from syscolumns
       where type=35
         and id in (select id from sysobjects where type="U")
       order by object_name(id)

      --image类型
      select distinct name=object_name(id)
        from syscolumns
       where type=34
         and id in (select id from sysobjects where type="U")
       order by object_name(id)

   10、修改identity列的最大值
      --设置包含identity列的表为可直接插入记录
      set identity_insert [table] [on|off]
      --插入一个比较大的值
      insert into [table] values([value])
posted @ 2008-07-19 12:40 存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅. 阅读(1286) | 评论 (0)编辑 收藏

仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页