<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>rq2_79</title>
    <description></description>
    <link>http://rq2-79.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>试用log4jdbc</title>
        <author>rq2_79</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rq2-79.javaeye.com">rq2_79</a>&nbsp;
          链接：<a href="http://rq2-79.javaeye.com/blog/215546" style="color:red;">http://rq2-79.javaeye.com/blog/215546</a>&nbsp;
          发表时间: 2008年07月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>近日发现一个好东东log4jdbc，他是一个JDBC驱动器，能够记录SQL日志和SQL执行时间等信息。log4jdbc使用SLF4J（Simple Logging Facade For Java）作为日志系统。特性：<br />
1.支持JDBC3和JDBC4，其中JDBC3对应于JDK 1.4 or 1.5，JDBC4要求JDK 1.6或以上。<br />
2.支持现有大部分JDBC驱动。<br />
3.易于配置（在大部分情况下，只需要改变驱动类名并在jdbc url前加上&rdquo;jdbc:log4&ldquo;，设置好日志输出级别）。<br />
4.能够自动把SQL变量值加到SQL输出日志中，改进易读性和方便调试。<br />
5.能够快速标识出应用程序中执行比较慢的SQL语句。<br />
6.能够生成SQL连接数信息帮助识别连接池/线程问题。 </p>
<p>由于我们的持久层框架采用Ibatis，而系统操作的数据量也非常的大，所有的SQL前线前都必须通过DBA的审核和调优；而为了提升性能，要求所
有的SQL都必须用动态绑定的方式，而不能拼装SQL；这样在调试SQL时就会有些不方便，而且自己不知道各SQL执行所消耗的时间（公司也有提供
SQLTrace工具，但是用起来比较复杂）；以前国际站自己也写了一个类似的框架alibaba-intl-ark来对Oracle的JDBC驱动进行
封装，也尝试过使用，使用的结果并不是很理想，兼容性比较差，功能也不是很完善，所以该框架也就没多少人使用了；</p>
<p>发现log4jdbc之后立马试用了一把，感觉还不错的，下面简单介绍下使用步骤和方法：<br />
1、到官网下载log4jdbc和slf4j的jar包；比如log4jdbc3-1.1.jar、slf4j-api-1.5.0.jar，对于slf4j要看系统到底使用什么log框架，若使用log4j，则需要slf4j-log4j12-1.5.0.jar；<br />
2、
将应用中的driver-class设置为net.sf.log4jdbc.DriverSpy；对于常用的jdbc驱动无需其他设置，比如oracle
驱动oracle.jdbc.driver.OracleDriver也已经在默认设置中了，若默认驱动列表中不包括你的应用系统中需要的驱动，那需要通
过-Dlog4jdbc.drivers来进行设置系统属性，支持的默认驱动列表可到官网查看，网址见后；<br />
3、在应用中jdbc url最前面添加<span style="font-family: Courier New;">jdbc:log4；比如oracle的url就变成了jdbc:log4jdbc:oracle:thin:@x.x.x.x:1521:dbname；<br />
4、在日志系统中设置jdbc.sqlonly、jdbc.sqltiming等日志级别，可直接将log4jdbc doc中的日志内容copy过去；<br />
5、运行系统测试，到对应日志文件中查看SQL相关信息；</span>
</p>
<p><span style="font-family: Courier New;">前面提到了基本的log4jdbc配置和功能，除了这些之外，他也还提供一些比较复杂的功能，
比如可以通过-Dlog4jdbc.sqltiming.warn.threshold参数设置SQL耗时多少以上就打印warn信息；另
外，log4jdbc还提供了一个对日志文件进行分析的脚本；<br />
经测试，log4jdbc不能在XA环境下使用，比如jboss
datasource配置中，若以非XA形式local-tx-datasource配置，则没有问题；若以xa-datasource配置，则无法生
效，系统运行时不能取得connection；究其原因的话，是由于log4jdbc针对的是driver-class的封装，而不是
datasource-class；所以对系统中使用XA的用户来说就无法使用该框架了，若一定要使用，只能修改成local-tx-
datasource类型；</span>
</p>
<p><span style="font-family: Courier New;">PS：以下是相关链接地址<br />
log4jdbc：<a href="http://log4jdbc.sourceforge.net/">http://log4jdbc.sourceforge.net/</a>
<br />
slf4j：<a href="http://slf4j.org/">http://slf4j.org/</a>
</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://rq2-79.javaeye.com/blog/215546#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jul 2008 20:14:14 +0800</pubDate>
        <link>http://rq2-79.javaeye.com/blog/215546</link>
        <guid>http://rq2-79.javaeye.com/blog/215546</guid>
      </item>
      <item>
        <title>JFreeChart API一览</title>
        <author>rq2_79</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rq2-79.javaeye.com">rq2_79</a>&nbsp;
          链接：<a href="http://rq2-79.javaeye.com/blog/214418" style="color:red;">http://rq2-79.javaeye.com/blog/214418</a>&nbsp;
          发表时间: 2008年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>-----------------------------------------------------------------------------------------------------------
