杜娟's profile娟娟的糖果屋PhotosBlogListsMore ![]() | Help |
|
October 23 用JFreeChart画统计分析柱状图我们介绍使用 JFreeChart 生成柱状图,首先从一个最简单的例子开始。 一 最简单的例子 为了降低门槛,让大家心理有个底,先介绍一个简单的不能再简单的例子,图片中的各类属性都采用默认值。 <%@ page contentType="text/html;charset=GBK"%> <%@ page import="org.jfree.chart.ChartFactory, org.jfree.chart.JFreeChart, org.jfree.chart.plot.PlotOrientation, org.jfree.chart.servlet.ServletUtilities, org.jfree.data.DefaultCategoryDataset"%> <% DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(300, "广州", "苹果"); dataset.addValue(200, "广州", "梨子"); dataset.addValue(500, "广州", "葡萄"); dataset.addValue(340, "广州", "芒果"); dataset.addValue(280, "广州", "荔枝"); JFreeChart chart = ChartFactory.createBarChart3D("水果销量统计图","水果","销量",dataset,PlotOrientation.VERTICAL,false,false,false); String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; %> <IMG height=300 src="<%= graphURL %>" width=500 useMap="#<%= filename %>" border=0> 这个 JSP 程序运行的结果如下图 二 柱状图高级特性
double[][] data = new double[][] {{672, 766, 223, 540, 126}, {325, 521, 210, 340, 106}, {332, 256, 523, 240, 526} }; String[] rowKeys = {"苹果","梨子","葡萄"}; String[] columnKeys = {"北京","上海","广州","成都","深圳"}; CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data); 用上面的 dataset 生成的 3D 柱状图
上面代码产生的效果如下图,注意与图二的区别。
BarRenderer3D renderer = new BarRenderer3D(); renderer.setBaseOutlinePaint(Color.BLACK); //设置 Wall 的颜色 renderer.setWallPaint(Color.gray); //设置每种水果代表的柱的颜色 renderer.setSeriesPaint(0, new Color(0, 0, 255)); renderer.setSeriesPaint(1, new Color(0, 100, 255)); renderer.setSeriesPaint(2, Color.GREEN); //设置每种水果代表的柱的 Outline 颜色 renderer.setSeriesOutlinePaint(0, Color.BLACK); renderer.setSeriesOutlinePaint(1, Color.BLACK); renderer.setSeriesOutlinePaint(2, Color.BLACK); //设置每个地区所包含的平行柱的之间距离 renderer.setItemMargin(0.1); //显示每个柱的数值,并修改该数值的字体属性 renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12)); renderer.setItemLabelsVisible(true); 上面代码产生的效果如下图,注意与图二的区别。
//设置地区、销量的显示位置 plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT); plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); 上面代码产生的效果如下图,注意与图二的区别。
图 七 三 总结我只介绍了少量的方法,更多的请参考 JFreeChart 的 Java Doc API 文档和 Sample Code。 初识 JMS [转] 自己搞了J2EE这么久,EJB/JNDI/RMI/JTA这些都了解的七七八八。但是,对于JMS这个东东,只听说在EJB的消息bean中有用到过,一直以来俺都敬而远之。最近公司要做一个国外的外包项目,里头有涉及到JMS的技术,现在只能临时抱佛脚。互联网上关于JMS的文章少之又少,没办法,只有自力更生,硬是查看了SUN的官方技术API文档,也算是初步揭开JMS这个神秘的面纱吧。 此外,JMS可以在不同的域对象之间实现以下两种方式的消息传输机制:PTP(Point-to-Porint)和Pub/Sub(Publish-and-Subscribe),这两种方式可以并存于同一个应用之中。PTP是点对点传输消息,建立在消息队列的基础上,每个客户端对应一个消息队列,客户端发送消息到对方的消息队列中,从自己的消息队列读取消息。 Pub/Sub是将消息定位到某个层次结构栏目的节点上,Pub/Sub通常是匿名的并能够动态发布消息,Pub/Sub必须保证某个节点的所有发布者(Publisher)发布的信息准区无误地发送到这个节点的所有消息订阅者(Subscriber)。 我们不需要仔细去了解这两种方式的意义,JMS在此提供了一个更加统一的实现方式,该方式主要有以下几个接口:ConnectionFactory、Connection、Destination、Session(消息交互线程的上下文环境)、MessageProducer(消息的发送者)、MessageConsumer(消息的接收者)。 使用JMS API不仅使通信变得松散耦合,而且它还使通信变得: 以上的消息接收端成功的接收了一条消息,如果我们要监控JMS消息的接收事件,需要在第7步之前,声明一个实现了MessageListener接口的对象: 离线状态下,解析XML出错 [转]在最近的一个项目中,我用到Dom4j去解析现有的Spring2.0中的bean节点,从中获取一些公用的属性信息。 java 代码
org.dom4j.DocumentException: http://www.springframework.org/ Nested exception: http://www.springframework.org/ 看错误的提示,应该是说现在电脑无法找到一个http://www.springframework.org/ 的网络主机。 仔细察看一下Spring的配置文件头,里面有如下的一个头文件注释:
xml 代码
问题就出现在这里!xmlReader.read 读取Spring配置文件的时候报错。 所以,我们需要替换掉这里的http://www.springframework.org/ 为一个本地的dtd文件。如何替换呢? 可以考虑将这里的http:///协议的路径改为一个file:/// 方式的本地文件,但是这样路径就指定死了,不便于程序移植。 另外一种方案就是,为这里的xmlReader添加一个EntiyResolver: java 代码
这样,每一次的xmlReader调用时,dom4j首先就会去从本地的classpath下面去寻找一个相应的dtd去处理,问题也就迎刃而解了。 可能有人有另外的疑问了,为什么Spring本身解析xml没有出现过这个错误呢? 其实Spring会首先在本地的固定路径中寻找spring-beans-2.0.dtd文件(具体在spring-beans.jar包中的com.springframework.beans.factory.xml路径下),如果找不到,然后才会参照DOCTYPE中的地址去寻找。 October 18 再述oracle数据库体系结构 之二:逻辑结构 [转]第六篇 再述oracle数据库体系结构 之二:逻辑结构 一、表空间 2.表空间的特性 3.临时表空间 二、段 2.索引段 3.回退段 4.临时段 三、区 四、数据块 五、模式对象 再述oracle数据库体系结构 之一:物理结构 [转]在一个服务器中,每一个运行的数据库都有一个数据库实例(instancename) 相联系。数据库启动时,系统首先在服务器内存中分配系统全局区(SGA),即构成了oracle的内存结构。然后启动若干个常驻内存的操作系统进程,即组成了oracle的进程结构。除此之外,还有数据库的物理与逻辑结构。数据库体系统结构图可以参考第一篇。在接下来的篇幅中将分五篇来详细说明oracle数据库的体系结构。
因为我的学习路线与学任何东西一样,分四个阶段,先需了解总体结构和原理,然后再进一步型清楚他们,第三再分块理解吸收,最后再综合提升。当然动手做试验须贯穿始终。 本篇说明物理结构。 物理结构,即oracle数据库使用的操作系统文件结构。对于数据库物理结构文件,不同的oracle版本,不同的操作系统平台上有不同的存储目录结构。
数据库的物理结构文件按其作用可以分为三类:
一、数据文件 数据文件用来存储数据库的数据,如表、索引等。读取数据时,系统首先从数据库文件中读取数据,并存储到SGA的数据缓冲区中。这是为了减少I/O,如果读取数据时,缓冲区中已经有要读取的数据,就不需要再从磁盘中读取了。存储数据时也是一样,事务提交时改变的数据先存储到内存缓冲区中,再由oracle后台进程DBWR决定如何将其写入到数据文件中。 1.查询数据文件的信息 sql>select * from dba_data_files或 sql>select * from v$datafile(此数据字典包含文件的动态信息) 一个数据文件只与一个数据库相联系。数据文件的大小是可以改变的。可以通过以下语句查询表空间的空间空闲量 sql>select * from dba_free_space 2.修改数据文件的大小 sql>alter database datafile "d:\...\df1.dbf" resize 800m 3.数据库文件的自动扩展特性。请看下面的例子: sql>alter tablespace tbs1 add datafile "d:\...\df2.dbf" size 500m autoextend on next 50m maxsize 1000m sql>alter database mydb1 datafile "d:\...\df2.dbf","d:\...\df3.dbf" autoexetend off sql>alter database mydb1 datafile "d:\...\df2.dbf","d:\...\df3.dbf" autoexetend on next 30m maxsize unlimited 二、重做日志文件 重做日志文件记录对数据库的所有修改信息。它是三类文件中最复杂的一类文件,也是保证数据库安全与数据库备份与恢复有直接关系的文件。 1.日志文件组与日志成员 在每一个oracle数据库中,至少有两个重做日志文件组。每组有一个个或多个重做日志文件,即日志成员。同一组中的成员是镜像关系,它们存储的内容是一模一样的。oracle在写日志时,以一个日志组为逻辑单位写入,只在将日志都写入日志组中的每个成员文件中后,写日志才完成。 2.日志工作原理 oracle有多个日志文件组,当一个日志文件组中所有的成员所有的成员同时被写满数据时,系统自动转换到下一个日志文件组,这个转换过程称为日志切换。 当日志切换后,会给前一个日志组编一个号,用于归档日志的编号,这个编号称为日志序列号。此编号由1开始,每切换一次,序列号自动加1,最大值受参数MAXLOGHISTORY限制,该参数的最大值为65534。 当oracle把最后一个日志组写满了以后,自动转向第一个日志组,这时,再向第一个日志组写日志的时候,如果数据库运行在非归档模式下,这个日志组中的原有日志信息就会被覆盖。 使用以下语句查询日志文件信息: sql>select * from v$log 相关字段说明如下: GROUP#:日志文件组号 THREAD#:日志文件线程号,一般为1,双机容时为2 SEQUENCE#:日志序列号 BYTES:日志文件大小 MEMBERS:该组的日志成员个数 ARC:该组日志信息是否已经完成归档 STATUS:该组状态(CURRENT:表示当前正在使用的组;NACTIVE:表示非活动组;ACTIVE:表示归档未完成) FIRST_CHANGE#:系统改变号SCN,也叫检查点号 FIRST_TIME:系统改变时间 DBA可以使用下列命令进行强制日志切换 sql>alter system switch logfile 3.NOARCHIVELOG/ARCHIVELOG NOARCHIVELOG是非归档模式,如果数据库运行在这种模式下,当日志切换时,新切换到的日志组中的日志信息会被覆盖。ARCHIVELOG:归档模式,如果数据库运行在这种模式下,日志会被归档存储,产生归档日志,且在未归档之前,日志不允许被覆盖写入。 要确认数据库的归档方式,可以查询数据字典v$database: sql>select log_mode from v$database 要了解归档日志的信息,可以查询数据字典v$archived_log。 要将数据库改为归档模式: a.alter database archivelog b.设置初始化参数LOG_ARCHIVE_START=TRUE c.设置归档文件目标存储路径 LOG_ARCHIVE_DEST=C:\ORA\ARCHIVE d.设置归档文件命名格式参数 LOG_ARCHIVE_FORMAT="ORCK%T%S.ARC"。这个格式中的%S表示日志序列号,自动左边补零;%s表示日志序列号,自动左边不补零;%T表示日志线程号,左边补零;%t表示日志线程号不补零。 e.重新启动数据库 4.CKPT进程(检查点进程) CKPT进程保证有修改过的数据库缓冲区中的数据都被写入到数据文件,日志文件、数据文件、数据库头和控制文件中都有写入检查点标记。数据库在恢复时,只需提供自上一个检查以来所做的修改。检查点完成时系统将更新数据库数据库头和控制文件。 参数LOG_CHECKPOINT_TIMEOUT决定一个检查点发生的时间间隔。LOG_CHECKPOINT_INTERVAL决定一个检查需要填充的日志文件块的数量。检查点号,也称系统改变号(SCN),它标识一个检查点。可以通过v$log查询日志文件的检查点信息,通过v$datafile查询数据文件的检查点信息,通过v$database查询数据库头的检查点信息。三个地方的检查点号相同,如果不同,说明发明数据库不同步,此时数据库肯定无法正常启动。 5.增加与删除日志文件组、日志成员(详细语法请参考oracle文档) alter database [database] add logfile [group integer] filespec[,[group... alter database [database] add logfile (...) alter database [database] drop logfile [grout integer] alter database [database] add logfile member "filespec" [reuse] to group integer alter database [database] drop logfile member "filename","filename"... alter database [database] rename file "filename" to "filename" 6.清除日志文件数据 alter database [database] clear [unarchived] logfile group integer|filespec
三、控制文件 控制文件是一个二进制文件,用来描述数据库的物理结构,一个数据库只需要一个控制文件,控制文件的内容包括:
控制文件由参数control_files指定,格式如下: control_files=("home/app/.../control01.ctl","home/app/.../control02.ctl") 参数中各个文件是镜像关系,也就是说,几个文件中只要有一个文件完好,数据库就可以正常运行。 以下语句查询控制文件的信息: sql>select * from v$controlfile 如果控制文件损坏或丢失,数据库将终止并且无法启动,所以,要对控制文件进行镜象,手工镜像步骤如下: a.关闭数据库 b.复制控制文件 c.修改参数文件,加入新增的控制文件位置描述 d.重新启动数据库 另外注意,控制文件中还包含几个服务器参数的设置,如果修改这些参数的值,刚需要重新创建控制文件,这些参数是:
所有修改数据库结构的命令都会引起控制文件的改变。同时出会记录在oracle跟踪文件中,跟踪文件的名称为alter_SID.log,路径如下: d:\oracle\product\10.1.0\admin\DB_NAME\bdump\SIDALRT.log(unix是alter_SID.ora) 也可以在参数文件中指定跟踪文件的存储路径,后台进程跟踪文件目录由参数background_dump_dest指定,用户跟踪文件位置由参数user_bdump_dest指定,如: background_bdump_dest=/u01/app/oracle/oralog/bdump user_bdump_dest=/u01/app//oralog/udump |
|
|