</p>
<p>JFreeChart类：<br />
void setAntiAlias(boolean flag)&nbsp;&nbsp;&nbsp;&nbsp;字体模糊边界<br />
void 
setBackgroundImage(Image image)&nbsp;&nbsp;&nbsp;背景图片<br />
void setBackgroundImageAlignment(int 
alignment)&nbsp;&nbsp;背景图片对齐方式（参数常量在org.jfree.ui.Align类中定义）<br />
void 
setBackgroundImageAlpha(float alpha)&nbsp;&nbsp;背景图片透明度（0.0～1.0）<br />
void 
setBackgroundPaint(Paint paint)&nbsp;&nbsp;&nbsp;背景色<br />
void setBorderPaint(Paint 
paint)&nbsp;&nbsp;&nbsp;边界线条颜色<br />
void setBorderStroke(Stroke stroke)&nbsp;&nbsp;&nbsp;边界线条笔触<br />
void 
setBorderVisible(boolean visible)&nbsp;&nbsp;&nbsp;边界线条是否可见</p>
<p>-----------------------------------------------------------------------------------------------------------</p>
<p>TextTitle类：<br />
void setFont(Font font)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标题字体<br />
void setPaint(Paint 
paint)&nbsp;&nbsp;&nbsp;&nbsp;标题字体颜色<br />
void setText(String text)&nbsp;&nbsp;&nbsp;&nbsp;标题内容</p>
<p>-----------------------------------------------------------------------------------------------------------</p>
<p>StandardLegend(Legend)类：<br />
void setBackgroundPaint(Paint 
paint)&nbsp;&nbsp;&nbsp;图示背景色<br />
void setTitle(String title)&nbsp;&nbsp;&nbsp;&nbsp;图示标题内容<br />
void 
setTitleFont(Font font)&nbsp;&nbsp;&nbsp;&nbsp;图示标题字体<br />
void setBoundingBoxArcWidth(int 
arcWidth)&nbsp;&nbsp;图示边界圆角宽<br />
void setBoundingBoxArcHeight(int 
arcHeight)&nbsp;&nbsp;图示边界圆角高<br />
void setOutlinePaint(Paint paint)&nbsp;&nbsp;&nbsp;图示边界线条颜色<br />
void 
setOutlineStroke(Stroke stroke)&nbsp;&nbsp;&nbsp;图示边界线条笔触<br />
void setDisplaySeriesLines(boolean 
flag)&nbsp;&nbsp;图示项是否显示横线（折线图有效）<br />
void setDisplaySeriesShapes(boolean 
flag)&nbsp;&nbsp;图示项是否显示形状（折线图有效）<br />
void setItemFont(Font font)&nbsp;&nbsp;&nbsp;&nbsp;图示项字体<br />
void 
setItemPaint(Paint paint)&nbsp;&nbsp;&nbsp;&nbsp;图示项字体颜色<br />
void setAnchor(int 
anchor)&nbsp;&nbsp;&nbsp;&nbsp;图示在图表中的显示位置（参数常量在Legend类中定义）</p>
<p>-----------------------------------------------------------------------------------------------------------</p>
<p>Axis类：<br />
void setVisible(boolean flag)&nbsp;&nbsp;&nbsp;&nbsp;坐标轴是否可见<br />
void 
setAxisLinePaint(Paint paint)&nbsp;&nbsp;&nbsp;坐标轴线条颜色（3D轴无效）<br />
void setAxisLineStroke(Stroke 
stroke)&nbsp;&nbsp;&nbsp;坐标轴线条笔触（3D轴无效）<br />
void setAxisLineVisible(boolean 
visible)&nbsp;&nbsp;坐标轴线条是否可见（3D轴无效）<br />
void setFixedDimension(double 
dimension)&nbsp;&nbsp;（用于复合表中对多坐标轴的设置）<br />
void setLabel(String label)&nbsp;&nbsp;&nbsp;&nbsp;坐标轴标题<br />
void 
setLabelFont(Font font)&nbsp;&nbsp;&nbsp;&nbsp;坐标轴标题字体<br />
void setLabelPaint(Paint 
paint)&nbsp;&nbsp;&nbsp;&nbsp;坐标轴标题颜色<br />
void setLabelAngle(double 
angle)`&nbsp;&nbsp;&nbsp;坐标轴标题旋转角度（纵坐标可以旋转）<br />
void setTickLabelFont(Font 
font)&nbsp;&nbsp;&nbsp;坐标轴标尺值字体<br />
void setTickLabelPaint(Paint paint)&nbsp;&nbsp;&nbsp;坐标轴标尺值颜色<br />
void 
setTickLabelsVisible(boolean flag)&nbsp;&nbsp;&nbsp;坐标轴标尺值是否显示<br />
void setTickMarkPaint(Paint 
paint)&nbsp;&nbsp;&nbsp;坐标轴标尺颜色<br />
void setTickMarkStroke(Stroke stroke)&nbsp;&nbsp;&nbsp;坐标轴标尺笔触<br />
void 
setTickMarksVisible(boolean flag)&nbsp;&nbsp;&nbsp;坐标轴标尺是否显示</p>
<p>ValueAxis(Axis)类：<br />
void setAutoRange(boolean auto)&nbsp;&nbsp;&nbsp;&nbsp;自动设置数据轴数据范围<br />
void 
setAutoRangeMinimumSize(double size)&nbsp;&nbsp;自动设置数据轴数据范围时数据范围的最小跨度<br />
void 
setAutoTickUnitSelection(boolean flag)&nbsp;&nbsp;数据轴的数据标签是否自动确定（默认为true）<br />
void 
setFixedAutoRange(double 
length)&nbsp;&nbsp;&nbsp;数据轴固定数据范围（设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围）<br />
void 
setInverted(boolean flag)&nbsp;&nbsp;&nbsp;&nbsp;数据轴是否反向（默认为false）<br />
void setLowerMargin(double 
margin)&nbsp;&nbsp;&nbsp;数据轴下（左）边距<br />
void setUpperMargin(double margin)&nbsp;&nbsp;&nbsp;数据轴上（右）边距<br />
void 
setLowerBound(double min)&nbsp;&nbsp;&nbsp;&nbsp;数据轴上的显示最小值<br />
void setUpperBound(double 
max)&nbsp;&nbsp;&nbsp;&nbsp;数据轴上的显示最大值<br />
void setPositiveArrowVisible(boolean 
visible)&nbsp;&nbsp;是否显示正向箭头（3D轴无效）<br />
void setNegativeArrowVisible(boolean 
visible)&nbsp;&nbsp;是否显示反向箭头（3D轴无效）<br />
void setVerticalTickLabels(boolean 
flag)&nbsp;&nbsp;数据轴数据标签是否旋转到垂直<br />
void setStandardTickUnits(TickUnitSource 
source)&nbsp;数据轴的数据标签（可以只显示整数标签，需要将AutoTickUnitSelection设false）</p>
<p>NumberAxis(ValueAxis)类：<br />
void setAutoRangeIncludesZero(boolean 
flag)&nbsp;&nbsp;是否强制在自动选择的数据范围中包含0<br />
void setAutoRangeStickyZero(boolean 
flag)&nbsp;&nbsp;是否强制在整个数据轴中包含0，即使0不在数据范围中<br />
void setNumberFormatOverride(NumberFormat 
formatter)&nbsp;数据轴数据标签的显示格式<br />
void setTickUnit(NumberTickUnit 
unit)&nbsp;&nbsp;&nbsp;数据轴的数据标签（需要将AutoTickUnitSelection设false）</p>
<p>DateAxis(ValueAxis)类：<br />
void setMaximumDate(Date 
maximumDate)&nbsp;&nbsp;&nbsp;日期轴上的最小日期<br />
void setMinimumDate(Date 
minimumDate)&nbsp;&nbsp;&nbsp;日期轴上的最大日期<br />
void setRange(Date lower,Date upper)&nbsp;&nbsp;&nbsp;日期轴范围<br />
void 
setDateFormatOverride(DateFormat formatter)&nbsp;日期轴日期标签的显示格式<br />
void 
setTickUnit(DateTickUnit 
unit)&nbsp;&nbsp;&nbsp;日期轴的日期标签（需要将AutoTickUnitSelection设false）<br />
void 
setTickMarkPosition(DateTickMarkPosition 
position)&nbsp;日期标签位置（参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义）</p>
<p>CategoryAxis(Axis)类：<br />
void setCategoryMargin(double margin)&nbsp;&nbsp;&nbsp;分类轴边距<br />
void 
setLowerMargin(double margin)&nbsp;&nbsp;&nbsp;分类轴下（左）边距<br />
void setUpperMargin(double 
margin)&nbsp;&nbsp;&nbsp;分类轴上（右）边距<br />
void setVerticalCategoryLabels(boolean 
flag)&nbsp;&nbsp;分类轴标题是否旋转到垂直<br />
void setMaxCategoryLabelWidthRatio(float 
ratio)&nbsp;&nbsp;分类轴分类标签的最大宽度</p>
<p>-----------------------------------------------------------------------------------------------------------</p>
<p>Plot类：<br />
void setBackgroundImage(Image image)&nbsp;&nbsp;&nbsp;数据区的背景图片<br />
void 
setBackgroundImageAlignment(int 
alignment)&nbsp;&nbsp;数据区的背景图片对齐方式（参数常量在org.jfree.ui.Align类中定义）<br />
void 
setBackgroundPaint(Paint paint)&nbsp;&nbsp;&nbsp;数据区的背景图片背景色<br />
void setBackgroundAlpha(float 
alpha)&nbsp;&nbsp;&nbsp;数据区的背景透明度（0.0～1.0）<br />
void setForegroundAlpha(float 
alpha)&nbsp;&nbsp;&nbsp;数据区的前景透明度（0.0～1.0）<br />
void setDataAreaRatio(double 
ratio)&nbsp;&nbsp;&nbsp;数据区占整个图表区的百分比<br />
void setOutLinePaint(Paint paint)&nbsp;&nbsp;&nbsp;数据区的边界线条颜色<br />
void 
setOutLineStroke(Stroke stroke)&nbsp;&nbsp;&nbsp;数据区的边界线条笔触<br />
void setNoDataMessage(String 
message)&nbsp;&nbsp;&nbsp;没有数据时显示的消息<br />
void setNoDataMessageFont(Font 
font)&nbsp;&nbsp;&nbsp;没有数据时显示的消息字体<br />
void setNoDataMessagePaint(Paint 
paint)&nbsp;&nbsp;&nbsp;没有数据时显示的消息颜色</p>
<p>CategoryPlot(Plot)类：<br />
void setDataset(CategoryDataset 
dataset)&nbsp;&nbsp;数据区的2维数据表<br />
void setColumnRenderingOrder(SortOrder 
order)&nbsp;&nbsp;数据分类的排序方式<br />
void setAxisOffset(Spacer offset)&nbsp;&nbsp;&nbsp;坐标轴到数据区的间距<br />
void 
setOrientation(PlotOrientation 
orientation)&nbsp;数据区的方向（PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL）<br />
void 
setDomainAxis(CategoryAxis axis)&nbsp;&nbsp;&nbsp;数据区的分类轴<br />
void 
setDomainAxisLocation(AxisLocation 
location)&nbsp;分类轴的位置（参数常量在org.jfree.chart.axis.AxisLocation类中定义）<br />
void 
setDomainGridlinesVisible(boolean visible)&nbsp;&nbsp;分类轴网格是否可见<br />
void 
setDomainGridlinePaint(Paint paint)&nbsp;&nbsp;分类轴网格线条颜色<br />
void 
setDomainGridlineStroke(Stroke stroke)&nbsp;&nbsp;分类轴网格线条笔触<br />
void setRangeAxis(ValueAxis 
axis)&nbsp;&nbsp;&nbsp;数据区的数据轴<br />
void setRangeAxisLocation(AxisLocation 
location)&nbsp;数据轴的位置（参数常量在org.jfree.chart.axis.AxisLocation类中定义）<br />
void 
setRangeGridlinesVisible(boolean visible)&nbsp;&nbsp;数据轴网格是否可见<br />
void 
setRangeGridlinePaint(Paint paint)&nbsp;&nbsp;&nbsp;数据轴网格线条颜色<br />
void 
setRangeGridlineStroke(Stroke stroke)&nbsp;&nbsp;数据轴网格线条笔触<br />
void 
setRenderer(CategoryItemRenderer renderer)&nbsp;&nbsp;数据区的表示者（详见Renderer组）<br />
void 
addAnnotation(CategoryAnnotation annotation)&nbsp;给数据区加一个注释<br />
void 
addRangeMarker(Marker marker,Layer layer)&nbsp;&nbsp;给数据区加一个数值范围区域</p>
<p>PiePlot(Plot)类：<br />
void setDataset(PieDataset dataset)&nbsp;&nbsp;&nbsp;数据区的1维数据表<br />
void 
setIgnoreNullValues(boolean flag)&nbsp;&nbsp;&nbsp;忽略无值的分类<br />
void setCircular(boolean 
flag)&nbsp;&nbsp;&nbsp;&nbsp;饼图是否一定是正圆<br />
void setStartAngle(double angle)&nbsp;&nbsp;&nbsp;饼图的初始角度<br />
void 
setDirection(Rotation direction)&nbsp;&nbsp;&nbsp;饼图的旋转方向<br />
void setExplodePercent(int 
section,double percent)&nbsp;抽取的那块（1维数据表的分类下标）以及抽取出来的距离（0.0～1.0），3D饼图无效<br />
void 
setLabelBackgroundPaint(Paint paint)&nbsp;&nbsp;分类标签的底色<br />
void setLabelFont(Font 
font)&nbsp;&nbsp;&nbsp;&nbsp;分类标签的字体<br />
void setLabelPaint(Paint paint)&nbsp;&nbsp;&nbsp;&nbsp;分类标签的字体颜色<br />
void 
setLabelLinkMargin(double margin)&nbsp;&nbsp;&nbsp;分类标签与图的连接线边距<br />
void setLabelLinkPaint(Paint 
paint)&nbsp;&nbsp;&nbsp;分类标签与图的连接线颜色<br />
void setLabelLinkStroke(Stroke 
stroke)&nbsp;&nbsp;&nbsp;分类标签与图的连接线笔触<br />
void setLabelOutlinePaint(Paint 
paint)&nbsp;&nbsp;&nbsp;分类标签边框颜色<br />
void setLabelOutlineStroke(Paint paint)&nbsp;&nbsp;&nbsp;分类标签边框笔触<br />
void 
setLabelShadowPaint(Paint paint)&nbsp;&nbsp;&nbsp;分类标签阴影颜色<br />
void setMaximumLabelWidth(double 
width)&nbsp;&nbsp;&nbsp;分类标签的最大长度（0.0～1.0）<br />
void setPieIndex(int 
index)&nbsp;&nbsp;&nbsp;&nbsp;饼图的索引（复合饼图中用到）<br />
void setSectionOutlinePaint(int section,Paint 
paint)&nbsp;指定分类饼的边框颜色<br />
void setSectionOutlineStroke(int section,Stroke 
stroke)&nbsp;指定分类饼的边框笔触<br />
void setSectionPaint(int section,Paint 
paint)&nbsp;&nbsp;指定分类饼的颜色<br />
void setShadowPaint(Paint paint)&nbsp;&nbsp;&nbsp;饼图的阴影颜色<br />
void 
setShadowXOffset(double offset)&nbsp;&nbsp;&nbsp;饼图的阴影相对图的水平偏移<br />
void setShadowYOffset(double 
offset)&nbsp;&nbsp;&nbsp;饼图的阴影相对图的垂直偏移<br />
void setLabelGenerator(PieSectionLabelGenerator 
generator)&nbsp;分类标签的格式，设置成null则整个标签包括连接线都不显示<br />
void 
setToolTipGenerator(PieToolTipGenerator generator)&nbsp;&nbsp;MAP中鼠标移上的显示格式<br />
void 
setURLGenerator(PieURLGenerator generator)&nbsp;&nbsp;&nbsp;MAP中钻取链接格式</p>
<p>PiePlot3D(PiePlot)类：<br />
void setDepthFactor(double 
factor)&nbsp;&nbsp;&nbsp;3D饼图的Z轴高度（0.0～1.0）</p>
<p>MultiplePiePlot(Plot)类：<br />
void setLimit(double 
limit)&nbsp;&nbsp;&nbsp;&nbsp;每个饼图之间的数据关联（详细比较复杂）&nbsp;&nbsp;&nbsp;<br />
void setPieChart(JFreeChart 
pieChart)&nbsp;&nbsp;&nbsp;每个饼图的显示方式（见JFreeChart类个PiePlot类）</p>
<p>-----------------------------------------------------------------------------------------------------------</p>
<p>AbstractRenderer类：<br />
void setItemLabelAnchorOffset(double 
offset)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据标签的与数据点的偏移<br />
void setItemLabelsVisible(boolean 
visible)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据标签是否可见<br />
void setItemLabelFont(Font font)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据标签的字体<br />
void 
setItemLabelPaint(Paint paint)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据标签的字体颜色<br />
void 
setItemLabelPosition(ItemLabelPosition position)&nbsp;&nbsp;&nbsp;&nbsp;数据标签位置<br />
void 
setPositiveItemLabelPosition(ItemLabelPosition position)&nbsp;&nbsp;&nbsp;正数标签位置<br />
void 
setNegativeItemLabelPosition(ItemLabelPosition position)&nbsp;&nbsp;&nbsp;负数标签位置<br />
void 
setOutLinePaint(Paint paint)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图形边框的线条颜色<br />
void setOutLineStroke(Stroke 
stroke)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图形边框的线条笔触<br />
void setPaint(Paint paint)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有分类图形的颜色<br />
void 
setShape(Shape shape)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有分类图形的形状（如折线图的点）<br />
void setStroke(Stroke 
stroke)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有分类图形的笔触（如折线图的线）<br />
void setSeriesItemLabelsVisible(int 
series,boolean visible)&nbsp;&nbsp;&nbsp;指定分类的数据标签是否可见<br />
void setSeriesItemLabelFont(int 
series,Font font)&nbsp;&nbsp;&nbsp;&nbsp;指定分类的数据标签的字体<br />
void setSeriesItemLabelPaint(int 
series,Paint paint)&nbsp;&nbsp;&nbsp;&nbsp;指定分类的数据标签的字体颜色<br />
void setSeriesItemLabelPosition(int 
series,ItemLabelPosition position)&nbsp;&nbsp;数据标签位置<br />
void 
setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition 
position)&nbsp;正数标签位置<br />
void setSeriesNegativeItemLabelPosition(int 
series,ItemLabelPosition position)&nbsp;负数标签位置<br />
void setSeriesOutLinePaint(int 
series,Paint paint)&nbsp;&nbsp;&nbsp;&nbsp;指定分类的图形边框的线条颜色<br />
void setSeriesOutLineStroke(int 
series,Stroke stroke)&nbsp;&nbsp;&nbsp;&nbsp;指定分类的图形边框的线条笔触<br />
void setSeriesPaint(int series,Paint 
paint)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定分类图形的颜色<br />
void setSeriesShape(int series,Shape 
shape)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定分类图形的形状（如折线图的点）<br />
void setSeriesStroke(int series,Stroke 
stroke)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定分类图形的笔触（如折线图的线）</p>
<p>AbstractCategoryItemRenderer(AbstractRenderer)类：<br />
void 
setLabelGenerator(CategoryLabelGenerator generator)&nbsp;&nbsp;&nbsp;数据标签的格式<br />
void 
setToolTipGenerator(CategoryToolTipGenerator generator)&nbsp;&nbsp;&nbsp;MAP中鼠标移上的显示格式<br />
void 
setItemURLGenerator(CategoryURLGenerator generator)&nbsp;&nbsp;&nbsp;MAP中钻取链接格式<br />
void 
setSeriesLabelGenerator(int series,CategoryLabelGenerator 
generator)&nbsp;指定分类的数据标签的格式<br />
void setSeriesToolTipGenerator(int 
series,CategoryToolTipGenerator generator)&nbsp;指定分类的MAP中鼠标移上的显示格式<br />
void 
setSeriesItemURLGenerator(int series,CategoryURLGenerator 
generator)&nbsp;指定分类的MAP中钻取链接格式</p>
<p>BarRenderer(AbstractCategoryItemRenderer)类：<br />
void setDrawBarOutline(boolean 
draw)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否画图形边框<br />
void setItemMargin(double percent)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个BAR之间的间隔<br />
void 
setMaxBarWidth(double percent)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个BAR的最大宽度<br />
void 
setMinimumBarLength(double min)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最短的BAR长度，避免数值太小而显示不出<br />
void 
setPositiveItemLabelPositionFallback(ItemLabelPosition 
position)&nbsp;&nbsp;无法在BAR中显示的正数标签位置<br />
void 
setNegativeItemLabelPositionFallback(ItemLabelPosition 
position)&nbsp;&nbsp;无法在BAR中显示的负数标签位置</p>
<p>BarRenderer3D(BarRenderer)类：<br />
void setWallPaint(Paint 
paint)&nbsp;&nbsp;&nbsp;&nbsp;3D坐标轴的墙体颜色</p>
<p>StackedBarRenderer(BarRenderer)类：<br />
没有特殊的设置</p>
<p>StackedBarRenderer3D(BarRenderer3D)类：<br />
没有特殊的设置</p>
<p>GroupedStackedBarRenderer(StackedBarRenderer)类：<br />
void 
setSeriesToGroupMap(KeyToGroupMap 
map)&nbsp;&nbsp;将分类自由的映射成若干个组（KeyToGroupMap.mapKeyToGroup(series,group)）</p>
<p>LayeredBarRenderer(BarRenderer)类：<br />
void setSeriesBarWidth(int series,double 
width)&nbsp;&nbsp;设定每个分类的宽度（注意设置不要使某分类被覆盖）</p>
<p>WaterfallBarRenderer(BarRenderer)类：<br />
void setFirstBarPaint(Paint 
paint)&nbsp;&nbsp;&nbsp;第一个柱图的颜色<br />
void setLastBarPaint(Paint paint)&nbsp;&nbsp;&nbsp;最后一个柱图的颜色<br />
void 
setPositiveBarPaint(Paint paint)&nbsp;&nbsp;&nbsp;正值柱图的颜色<br />
void setNegativeBarPaint(Paint 
paint)&nbsp;&nbsp;&nbsp;负值柱图的颜色</p>
<p>IntervalBarRenderer(BarRenderer)类：<br />
需要传IntervalCategoryDataset作为数据源</p>
<p>GanttBarRenderer(IntervalBarRenderer)类：<br />
void setCompletePaint(Paint 
paint)&nbsp;&nbsp;&nbsp;完成进度颜色<br />
void setIncompletePaint(Paint paint)&nbsp;&nbsp;&nbsp;未完成进度颜色<br />
void 
setStartPercent(double percent)&nbsp;&nbsp;&nbsp;设置进度条在整条中的起始位置（0.0～1.0）<br />
void 
setEndPercent(double percent)&nbsp;&nbsp;&nbsp;设置进度条在整条中的结束位置（0.0～1.0）</p>
<p>StatisticBarRenderer(BarRenderer)类：<br />
需要传StatisticCategoryDataset作为数据源</p>
<p>LineAndShapeRenderer(AbstractCategoryItemRenderer)类：<br />
void 
setDrawLines(boolean draw)&nbsp;&nbsp;&nbsp;&nbsp;是否折线的数据点之间用线连<br />
void setDrawShapes(boolean 
draw)&nbsp;&nbsp;&nbsp;是否折线的数据点根据分类使用不同的形状<br />
void setShapesFilled(boolean 
filled)&nbsp;&nbsp;&nbsp;所有分类是否填充数据点图形<br />
void setSeriesShapesFilled(int series,boolean 
filled)&nbsp;指定分类是否填充数据点图形<br />
void setUseFillPaintForShapeOutline(boolean 
use)&nbsp;指定是否填充数据点的Paint也被用于画数据点形状的边框</p>
<p>LevelRenderer(AbstractCategoryItemRenderer)类：<br />
void setItemMargin(double 
percent)&nbsp;&nbsp;&nbsp;每个分类之间的间隔<br />
void setMaxItemWidth(double percent)&nbsp;&nbsp;&nbsp;每个分类的最大宽度</p>
<p>CategoryStepRenderer(AbstractCategoryItemRenderer)类：<br />
void 
setStagger(boolean shouldStagger)&nbsp;&nbsp;&nbsp;不同分类的图是否交错</p>
<p>MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类：<br />
void 
setDrawLines(boolean drawLines)&nbsp;&nbsp;&nbsp;是否在每个分类线间画连接线<br />
void setGroupPaint(Paint 
groupPaint)&nbsp;&nbsp;&nbsp;一组图形连接线的颜色<br />
void setGroupStroke(Stroke 
groupStroke)&nbsp;&nbsp;&nbsp;一组图形连接线的笔触<br />
void setMaxIcon(Icon maxIcon)&nbsp;&nbsp;&nbsp;&nbsp;最大值的ICON<br />
void 
setMinIcon(Icon minIcon)&nbsp;&nbsp;&nbsp;&nbsp;最小值的ICON<br />
void setObjectIcon(Icon 
objectIcon)&nbsp;&nbsp;&nbsp;所有值的ICON</p>
<p>AreaRender(AbstractCategoryItemRenderer)类：<br />
没有特殊的设置</p>
<p>StackedAreaRender(AreaRender)类：<br />
没有特殊的设置</p>
          <br/>
          <span style="color:red;">
            <a href="http://rq2-79.javaeye.com/blog/214418#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Jul 2008 23:18:13 +0800</pubDate>
        <link>http://rq2-79.javaeye.com/blog/214418</link>
        <guid>http://rq2-79.javaeye.com/blog/214418</guid>
      </item>
      <item>
        <title>jfreechart的使用总结</title>
        <author>rq2_79</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rq2-79.javaeye.com">rq2_79</a>&nbsp;
          链接：<a href="http://rq2-79.javaeye.com/blog/214413" style="color:red;">http://rq2-79.javaeye.com/blog/214413</a>&nbsp;
          发表时间: 2008年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>这里分三部分来介绍 jFreeChart 。第一部分介绍jFreeChart产生<br />
图形的流程及相关的重要的类；第二部分介绍四种常用的报表图（饼图、柱状图、折线图、时间序列图）；第三部分<br />
介绍在图形中增加Item Lable 。<br />
jFreeChart 的版本是jfreechart-1.0.0-pre2(1)<!-- more--></p>
<p><strong>一、jFreeChart产生图形的流程</strong>
<br />
&nbsp;&nbsp; 创建一个数据源（dataset）来包含将要在图形中显示的数据,创建一个 JFreeChart 对象来代表要显示的图形<br />
&nbsp;&nbsp; 把图形输出<br />
&nbsp;&nbsp; 重要的类和接口：<br />
&nbsp;&nbsp; org.jfree.data.general.Dataset&nbsp; 所有数据源类都要实现的接口<br />
&nbsp;&nbsp; org.jfree.chart.ChartFactory&nbsp;&nbsp;&nbsp; 由它来产生 JFreeChart 对象<br />
&nbsp;&nbsp; org.jfree.chart.JFreeChart&nbsp;&nbsp;&nbsp; 所有对图形的调整都是通过它噢！！<br />
&nbsp;&nbsp; org.jfree.chart.plot.Plot&nbsp;&nbsp;&nbsp; 通过JFreeChart 对象获得它，然后再通过它对图形外部部分（例：坐标轴）调整<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：它有很多子类，一般都下嗍造型到它的子类！<br />
&nbsp;&nbsp; org.jfree.chart.renderer.AbstractRenderer&nbsp;&nbsp;&nbsp;&nbsp; 通过JFreeChart 对象获得它，然后再通过它对图形内部部分<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （例：折线的类型）调整。同样，针对不同类型的报表图，它有<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 着不同的子类实现！在下面我们简称它为 Renderer<br />
&nbsp;&nbsp; 下面我们结合不同类型的图形来具体分析这个流程。<br />
&nbsp;&nbsp;<br />
<strong>二、饼图</strong>
<br />
&nbsp;&nbsp; 饼图的dataset 一般是用PieDataset 接口，具体实现类是 DefaultPieDataset<br />
&nbsp;&nbsp; 1、创建一个数据源（dataset）：<br />
&nbsp;&nbsp;&nbsp; private static PieDataset createDataset()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultPieDataset defaultpiedataset = new DefaultPieDataset(); //注意是DefaultPieDataset！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultpiedataset.setValue(&quot;One&quot;, new Double(43.200000000000003D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultpiedataset.setValue(&quot;Two&quot;, new Double(10D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultpiedataset.setValue(&quot;Three&quot;, new Double(27.5D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultpiedataset.setValue(&quot;Four&quot;, new Double(17.5D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return defaultpiedataset;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; 2、由ChartFactory&nbsp; 产生 JFreeChart 对象<br />
&nbsp;&nbsp;&nbsp; private static JFreeChart createChart(PieDataset piedataset)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFreeChart jfreechart = ChartFactory.createPieChart(&quot;Pie Chart Demo 1&quot;,&nbsp; //图形标题名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; piedataset,&nbsp;&nbsp; // dataset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // legend?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,&nbsp;&nbsp;&nbsp;&nbsp; // tooltips?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false);&nbsp; //URLs?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PiePlot pieplot = (PiePlot)jfreechart.getPlot();&nbsp; //通过JFreeChart 对象获得 plot：PiePlot！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pieplot.setNoDataMessage(&quot;No data available&quot;);&nbsp;&nbsp;&nbsp; // 没有数据的时候显示的内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return jfreechart;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 一些重要的方法：<br />
&nbsp;&nbsp;&nbsp; pieplot.setExplodePercent(0,0.3D) //把Lable 为&quot;One&quot; 的那一块&rdquo;挖&ldquo;出来30%&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; 3、输出略&nbsp;<br />
&nbsp;&nbsp;<br />
<strong>三、柱状图</strong>
<br />
&nbsp;&nbsp; 柱状图的dataset 一般是用CatagoryDataset接口(具体实现类是DefaultCategoryDataset),也会用 IntervalXYDataset<br />
&nbsp;&nbsp; 接口<br />
&nbsp;&nbsp; 1、创建一个数据源（dataset）：<br />
&nbsp;&nbsp;&nbsp; private static CategoryDataset createDataset()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String series1 = &quot;First&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String series2 = &quot;Second&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String series3 = &quot;Third&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String category1 = &quot;Category 1&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String category2 = &quot;Category 2&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String category3 = &quot;Category 3&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String category4 = &quot;Category 4&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String category5 = &quot;Category 5&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(1.0D, series1, category1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(4D, series1, category2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(3D, series1, category3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(5D, series1, category4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(5D, series1, category5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(5D, series2, category1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(7D, series2, category2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(6D, series2, category3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(8D, series2, category4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(4D, series2, category5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(4D, series3, category1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(3D, series3, category2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(2D, series3, category3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(3D, series3, category4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(6D, series3, category5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return defaultcategorydataset;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; 2、由ChartFactory&nbsp; 产生 JFreeChart 对象&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; private static JFreeChart createChart(CategoryDataset categorydataset)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFreeChart jfreechart = ChartFactory.createBarChart(&quot;Bar Chart Demo&quot;, //图形标题名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Category&quot;,//domain 轴 Lable<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里先简单理解为横坐标Lable好了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Value&quot;, //range 轴 Lable<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里也先简单理解为纵坐标Lable好了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; categorydataset, //&nbsp; dataset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PlotOrientation.VERTICAL, //垂直显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true, // legend?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,&nbsp; // tooltips?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false); //URLs?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jfreechart.setBackgroundPaint(Color.white);&nbsp;&nbsp; //设定背景色为白色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">CategoryPlot</span>
 <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
 = jfreechart.get<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">CategoryPlot</span>
(); //获得 plot：<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">CategoryPlot</span>
！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.setDomainGridlinePaint(Color.white); //横坐标网格线白色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.setDomainGridlinesVisible(true); //可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.setRangeGridlinePaint(Color.white); //纵坐标网格线白色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下面两行使纵坐标的最小单位格为整数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberAxis numberaxis = (NumberAxis)<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.getRangeAxis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BarRenderer barrenderer = (BarRenderer)<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.getRenderer(); //获得renderer 注意这里是下嗍造型<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到BarRenderer！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barrenderer.setDrawBarOutline(false); // Bar的外轮廓线不画<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0F, 0.0F, new Color(0, 0, 64));&nbsp;&nbsp; //设定特定颜色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F, Color.green,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0F, 0.0F, new Color(0, 64, 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F, Color.red,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0F, 0.0F, new Color(64, 0, 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barrenderer.setSeriesPaint(0, gradientpaint); //给series1 Bar设定上面定义的颜色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barrenderer.setSeriesPaint(1, gradientpaint1); //给series2 Bar 设定上面定义的颜色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barrenderer.setSeriesPaint(2, gradientpaint2); //给series3 Bar 设定上面定义的颜色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CategoryAxis categoryaxis = <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.getDomainAxis();&nbsp; //横轴上的 Lable 45度倾斜<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return jfreechart;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;<br />
&nbsp;&nbsp;&nbsp; 一些重要的方法：（增加一块标记）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IntervalMarker intervalmarker = new IntervalMarker(4.5D, 7.5D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intervalmarker.setLabel(&quot;Target Range&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intervalmarker.setLabelFont(new Font(&quot;SansSerif&quot;, 2, 11));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intervalmarker.setLabelAnchor(RectangleAnchor.LEFT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intervalmarker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intervalmarker.setPaint(new Color(222, 222, 255, 128));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.addRangeMarker(intervalmarker, Layer.BACKGROUND);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<strong>四、折线图</strong>
<br />
&nbsp;&nbsp; 折线图的dataset 两种CatagoryDataset接口(具体实现类是DefaultCategoryDataset),XYDataset 接口<br />
&nbsp;&nbsp; 1、CatagoryDataset接口：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; A、创建一个数据源（dataset）：<br />
&nbsp;&nbsp;&nbsp; private static CategoryDataset createDataset()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String series1 = &quot;First&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String series2 = &quot;Second&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String series3 = &quot;Third&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String type1 = &quot;Type 1&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String type2 = &quot;Type 2&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String type3 = &quot;Type 3&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String type4 = &quot;Type 4&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String type5 = &quot;Type 5&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String type6 = &quot;Type 6&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String type7 = &quot;Type 7&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String type8 = &quot;Type 8&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(1.0D, series1, type1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(4D, series1, type2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(3D, series1, type3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(5D, series1, type4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(5D, series1, type5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(7D, series1, type6);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(7D, series1, type7);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(8D, series1, type8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(5D, series2, type1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(7D, series2, type2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(6D, series2, type3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(8D, series2, type4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(4D, series2, type5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(4D, series2, type6);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(2D, series2, type7);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(1.0D, series2, type8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(4D, series3, type1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(3D, series3, type2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(2D, series3, type3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(3D, series3, type4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(6D, series3, type5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(3D, series3, type6);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(4D, series3, type7);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultcategorydataset.addValue(3D, series3, type8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return defaultcategorydataset;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; B、由ChartFactory&nbsp; 产生 JFreeChart 对象&nbsp;&nbsp;&nbsp;&nbsp; (与上面重复的部分就不再注释）<br />
&nbsp;&nbsp;&nbsp; private static JFreeChart createChart(CategoryDataset categorydataset)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFreeChart jfreechart = ChartFactory.createLineChart(&quot;Line Chart Demo 1&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Type&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Value&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; categorydataset,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PlotOrientation.VERTICAL,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jfreechart.setBackgroundPaint(Color.white);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">CategoryPlot</span>
 <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
 = (<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">CategoryPlot</span>
)jfreechart.getPlot();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.setBackgroundPaint(Color.lightGray);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.setRangeGridlinePaint(Color.white);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberAxis numberaxis = (NumberAxis)<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.getRangeAxis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; numberaxis.setAutoRangeIncludesZero(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得renderer 注意这里是下嗍造型到lineandshaperenderer！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.getRenderer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lineandshaperenderer.setShapesVisible(true); //series 点（即数据点）可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10F, 6F<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, 0.0F)); //定义series为&quot;First&quot;的（即series1）点之间的连线 ，这里是虚线，默认是直线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6F, 6F<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, 0.0F)); //定义series为&quot;Second&quot;的（即series2）点之间的连线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.0F, 6F<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, 0.0F)); //定义series为&quot;Third&quot;的（即series3）点之间的连线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return jfreechart;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一些重要的方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lineandshaperenderer.setLineVisible(true)&nbsp; //series 点（即数据点）间有连线可见<br />
&nbsp;&nbsp; 2、XYDataset 接口：<br />
&nbsp;&nbsp; A、创建一个数据源（dataset）：<br />
&nbsp;&nbsp;&nbsp; private static XYDataset createDataset()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYSeries xyseries = new XYSeries(&quot;First&quot;); //先产生XYSeries 对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries.add(1.0D, 1.0D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries.add(2D, 4D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries.add(3D, 3D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries.add(4D, 5D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries.add(5D, 5D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries.add(6D, 7D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries.add(7D, 7D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries.add(8D, 8D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYSeries xyseries1 = new XYSeries(&quot;Second&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries1.add(1.0D, 5D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries1.add(2D, 7D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries1.add(3D, 6D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries1.add(4D, 8D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries1.add(5D, 4D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries1.add(6D, 4D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries1.add(7D, 2D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries1.add(8D, 1.0D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYSeries xyseries2 = new XYSeries(&quot;Third&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries2.add(3D, 4D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries2.add(4D, 3D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries2.add(5D, 2D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries2.add(6D, 3D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries2.add(7D, 6D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries2.add(8D, 3D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries2.add(9D, 4D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseries2.add(10D, 3D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYSeriesCollection xyseriescollection = new XYSeriesCollection(); //再用XYSeriesCollection添加入XYSeries 对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseriescollection.addSeries(xyseries);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseriescollection.addSeries(xyseries1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyseriescollection.addSeries(xyseries2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return xyseriescollection;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; B、由ChartFactory&nbsp; 产生 JFreeChart 对象<br />
&nbsp;&nbsp;&nbsp; private static JFreeChart createChart(XYDataset xydataset)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFreeChart jfreechart = ChartFactory.createXYLineChart(&quot;Line Chart Demo 2&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;X&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Y&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xydataset,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PlotOrientation.VERTICAL,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jfreechart.setBackgroundPaint(Color.white);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plot：XYPlot！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //设定坐标轴与图表数据显示部分距离<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setDomainGridlinePaint(Color.white); //网格线颜色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setRangeGridlinePaint(Color.white);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得 renderer 注意这里是XYLineAndShapeRenderer ！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setShapesVisible(true); //数据点可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setShapesFilled(true); //数据点被填充即不是空心点<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return jfreechart;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; 一些重要的方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setSeriesLinesVisible(0, false); //第一个XYSeries数据点间连线不可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setSeriesShapesVisible(1, false); //第二个XYSeries数据点不可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setRenderer(xylineandshaperenderer);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<strong>五、时间序列图</strong>
<br />
&nbsp;&nbsp;&nbsp; 时间序列图和折线图很相似，不同的是它在 domain轴的数据是时间而不是数字。 时间序列图的dataset 是<br />
&nbsp;&nbsp;&nbsp; XYDataset 接口，具体实现类是TimeSeriesCollection ，和上面类似，有TimeSeries 对象，它被添加入<br />
&nbsp;&nbsp;&nbsp; TimeSeriesCollection 。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; 1、创建一个数据源（dataset）：<br />
&nbsp;&nbsp;&nbsp; private static XYDataset createDataset()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeSeries timeseries = new TimeSeries(&quot;L&amp;G European Index Trust&quot;,Month.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(2, 2001), 181.8D);//这里用的是Month.class，同样还有Day.class Year.class 等等<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(3, 2001), 167.3D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(4, 2001), 153.8D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(5, 2001), 167.6D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(6, 2001), 158.8D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(7, 2001), 148.3D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(8, 2001), 153.9D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(9, 2001), 142.7D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(10, 2001), 123.2D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(11, 2001), 131.8D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(12, 2001), 139.6D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(1, 2002), 142.9D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(2, 2002), 138.7D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(3, 2002), 137.3D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(4, 2002), 143.9D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(5, 2002), 139.8D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(6, 2002), 137D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries.add(new Month(7, 2002), 132.8D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeSeries timeseries1 = new TimeSeries(&quot;L&amp;G UK Index Trust&quot;,Month.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(2, 2001), 129.6D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(3, 2001), 123.2D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(4, 2001), 117.2D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(5, 2001), 124.1D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(6, 2001), 122.6D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(7, 2001), 119.2D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(8, 2001), 116.5D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(9, 2001), 112.7D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(10, 2001), 101.5D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(11, 2001), 106.1D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(12, 2001), 110.3D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(1, 2002), 111.7D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(2, 2002), 111D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(3, 2002), 109.6D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(4, 2002), 113.2D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(5, 2002), 111.6D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(6, 2002), 108.8D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseries1.add(new Month(7, 2002), 101.6D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseriescollection.addSeries(timeseries);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseriescollection.addSeries(timeseries1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseriescollection.setDomainIsPointsInTime(true); //domain轴上的刻度点代表的是时间点而不是时间段<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return timeseriescollection;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; 2、由ChartFactory&nbsp; 产生 JFreeChart 对象<br />
&nbsp;&nbsp;&nbsp; private static JFreeChart createChart(XYDataset xydataset)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(&quot;Legal &amp; General Unit Trust Prices&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Date&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Price Per Unit&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xydataset,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jfreechart.setBackgroundPaint(Color.white);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plot : XYPlot!!<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setBackgroundPaint(Color.lightGray);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setDomainGridlinePaint(Color.white);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setRangeGridlinePaint(Color.white);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setDomainCrosshairVisible(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.setRangeCrosshairVisible(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = xyplot.getRenderer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(xyitemrenderer instanceof XYLineAndShapeRenderer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyitemrenderer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setDefaultShapesFilled(true);&nbsp; //数据点是实心点<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //对domain 轴上日期显示格式定义<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dateaxis.setDateFormatOverride(new SimpleDateFormat(&quot;MMM-yyyy&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return jfreechart;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一些重要的方法：<br />
&nbsp;&nbsp;&nbsp;&nbsp; A、增加标记线：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.addRangeMarker(new ValueMarker(550D)); //数值轴<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Quarter quarter = new Quarter(2, 2002);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond()));&nbsp; //时间轴<br />
&nbsp;&nbsp;&nbsp;&nbsp; B、数据点的调整<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setDefaultShapesVisible(true);&nbsp; //数据点可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setSeriesFillPaint(0, Color.red);&nbsp; //数据点填充为红色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setSeriesFillPaint(1, Color.white);&nbsp; //数据点填充为白色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xylineandshaperenderer.setUseFillPaint(true);&nbsp;&nbsp;&nbsp; //应用<br />
&nbsp;&nbsp;&nbsp;&nbsp; C、平均值曲线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个曲线有什么用呢？很简单的例子，这里有一个以半年每天为单位的数据绘制的曲线，我们想看看以月为单位数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的变化，这时就可以用到它了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeSeries timeseries = createEURTimeSeries();&nbsp; //就是以半年每天为单位的数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;30 day moving average&quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30, //30天为一个周期<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30); //最开始的30天跳过<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseriescollection.addSeries(timeseries);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeseriescollection.addSeries(timeseries1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return timeseriescollection;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<strong>六、总结一下</strong>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; plot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; renderer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; 饼图&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PieDataset（DefaultPieDataset）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PiePlot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------<br />
&nbsp; 柱状图&nbsp;&nbsp;&nbsp; CatagoryDataset（DefaultCategoryDataset）&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">CategoryPlot</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BarRenderer<br />
&nbsp; 折线图&nbsp;&nbsp;&nbsp; CatagoryDataset（DefaultCategoryDataset）&nbsp;&nbsp;&nbsp; <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">CategoryPlot</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LineAndShapeRenderer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYDataset（XYSeriesCollection）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYPlot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYLineAndShapeRenderer<br />
&nbsp; 时间序列图&nbsp;&nbsp;&nbsp;&nbsp; XYDataset （TimeSeriesCollection）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYPlot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XYLineAndShapeRenderer<br />
&nbsp; 这里只是一些常用的方法，具体还是看API ,主要的类总结如下：<br />
JFreeChart:生成图表的中间存放类。</p>
<p>CategoryDataSet:图表的数据，主要包含行数据（String[] 类型），列数据(String[] 类型）和主数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (double[][]类型）。一般来说简单的图表主数据都是double[1][]类型的。<br />
ChartFactory:
工厂类，提供多种方法生成多达30多种图表，用得比较多的是BarChart(柱状图),LineChart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
（折线图），PieChart（饼状图）。工厂方法看起来比较统一：creatXXXChart(图表标题，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
行标题，列标题，主数据（CategoryDataSet）)<br />
ChartUtities: 公用类，提供各种持久保存图表数据的方法，比如saveChartAsJPEG(File，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFreeChart,width,height)<br />
其他还有一些渲染类，主要是用来美化图表界面，调整和优化显示风格等。<br />
总的来说还不错，比jasperReport要简单，上手很快，图表效果也还不错，用来做普通数据图表足够了</p>
<p><br />
<strong>七、Item Lable</strong>
<br />
&nbsp;&nbsp; 这里以柱状图为例说明，具体来说就是在每个柱状上显示它的数据，具体有下面内容：<br />
&nbsp;&nbsp; A、使 Item Lable 可见<br />
&nbsp;&nbsp; B、调整 Item Lable 的颜色、字体等<br />
&nbsp;&nbsp; C、调整 Item Lable 的位置<br />
&nbsp;&nbsp; D、定制 Item Lable 的内容<br />
&nbsp;&nbsp; 1、分配一个 Lable Generator 给 renderer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BarRenderer barrenderer = (BarRenderer)<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">categoryplot</span>
.getRenderer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GategoryLableGenerator generator =new StandardGategoryLableGenerator(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;{2}&quot;, new DecimalFormat(&quot;0.00&quot;)&nbsp;&nbsp;&nbsp; //调整显示的数字和字符格式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barrenderer.setLableGenerator(generator);<br />
&nbsp;&nbsp; 2、使 Item Lable 可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barrenderer.setItemLableVisible(true);<br />
&nbsp;&nbsp; 3、调整 Item Lable 的颜色、字体等<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barrenderer.setItemLablePaint(Color.red);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barrenderer.setItemLableFont(new Font(&quot;SansSerif&quot;,Font.PLAIN,10));<br />
&nbsp;&nbsp; 4、调整 Item Lable 的位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里涉及到一个新的对象 ItemLablePosition , ItemLablePosition的构造函数有两个或四个参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ItemLabelPosition(ItemLabelAnchor itemLabelAnchor,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.ui.TextAnchor textAnchor,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.ui.TextAnchor rotationAnchor,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double angle)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; itemLabelAnchor - Item Lable 的位置 （最重要的！！）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textAnchor - Item Lable里包含的正文相对于Item Lable 的位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rotationAnchor - Item Lable里包含的正文旋转的位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; angle - 旋转的角度<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextAnchor.CENTER_RIGHT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextAnchor.CENTER_RIGHT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1.57D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barrenderer.setPositiveItemLabelPosition(itemlabelposition);</p>
          <br/>
          <span style="color:red;">
            <a href="http://rq2-79.javaeye.com/blog/214413#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Jul 2008 22:57:02 +0800</pubDate>
        <link>http://rq2-79.javaeye.com/blog/214413</link>
        <guid>http://rq2-79.javaeye.com/blog/214413</guid>
      </item>
      <item>
        <title>关于SYBASE ASE各个版本的语句监控实现</title>
        <author>rq2_79</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rq2-79.javaeye.com">rq2_79</a>&nbsp;
          链接：<a href="http://rq2-79.javaeye.com/blog/214259" style="color:red;">http://rq2-79.javaeye.com/blog/214259</a>&nbsp;
          发表时间: 2008年07月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="left">众所周知,系统调优很重要的一个方面是应用的调优. 而基于数据库的应用中,最重要的工作之一就是进行SQL语句的调优. SYBASE 
ASE以前的版本中,很难实现语句监控,从而进一步分析,优化相关的语句,也就很难对已经投入生产的应用进行进一步调优. 
ASE12.5.0.3开始,增加了很多的系统监控表,称为MDA table,实际上是一些proxy table. 
通过这些表可以完整地进行了系统监控,包括数据缓存监控,存储过程缓存监控,索引使用监控等,其中非常重要的一个部分是SQL语句的监控,它弥补了以前ASE性能调优重要的一个方面.详细内容大家可以参照sybase的官方文档:http://manuals.sybase.com/onlinebooks/group-as/asg1251c/monitoringzh(ASE12.5.1性能调优之监控下载链接). 
而对于最新的版本ASE15,SYBASE则提供了更为方便的工具.本方档就ASE三种版本就SQL语句监控方法做一个总结.</p>
<p>一: ASE12.5.0.3之前语句监控<br />
<br />
ASE12.5.0.3之前没有MDA监控表,只能通过dbcc 
命令逐个查看当前用户正在执行的语句,这种方法也适用于其它版本:<br />
1&gt; dbcc traceon(3604)<br />
2&gt; go<br />
DBCC 
execution completed. If DBCC printed error messages, contact a user 
with<br />
System Administrator (SA) role.<br />
1&gt; dbcc sqltext(1029)<br />
2&gt; 
go<br />
SQL Text: 
select<br />
btypeid,cname,atypeid,bureauid,deptid,llevel,baseval,range,remark 
from<br />
e_jh_log_btype where (deptid = '1100121' and llevel = 2) or (deptid = 
'0' and<br />
bureauid = '1100' and llevel = 1) or (bureauid = '0' and llevel = 
0)<br />
<br />
DBCC execution completed. If DBCC printed error messages, contact a 
user with<br />
System Administrator (SA) 
role.<br />
<br />
其中1029是用户连接的sid.这种监控的方法能找到某个用户正在执行的语句. 
但这种方法对于希望找出系统中最消耗资源的SQL语句,怕是无能为力. 对于由于不良的SQL语句导致的系统性能低下,DBA简直无能无力.</p>
<p>二: ASE12.5.0.3及以后版本的监控<br />
<br />
ASE12.5.0.3开始,提供了一整套用于系统监控的proxy table. 
默认安装下,这些新的监控表数据库中是没有的,需要执行以下步骤安装,这里假设用户的server名为SYBASE:</p>
<p><br />
1. 增加loopback服务<br />
1&gt;use master<br />
2&gt;go<br />
1&gt;sp_addserver 
loopback, null, SYBASE<br />
2&gt;go</p>
<p><br />
2. 在CMD下,执行脚本installmontables,安装MDA表,这些表会安装在master数据库中.</p>
<p>isql -Usa -P -Ssa -i%SYBASE%ASE-12_5scriptsinstallmontables</p>
<p>3、给sa授权mon_role(监控用户)权限<br />
1&gt;grant role mon_role to sa<br />
2&gt;go</p>
<p><br />
4, 配置相关参数<br />
<br />
用sa登录,配置以下参数:</p>
<p>1&gt;sp_configure 'max SQL text 
monitored',2000<br />
2&gt;go<br />
1&gt;sp_configure 'SQL batch 
capture',1<br />
2&gt;go<br />
1&gt;sp_configure 'sql text pipe max 
messages',30000<br />
2&gt;go<br />
1&gt;sp_configure 'sql text pipe 
active',1<br />
2&gt;go <br />
1&gt;sp_configure 'statement statistics 
active',1<br />
2&gt;go<br />
1&gt;sp_configure 'per object statistics 
active',1<br />
2&gt;go<br />
1&gt;sp_configure 'statement pipe max 
messages',30000<br />
2&gt;go<br />
1&gt;sp_configure 'statement pipe 
active',1<br />
2&gt;go<br />
1&gt;sp_configure 'enable monitoring',1 
<br />
2&gt;go<br />
1&gt;shutdown <br />
2&gt;go<br />
<br />
上述参数中'max SQL text 
monitored'是静态的，配置完后，需要重新启动后才能生效。这些参数的具体含义大家看一下通过上面的链接下载的手册就知道了.其中sp_configure 
'enable 
monitoring',1是启用监控,启用监控对系统的性能会有一定的影响,所以在不需要监控的时候,把它置为0,关闭监控:<br />
sp_configure 
'enable monitoring',0 <br />
go</p>
<p>5. 重新启动后,就可以监控了.<br />
监控语句用会用到四个监控表, monProcessStatement, monProcessSQLText, 
monSysStatement, monSysSQLText:<br />
monProcessStatement: 
提供当前正在执行的语句的信息.<br />
monProcessSQLText: 提供当前正在执行的 SQL 文本.<br />
monSysStatement: 
提供有关最近执行的语句的统计信息. 每次查询后都会被清空.<br />
monSysSQLText: 提供已经执行的最新 SQL 文本或当前正在执行的 SQL 
文本。每次查询后都会被清空.<br />
<br />
监控SQL示例：<br />
<br />
a. 
查看当前正在执行的sql语句的情况,显示逻辑读的多的在前面.可以看到具体的语句及CPUtime, 
WaitTime,MemUsageKB,PhysicalReads,LogicalReads,PagesModified等信息,含义请查看上述手册:</p>
<p><br />
select DBID, S.SPID, T.SequenceInLine, CpuTime, WaitTime, MemUsageKB, 
PhysicalReads, LogicalReads, PagesModified, <br />
SQLText from 
master..monProcessStatement S, master..monProcessSQLText T where S.SPID = T.SPID 
order by LogicalReads desc</p>
<p>用户可以根据需要选择其它的列进行排序,找出当前正在运行的消耗资源的SQL语句.<br />
<br />
b. 
查看最近一段时间内的SQL语句执行情况.<br />
<br />
为方便语句监控,我建立了四个存储过程, 这里假设用户库名中TEST:<br />
<br />
<br />
use 
TEST<br />
go<br />
<br />
/*用来在用户库中中建立两个用来存放monSysStatement,monSysSQLText的固定表 
*/<br />
create procedure sp_monCreate<br />
as<br />
if exists (select 1 from sysobjects 
where name='temp_monSysStatement') <br />
exec ('drop table 
temp_monSysStatement')<br />
<br />
if exists (select 1 from sysobjects where 
name='temp_monSysSQLText') <br />
exec ('drop table temp_monSysSQLText')<br />
select 
* into temp_monSysStatement from master..monSysStatement where 1=2<br />
select * 
into temp_monSysSQLText from master..monSysSQLText where 
1=2<br />
go<br />
<br />
/*生成固定表 */ <br />
exec sp_monCreate<br />
go<br />
<br />
/*清除固定表的数据 */ 
<br />
create procedure sp_monPurge<br />
as<br />
truncate table 
temp_monSysStatement<br />
truncate table 
temp_monSysSQLText<br />
go<br />
<br />
<br />
/*把monSysStatement,monSysSQLText表中的数据保存到两个固定表中 
*/ <br />
create procedure sp_monCollect<br />
as<br />
insert temp_monSysStatement 
select * from master..monSysStatement <br />
insert temp_monSysSQLText select * 
from master..monSysSQLText <br />
go<br />
<br />
/* 
生成语句监控结果,这里按LogicalReads排序,可以按自己的需要调整. 数据库版本在ASE12.5.3之上时,可以在语句前面加上top n, 
得到前几条*/ <br />
create procedure sp_mon<br />
as<br />
select /* top 1000 */ 
DBID,S.SPID,T.SequenceInBatch,CpuTime,WaitTime,MemUsageKB,PhysicalReads,LogicalReads,PagesModified, 
<br />
SQLText from TEST..temp_monSysStatement S,TEST..temp_monSysSQLText T where 
S.SPID=T.SPID and S.BatchID=T.BatchID order by LogicalReads 
desc<br />
go<br />
<br />
监控过程如下:<br />
<br />
(1). 执行sp_monPurge,清除上次监控时留下的数据<br />
(2). 启用监控 
sp_configure 'enable monitoring',1<br />
(3). 
每隔一小段时间(这个时间内系统运行的SQL语句不超过前面设置的'statement pipe max 
messages'值,否则会有语句被清掉,不能监控到.)<br />
(4). 停止监控 sp_configure 'enable 
monitoring',0<br />
(5). 
在系统相对空闲时,生成监控的结果.监控时间长时,两个表中的数据量会很大,生成结果会消耗很多资源,建议在不影响生产的情况下生成. 
同时,监控的SQL语句很多时,建议先在 
temp_monSysStatement,temp_monSysSQLText上分别建立索引(SPID,BatchID). </p>
<p>监控到的语句很长时,结果集中是分多行的,这很容易看出来.(CpuTime,WaitTime,MemUsageKB,PhysicalReads,LogicalReads等完全一样的).<br />
<br />
从上面的过程中可以看出来,通过MDA来进行语句的监控还是有些不方便的,但至少我们有了一个可以进行SQL语句监控,进而进一步分析调优的手段.<br />
<br />
<br />
三. 
ASE15的语句监控<br />
<br />
ASE15的发布已经快有两年的时间了,目前已经在一些生产环境使用. 它在语句监控这方面,确实给用户提供了极大的方便. 
<br />
ASE15中,每一个database中都有一个视图 sysquerymetrics. 
直接通过查询这个视图就可以得到MDA语句监控的结果,而且它对于同样的语句,它自动进行了合并处理,生成执行次数,各项指标的最大值,最小值与平均值,比MDA更加的合理且灵活.<br />
要使用这个视图,需要将参数'enable 
sysmetrics capture'设置为1:<br />
1&gt;sp_configure 'enable sysmetrics 
capture',1<br />
2&gt;go<br />
<br />
同样,使用这个功能对性能会有一定的影响,建议只有需要监控的时候开启,其它时间把它禁止. 
更为严重的是,长时间启用这个功能,这个视图使用到的另外一个表sysqueryplans的cluster索引经常会损坏,我多次在不同的环境中碰到这个问题,导致这个系统表的索引需要重建,并需要重新启动数据库服务.所以建议大家,在不需要SQL语句监控的时候,禁止这个功能. 
如何重建sysqueryplans表的索引,我会另外写一个文档.<br />
<br />
大家看看sysquerymetrics表的列就知道它能帮助我们做什么了,这里也就不再示例了:</p>
<p>列名 数据类型 说明<br />
uid int 用户 ID<br />
gid int 组 ID<br />
hashkey int SQL 
查询文本上的散列键<br />
id int 唯一 ID<br />
sequence smallint null 在 SQL 
文本需要多行的情况下行的序列号<br />
exec_min int null 最短执行时间<br />
exec_max int null 
最长执行时间<br />
exec_avg int null 平均执行时间<br />
elap_min int null 最短经历时间<br />
elap_max int 
null 最长经历时间<br />
elap_avg int null 平均经历时间<br />
lio_min int null 最小逻辑 IO<br />
lio_max 
int null 最大逻辑 IO<br />
lio_avg int null 平均逻辑 IO<br />
pio_min int null 最小物理 
IO<br />
pio_max int null 最大物理 IO<br />
pio_avg int null 平均物理 IO<br />
cnt int null 
已经执行的查询次数<br />
abort_cnt int null 查询由于超过资源限制而被资源管理器 (Resource Governor) 
中止的次数<br />
qtext varchar(255) null 查询文本</p>
<p>此外,ASE15提供了一个存储过程sp_metrics,用来清空,备份sysquerymetrics(实际上是sysqueryplans表).具体见SYBASE官方网站可下载的手册.</p>
<p>从语句监控的三种实现来看, ASE15无疑提供了极为方便的手段,这对SYBASE DBA们来说,无疑是个很好的消息.</p>
          <br/>
          <span style="color:red;">
            <a href="http://rq2-79.javaeye.com/blog/214259#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Jul 2008 20:57:47 +0800</pubDate>
        <link>http://rq2-79.javaeye.com/blog/214259</link>
        <guid>http://rq2-79.javaeye.com/blog/214259</guid>
      </item>
      <item>
        <title>关于sybase数据库的锁</title>
        <author>rq2_79</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rq2-79.javaeye.com">rq2_79</a>&nbsp;
          链接：<a href="http://rq2-79.javaeye.com/blog/214132" style="color:red;">http://rq2-79.javaeye.com/blog/214132</a>&nbsp;
          发表时间: 2008年07月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>您正在看的sybase教程是:关于sybase数据库的锁。<br />
锁类型选择的确是sybase数据库设计的一个需要重要考虑的问题！也是sybase开发和管理人员比较头疼的问题，为此，来点关于lock的介绍性资料！ <br />
<br />
所支持的加锁机制&nbsp;&nbsp;<br />
<br />
 全页加锁 <br />
<br />
　　全页加锁既是一个新术语，它又是由ASE（Adaptive Server Enterprise）在过去所支持的一种加锁类型。这种类型有下列特性： <br />
<br />
对所有可被访问的页面在页面级加锁&nbsp;&nbsp;<br />
当各种类型的页面以任何方式发生改变时，对这些排它性的页面进行加锁；而且这种加锁机制一直保持到该事务终止；&nbsp;&nbsp;<br />
当下一个所需的页面已经成功地获得，对那些已经释放的的当前访问页进行共享页面加锁(如果采用了第三层ANSI隔离，则把这种加锁机制保持到该事务终止为止)&nbsp;&nbsp;<br />
采用页级时间印记（timestamp）以确定是否发生改变，详细信息记录在事务日志中，以便在系统恢复时以向前或向后方式使用。&nbsp;&nbsp;<br />
　　这种加锁方式常常提供性能最高的解决方案，特别是当应用设计时已经考虑了这些特性时更是如此。但是，有一些应用系统，当发生某些活动时，这种对整个页
面进行加锁的方式就可能会对系统性能产生有重大意义的影响。对于那些面对诸如文件系统或其它已经支持更细小尺度加锁机制的数据库厂家产品的一般环境而设计
的应用系统而言，这种情况尤其如此。 <br />
<br />
　　此外，还存在一系列问题，它们要围绕着更加困难的条件进行工作。它们通常要采用更加具有Sybase特性的解决方案。对于商用的应用软件制造厂商而
言，对他们是一个挑战，因为这将要求他们必须跨越他们所支持的数据库平台，去完成维护其原代码的工作，而这个工作有相当工作量。在这个领域的基本问题如
下： <br />
<br />
对已经按照升序值创建的非群聚性索引的最末端叶型页面存在着争议&nbsp;&nbsp;<br />
对非群聚性索引的表进行插入和查询时可能发生死锁；&nbsp;&nbsp;<br />
在按照群聚性的索引值进行更新和对非群聚性索引的表进行查询访问之间可能发生死锁；&nbsp;&nbsp;<br />
在没有作索引的表的最后一行可能发生冲突(尽管对最后的特定地址可以使用分区) ；&nbsp;&nbsp;<br />
有可能使行数很少的表之间发生潜在的冲突(尽管对特定的地址可以使用填充因子[ fillfactors]和每页最大行数[ max_rows_per_page]这两个参数)&nbsp;&nbsp;<br />
对每个页面两边进行加锁的需要常常被分割开来；&nbsp;&nbsp;<br />
如果一个表特别小，以致在一个单一页面中进行驻留，那么对单一行的访问实际上将破坏对整个表的加锁机制。&nbsp;&nbsp;<br />
<br />
 仅对数据加锁 <br />
<br />
　　仅对数据加锁机制试图去解决本文前一节所关注的主要问题(其他的议题将在其它功能领域中加以解决)。这种加锁方式支持两类不同的工作方式：
数据行加锁和数据页加锁。在这两种情况中，对于它们所支持的加锁方式，都与以前的加锁机制有所不同。仅对数据加锁具有下列特性： <br />
<br />
在索引页面中不会破坏事务加锁。相反，而是采用了一种称之为锁存的机制。锁存是一种类似于旋转锁（spinlocks）的同步方法，它们与事务无关并且只
保留很短的周期（一般而言，当一个任务在数据库中物理上改变一小片数据时，这个周期相当于在共享存贮区中在一个2K的页面改变某些字节数据的时间）一旦完
成之后，这个任务将直接打开这个锁存。当这种情况还可能临时同其它组块时
，因为这种锁存不能对服务器任务进行有上下文的切换，也不能涉及死锁，并且只能保持主要的一小段时间，所以它们不能产生有显著意义的争用。&nbsp;&nbsp;<br />
采用一个RID对单一行进行数据行加锁(行标识[RID----Row ID]是逻辑页号与所在页面上该行号的组合)；&nbsp;&nbsp;<br />
支持固定的行标识 RIDs, 它可以是向前的，允许不进行其RID的改变，就完成数据行的移动。当一行变大超过了它的可用空间时，采用上述结果对非群聚索引不需要进行任何改变。&nbsp;&nbsp;<br />
不需要进行任何争用就可以在表的尾部进行插入操作，这一功能已经增加进来。.&nbsp;&nbsp;<br />
支持采用范围加锁、下一个关键字加锁和无限大加锁等方式对逻辑范围值进行加锁&nbsp;&nbsp;<br />
支持由最顶层操作所导致的页面分割。这些情况直接加以提交，&quot;系统&quot;事务可以导致在更短一点的时间周期里保持分裂的页面处于锁定状态。&nbsp;&nbsp;<br />
　　为了支持这些变化，需要对采用的存贮表结构进行一系列改善。这些改进的主要效果如下： <br />
<br />
群聚索引现在被存贮为象许多人所熟悉的IBM DB2产品所采用的&ldquo;放置索引&rdquo;（&quot;placement
indexes.&rdquo;）方式。这种结构类似于非群聚性的索引，需要类似的空间总量。这种修正的结构导致了在数据初始存贮时可以按照顺序跨数据页进行存储，但
是当发生插入时，它们就要尽可能紧密存放以便在正确的逻辑页面中不存在页面分割。此外，在数据页中的数据顺序在新行增加时是不进行维护整理的。这种索引的
应用使每个群聚化的索引周游增加了一次I/O操作。&nbsp;&nbsp;<br />
行位移表已经增加到索引页和数据页中。这种增加和新的行索引行存贮格式具有使每个索引页面所存贮的索引条目个数减少的潜在能力。&nbsp;&nbsp;<br />
固定行标识（RIDS）。当一行移动时，对于分配新行位置的向前地址被放在用于驻留该行的位置上。当这种移动需要改变非群聚性索引时，对该行的访问需要增加一次I/O操作以得到&lsquo;向前&rsquo;的位置。&nbsp;&nbsp;<br />
一般而言，索引将更小和更短，这是因为如下原因：&nbsp;&nbsp;<br />
从每个叶级页面中采用双重键限制机制来限制双重键（Duplicate
key）例如，如果值&ldquo;绿&rdquo;（&quot;GREEN&rdquo;）在下列行标识（RIDs）值等于123-1，234-2，和345-3的行中,
就分别存贮值&ldquo;绿&rdquo;（&quot;GREEN&rdquo;），123-1，234-2，345-3，而不是存贮值&ldquo;绿&rdquo;（&quot;GREEN,&rdquo;）三次。在每个索引页中每个值只存贮
一次。&nbsp;&nbsp;<br />
在非群聚性索引树的非叶型结点中将后缀实行压缩(例如，如果键值是&quot;GREEN&rdquo;和&quot;HAMILTON&rdquo;，而在这两个值之间发生分裂，那么就在非页级索引页面中存储&quot;G&rdquo;和&quot;H&rdquo;)。 <br />
<br />
 数据页和数据行加锁 <br />
<br />
　　只对数据加锁机制支持两种方式：数据页加锁和数据行加锁。这些与它们的工作方式和所提供的功能相类似。这两种方式仅在对数据访问产生阻碍作用时，在加
锁的尺度上有所区别。在数据页加锁方式下再采用数据行加锁方式具有两种作用（一种起正向作用，另一种起反向作用）。首先，较小尺度加锁机制的使用可能导致
减少争用与冲突，然而当大量数据发生变化时，就有可能对加锁产生大量阻碍的情况发生。 <br />
<br />
特定使用的加锁类型 <br />
<br />
　　除非对配置参数加以特定，对所有的表都予置了隐含的全页面加锁机制。 <br />
<br />
sp_configure &lsquo;lock scheme&rsquo;, [allpages | datapages | datarows] <br />
<br />
　　当数据库从原先版本的服务器中转储出来重新加载时，所有的表都被定义为全页面加锁的表。当建立一个新表时，可以不使用这个缺省值，可采用如下的句法格式： <br />
<br />
create table &lt;tablename&gt;&hellip; lock [allpages | datapages | datarows] <br />
<br />
　　为了在使用的一个表中改变加锁类型，可以采用如下的句法格式： <br />
<br />
alter table &lt;tablename&gt; lock [allpages | datapages | datarows] <br />
<br />
　　在一个现存的表中改变加锁方式，将引起下列三种行动后果发生： <br />
<br />
首先，如果一张表从全页加锁转变为仅对数据加锁，或者从仅对数据加锁转变为全页加锁，在这两种类型之间就要对表进行选择以允许进行存贮格式改变。如果这是一个分区表，就要同时假定必要的并行级别和工作线程已经配置好的情况下，才能执行。&nbsp;&nbsp;<br />
其次, 对表中的群聚性索引必须重新创建。因为我们能保证数据，所以如果从全页加锁方式转换为只对数据加锁时，这种重新创建可以通过&quot;with
sorted_data&quot;来完成。然而，当从仅对数据加锁机制转换为全页加锁方式时，就要进行并行的索引创建操作。（请注意：如果这是一个分区表时，那么
并行等级和工作线程的数目必须加以配置才能允许进行这种改变，否则这种迁移将会失败）&nbsp;&nbsp;<br />
最后，非群聚性的索引将被重建，如果服务器已经为并行处理所加以配置，当进行本步骤时将加以采用。&nbsp;&nbsp;<br />
　　由于这些活动同潜在的工作量有关，从全页加锁机制改变为仅对数据加锁或从仅对数据加锁改变为全页加锁机制都可能是耗费时间的活动。为了标注这一点，有以下一些选择： <br />
<br />
如果可能的话，应该配置使用并行方式。这至少对执行非群聚性索引的哈斯（杂凑，即hashed）创建方法是必须的，但是如果可能的话，采用分区表和分区扫描将使系统得到更大的改进。&nbsp;&nbsp;<br />
在选择进入和创建群聚性的索引之后，该任务将被设置检查点（checkpointed
）所以，如果有充分的硬件资源，通过允许在任何一个时间点上，检查点任务可以具有多于10个（系统缺省值）的异步I/O请求，利用dbcc进行调谐将能够
带来有益的效果。(&lsquo;maxwritedes&rsquo;, number)&nbsp;&nbsp;<br />
进一步作为降低使用检查点成本的一种方法，在相关的高速缓冲池（cache
pool）、大数据量的I/O操作中，采用对高淘汰程度进行标记的方法，并允许清洁程序（好象家庭主妇一样）保持特别活跃的状态，将为那些检查点需要从高
速缓冲池中刷新较&ldquo;脏&rdquo;的页面的而增加的I/O操作次数，并因此花费了在检查点上的时间，都能够大大减少作出贡献。&nbsp;&nbsp;<br />
如果预先进行了配置，则可以对并行的选择进入可以使用预先分配的盘区。所以，通过将sp_configure number of pre-allocated extents设置为16也将对系统性能有明显的积极的效果。&nbsp;&nbsp;<br />
　　备注：在仅对数据加锁类型之间进行改变不需要对数据进行备份， 而且执行起来只需很短的一段时间。&nbsp;&nbsp;<br />
[以上为摘自sybase公司站点上的资料]&nbsp;&nbsp;<br />
<br />
据我个人使用经验，我觉得对于并行性较高的应用要充分考虑使用行级锁，这样对于提高并发性能至关重要！当然，事务都存在利弊两方面，使用行级锁，也会带来
一些相应的弊端，比如使用的锁越多，占用的内存也越多，在使用行级锁的表上频繁的进行数据删除、插入操作久而久之会造成数据库碎片的大量生成，数据库性能
会下降，这就需要定时进行reorg操作，但该操作比较耗时，且影响业务！</p>
          <br/>
          <span style="color:red;">
            <a href="http://rq2-79.javaeye.com/blog/214132#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Jul 2008 12:00:29 +0800</pubDate>
        <link>http://rq2-79.javaeye.com/blog/214132</link>
        <guid>http://rq2-79.javaeye.com/blog/214132</guid>
      </item>
      <item>
        <title>Reorg   rebuild   重建表和表上的索引 </title>
        <author>rq2_79</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rq2-79.javaeye.com">rq2_79</a>&nbsp;
          链接：<a href="http://rq2-79.javaeye.com/blog/214129" style="color:red;">http://rq2-79.javaeye.com/blog/214129</a>&nbsp;
          发表时间: 2008年07月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>　回收索引页上分配而未用的空间，删除前推行，或者根据所建聚簇索引（如果存在）重新将表中所有数据行写入新的页，使索引页的物理存放尽可能的连续，提高其访问效率。 &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; 　　例如，长期的表数据更新操作，使得包含索引数据的索引页的物理存放空间出现碎片，如同表的数据页空间碎片整理一样，可以通过该命令重建表上的索引，整理碎片，提高空间的存放和访问效率。 &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; 基本语法： &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; reorg &nbsp; rebuild &nbsp; table_name &nbsp; [index_name] &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; 例一，重建表tb1及其之上的所有索引： &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; 1&gt; &nbsp; reorg &nbsp; rebuild &nbsp; tb1 &nbsp; <br />
 &nbsp; 2&gt; &nbsp; go &nbsp; <br />
 &nbsp; Beginning &nbsp; REORG &nbsp; REBUILD &nbsp; of &nbsp; 'tb1'. &nbsp; <br />
 &nbsp; There &nbsp; are &nbsp; approximately &nbsp; 1 &nbsp; pages &nbsp; to &nbsp; be &nbsp; processed. &nbsp; <br />
 &nbsp; Non-clustered &nbsp; index &nbsp; (index &nbsp; id &nbsp; = &nbsp; 2) &nbsp; is &nbsp; being &nbsp; rebuilt. &nbsp; <br />
 &nbsp; REORG &nbsp; REBUILD &nbsp; of &nbsp; 'tb1' &nbsp; completed. &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; 例二，重建表tb1上的索引tb1_ind： &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; 1&gt; &nbsp; reorg &nbsp; rebuild &nbsp; tb1 &nbsp; tb1_ind &nbsp; <br />
 &nbsp; 2&gt; &nbsp; go &nbsp; <br />
 &nbsp; There &nbsp; are &nbsp; approximately &nbsp; 1 &nbsp; pages &nbsp; to &nbsp; be &nbsp; processed. &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; 注意： &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; 重建索引的表的加锁模式只能是数据页锁（datapages）或数据行锁（datarows），不能是全部页锁（allpages），否则报错： &nbsp;  &nbsp; <br />
 &nbsp; 1&gt; &nbsp; reorg &nbsp; rebuild &nbsp; tb1 &nbsp; <br />
 &nbsp; 2&gt; &nbsp; go &nbsp; <br />
 &nbsp; Msg &nbsp; 11903, &nbsp; Level &nbsp; 16, &nbsp; State &nbsp; 3: &nbsp; <br />
 &nbsp; Line &nbsp; 1: &nbsp; <br />
 &nbsp; You &nbsp; cannot &nbsp; run &nbsp; REORG &nbsp; on &nbsp; a &nbsp; table &nbsp; which &nbsp; uses &nbsp; allpages &nbsp; locking. &nbsp;  &nbsp; <br />
 &nbsp; 重建表上的所有索引，包括可能有的聚簇索引和所有非聚簇索引，或指定某一个具体名字的索引。 &nbsp;  &nbsp; <br />
 &nbsp; 重建索引之前，必须将表对应数据库的选项设置为&ldquo;select &nbsp; into/bulkcopy/pllsort&rdquo;。 &nbsp;  &nbsp; <br />
 &nbsp; 重建索引需要额外的磁盘空间，大小等于表和索引空间之和，可以通过系统存储过程 &nbsp; sp_spaceused &nbsp; table_name[index_name] &nbsp; 查看实际占用空间。 &nbsp;  &nbsp; <br />
 &nbsp; 重建索引以后，在转储数据库事务日志之前，应该转储数据库。 &nbsp;  &nbsp; <br />
 &nbsp; 不能在事务内运行reorg命令。 &nbsp;  &nbsp; <br />
 &nbsp; 不能在文本索引中运行reorg命令，因为在sysindexes中的名字与文本链关联。 &nbsp;  &nbsp; <br />
 &nbsp; Reorg &nbsp; build的应用前提： &nbsp; <br />
 &nbsp;  &nbsp; <br />
 &nbsp; 查询并没有象通常一样选择使用大I/O池，而且optdiag显示出数据页、数据行或索引页的聚簇比很低。 &nbsp;  &nbsp; <br />
&nbsp;使用sp_chgattribute改变了exp_row_size、reserverpagegap或fillfactor空间管理设置中的一项或多项，并想让所有的改变不仅应用于未来数据，还要应用于已有的行和页。</p>
<p>&nbsp;</p>
<p>Sybase数据库的碎片整理 &nbsp;  &nbsp; <br />
 &nbsp;
对于像Sybase这样的大型DBMS系统而言，作为OLTP(联机事务处理)应用的基石，它需要能每天24小时，每年365天不间断运行。由于其应用程
序每天对数据库进行大量的插入、更新、删除等操作，在数据库的物理存储介质上产生了大量存储碎片，从而影响了存储的效率以及数据库应用运行的速度。是否可
以像Windows操作系统的&ldquo;碎片整理&rdquo;程序一样，整理这些碎片，从而优化数据库存储，提高数据库的运行速度呢？答案是肯定的。本文将介绍Sybase
数据库的碎片类型以及碎片整理方法。 &nbsp; &nbsp; <br />
 &nbsp; 碎片类型 &nbsp;  &nbsp; <br />
 &nbsp; 由于Sybase是通过OAM页、分配单元和扩展页来管理数据的，所以对OLTP应用的Database &nbsp; Server会十分频繁地进行数据删除、插入和更新等操作，时间一长就会出现以下几种情况： &nbsp;  &nbsp; <br />
 &nbsp; 1. &nbsp; 页碎片 &nbsp;  &nbsp; <br />
 &nbsp; 即本来可以存放在一个页上的数据却分散地存储在多个页上。如果这些页存储在不同的扩展单元上，Database &nbsp; Server就要访问多个扩展单元，因此降低了系统性能。 &nbsp;  &nbsp; <br />
 &nbsp; 2. &nbsp; 扩展单元碎片 &nbsp;  &nbsp; <br />
 &nbsp; 在堆表中，当删除数据链中间的记录行时，会出现空页。随着空页的累积，扩展单元的利用率也会下降，从而出现扩展单元碎片。带cluster &nbsp; index的table也有可能出现扩展单元碎片。 &nbsp;  &nbsp; <br />
 &nbsp; 当有扩展单元碎片存在，会出现以下问题： &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 对表进行处理时，常常出现死锁； &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 利用较大的I/O操作或增加I/O缓冲区的大小也无法改变较慢的I/O速度； &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 行操作的争用。 &nbsp;  &nbsp; <br />
 &nbsp; 3. &nbsp; 扩展单元遍历 &nbsp;  &nbsp; <br />
&nbsp; 带有cluster &nbsp;
index的table会由于插入记录而导致页分裂，但当删除记录后，页会获得释放，从而形成跨几个扩展单元和分配单元的数据，而要访问该数据就必须遍历
几个扩展单元和分配单元。这将导致访问/查询记录的时间大大延长，开始时数据库的性能虽然较高，但使用一段时间后性能就会下降等问题。 &nbsp; &nbsp; <br />
 &nbsp; 实际上，数据在存储空间上排列得越紧密有序，Database &nbsp; Server访问的速度就越快，消除碎片有助于提高系统的性能和更有效地利用数据存储空间。 &nbsp;  &nbsp; <br />
 &nbsp; 碎片优化方法 &nbsp;  &nbsp; <br />
 &nbsp; 处理碎片有多种方法，如重新定义table的填充因子，根据table的定义删除并重新创建索引、重建表等。 &nbsp;  &nbsp; <br />
 &nbsp; 本文给出的方法是通过BCP实用程序将用户数据库的数据以文本形式导出，然后将用户数据库彻底清空、截断，再将文本数据导入到数据库，从而达到消除碎片的目的，具有通用性。 &nbsp;  &nbsp; <br />
 &nbsp; 下面以Sun &nbsp; Solaris &nbsp; 7操作系统下的Sybase &nbsp; Adaptive &nbsp; Server &nbsp; Enterprise &nbsp; 11.5为例，说明整理数据库数据的具体方法。 &nbsp;  &nbsp; <br />
 &nbsp; 1. &nbsp; 备份数据库 &nbsp;  &nbsp; <br />
 &nbsp; 为防止在数据库碎片整理过程中出现不可预见的问题，有必要先备份数据库。 &nbsp;  &nbsp; <br />
 &nbsp; 2. &nbsp; 创建bcp &nbsp; out脚本并导出数据 &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 创建包含下列SQL语句的文件： &nbsp;  &nbsp; <br />
 &nbsp; cre_bcp_out.sql &nbsp;  &nbsp; <br />
 &nbsp; select &nbsp; &ldquo;bcp&rdquo; &nbsp; + &nbsp; name &nbsp; + &nbsp; &ldquo;out &nbsp; ./&rdquo; &nbsp; + &nbsp; name &nbsp; + &nbsp; &ldquo;_out.txt &nbsp; -Udboname &nbsp; -Pdbopwd &nbsp; -Ssys_name &nbsp; -c&rdquo; &nbsp;  &nbsp; <br />
 &nbsp; from &nbsp; sysobjects &nbsp; where &nbsp; type &nbsp; = &nbsp; &lsquo;U&rsquo; &nbsp;  &nbsp; <br />
 &nbsp; order &nbsp; by &nbsp; name &nbsp;  &nbsp; <br />
 &nbsp; go &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; isql &nbsp; -Udboname &nbsp; -Pdbopwd &nbsp; -Ssystemname &nbsp; &lt; &nbsp; cre_bcp_out. &nbsp; sql &nbsp; &gt; &nbsp; b_out &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 编辑输出文件，去掉文件第一行和最后两行无关的字符：vi &nbsp; b_out &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 执行脚本，将数据库的数据导出到文本文件：sh &nbsp; b_out &nbsp;  &nbsp; <br />
 &nbsp; 3. &nbsp; 创建truncate &nbsp; table脚本并截断数据库 &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 创建包含下列SQL语句的文件： &nbsp;  &nbsp; <br />
 &nbsp; cre_trunc_out.sql &nbsp;  &nbsp; <br />
 &nbsp; select &nbsp; &ldquo;truncate &nbsp; table&rdquo; &nbsp; + &nbsp; name &nbsp; from &nbsp; sysobjects &nbsp; where &nbsp; type &nbsp; = &nbsp; &lsquo;U&rsquo; &nbsp;  &nbsp; <br />
 &nbsp; order &nbsp; by &nbsp; name &nbsp;  &nbsp; <br />
 &nbsp; go &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; isql &nbsp; -Udboname &nbsp; -Pdbopwd &nbsp; -Ssystemname &nbsp; &lt; &nbsp; cre_ &nbsp; trunc_out. &nbsp; sql &nbsp; &gt; &nbsp; trunc_out. &nbsp; sql &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 编辑输出文件，去掉文件第一行和最后两行无关的字符，并在最后一行加入 &nbsp; go构成完整的SQL语句：vi &nbsp; trunc_out &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 执行以下语句，清空数据库的数据： &nbsp;  &nbsp; <br />
 &nbsp; isql &nbsp; -Udboname &nbsp; -Pdbopwd &nbsp; &lt; &nbsp; trunc_out. &nbsp; sql &nbsp;  &nbsp; <br />
 &nbsp; 4. &nbsp; 创建bcp &nbsp; in脚本并导入数据 &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 创建包含下列SQL语句的文件： &nbsp;  &nbsp; <br />
 &nbsp; cre_bcp_in. &nbsp; sql &nbsp;  &nbsp; <br />
&nbsp; select &nbsp; &ldquo;bcp&rdquo; &nbsp; + &nbsp; name &nbsp; + &nbsp; &ldquo;in &nbsp; ./&rdquo; &nbsp; + &nbsp; name &nbsp; + &nbsp; &ldquo;_out.txt
&nbsp; -Udboname &nbsp; -Pdbopwd &nbsp; -Ssys_name &nbsp; -c&rdquo;from &nbsp; sysobjects &nbsp; where &nbsp;
type &nbsp; = &nbsp; &lsquo;U&rsquo; &nbsp; &nbsp; <br />
 &nbsp; order &nbsp; by &nbsp; name &nbsp;  &nbsp; <br />
 &nbsp; go &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; isql &nbsp; -Udboname &nbsp; -Pdbopwd &nbsp; -Ssystemname &nbsp; &lt; &nbsp; cre_ &nbsp; bcp_in. &nbsp; sql &nbsp; &gt; &nbsp; b_in &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 编辑输出文件，去掉文件第一行和最后两行无关的字符：vi &nbsp; b_in &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 从文本中导入数据：sh &nbsp; b_in &nbsp;  &nbsp; <br />
 &nbsp; 5. &nbsp; 更新数据库状态 &nbsp;  &nbsp; <br />
 &nbsp; Sybase不自动维护索引的统计信息，当用truncate &nbsp; table截断数据库时，索引并没有改变，所以必须用update &nbsp; statistics来确保索引的统计信息对应当前表数据的统计。 &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 创建包含下列SQL语句的文件： &nbsp;  &nbsp; <br />
 &nbsp; cre_upd_st. &nbsp; sql &nbsp;  &nbsp; <br />
 &nbsp; select &nbsp; &ldquo;update &nbsp; statistics&rdquo; &nbsp; + &nbsp; name &nbsp; from &nbsp; sysobjects &nbsp; where &nbsp; type &nbsp; = &nbsp; &ldquo;U&rdquo; &nbsp; order &nbsp; by &nbsp; name &nbsp;  &nbsp; <br />
 &nbsp; go &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; isql &nbsp; -Udboname &nbsp; -Pdbopasswd &nbsp; -Ssystemname &nbsp; &lt; &nbsp; cre_upd_st. &nbsp; sql &nbsp; &gt; &nbsp; upd_st. &nbsp; sql &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 编辑输出文件，去掉文件第一行和最后两行无关的字符，在最后一行加入 &nbsp; go构成完整的SQL语句： &nbsp;  &nbsp; <br />
 &nbsp; vi &nbsp; upd_st. &nbsp; sql &nbsp;  &nbsp; <br />
 &nbsp; ● &nbsp; 更新数据库状态： &nbsp;  &nbsp; <br />
 &nbsp; isql &nbsp; -Udboname &nbsp; -Pdbopasswd &nbsp; -Ssystemname &nbsp; &lt; &nbsp; upd_st. &nbsp; sql &nbsp;  &nbsp; <br />
&nbsp;至此，基本上完成了数据库用户表的碎片整理工作。 &nbsp;  &nbsp; <br />
 &nbsp; 小 &nbsp; 结 &nbsp;  &nbsp; <br />
 &nbsp; 在整理过程中，有以下两点需要注意: &nbsp;  &nbsp; <br />
 &nbsp; 1. &nbsp; Tempdb的大小 &nbsp;  &nbsp; <br />
&nbsp; 当Sybase执行bcp &nbsp;
in脚本时，会占用导入数据2倍的tempdb空间，因此在执行前要仔细估计最大的table的大小，保证有足够的tempdb空间。当空间不够时，要考
虑用分割table或删除陈旧数据的方法缩小table的大小，或者考虑增加tempdb的大小。 &nbsp; &nbsp; <br />
 &nbsp; 2. &nbsp; 数据库配置选项的设置 &nbsp;  &nbsp; <br />
 &nbsp; 当数据库执行bcp &nbsp; in脚本时会产生大量的log，为保证bcp &nbsp; in进程不致因为log溢出而中断，应该设置database的选项&ldquo;truncate &nbsp; log &nbsp; on &nbsp; chkpt&rdquo;为&ldquo;true&rdquo;。 &nbsp;  &nbsp; <br />
 &nbsp; 虽然Sybase数据库是自优化的，但只要数据库是动态的，数据库碎片现象就会存在。在OLTP应用的场合，随着数据的不断增大，系统变得越来越缓慢，并且经常出现死锁时，应该检查数据库的碎片，并且采用以上方法进行优化。 &nbsp;  &nbsp; <br />
 &nbsp; 实际上，应该定期做数据库的碎片整理，保证数据库的物理存储经常处于</p>
          <br/>
          <span style="color:red;">
            <a href="http://rq2-79.javaeye.com/blog/214129#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Jul 2008 11:45:20 +0800</pubDate>
        <link>http://rq2-79.javaeye.com/blog/214129</link>
        <guid>http://rq2-79.javaeye.com/blog/214129</guid>
      </item>
      <item>
        <title>sybase备份与恢复及sybase常用语句</title>
        <author>rq2_79</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rq2-79.javaeye.com">rq2_79</a>&nbsp;
          链接：<a href="http://rq2-79.javaeye.com/blog/213549" style="color:red;">http://rq2-79.javaeye.com/blog/213549</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          