关于作者

姓名:独自漫步

性别:男

出生日期:1985-9-6

地区:www.henu.edu.cn

联系电话:

QQ:--

婚否:保密
用户名:neinc
笔名:桃园之后
地区: www.henu.edu.cn
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言


朋友

来客纪录

访问统计:
文章个数:17
评论个数:15
留言条数:1




Powered by BlogDriver 2.1

坚守信念

 

欢迎访问我的博客!此博客以自娱为主,希望能够与大家有所交流,如文章有何不适及对文章有何看法请与我联系,任何问题我都将在第一时间回复。文章未注明原创则为转载,不代表本人观点。

文章

NET命令的另类用法
    在一次维护网络的时候,偶然发现Windows XP操作系统中的NET系列命令中多了一个Net User命令。经过仔细推敲和演练发现Net User不仅可以用来添加或修改用户或者显示用户信息,还可以对用户设置不同的限制,比控制面板中的“用户账户”的应用效果要好的多,大家不妨试试。
  Net User命令是一个DOS命令,必须在Windows XP下的MS-DOS模式下运行,所以首先要进入MS-DOS模式:选择“开始”菜单的“附件”选项的子选项“命令提示符”,或在“开始”菜单“运行”选项(快捷键为Win+R)中输入“cmd.exe”,进入MS-DOS模式。以下功能都基于此模式下。

  建立一个普通新用户

  在MS-DOS提示符中输入如下命令:“net user john 123 /add”,回车。即可新建一个名为"John",密码为“123”的新用户。Add参数表示新建用户。
值得注意的是:用户名最多可有 20 个字符,密码最多可有 127 个字符。

  建立一个登录时间受限制的用户

  用以下方法可实现对电脑使用时间的控制。比如,需要建立一个John的用户账号,密码为“123”,登录权限从星期一到星期五的早上八点到晚上十点和双休日的晚上七点到晚上九点。

  1. 12小时制可键入如下命令:“net user john 123 /add /times:monday-friday,8AM-10PM;saturday-sunday,7PM-9PM”,回车确定即可。

  2. 24小时制可键入如下命令:“net user john 123 /add /times:M-F,8:00-22:00;Sa-Su,19:00-21:00”,回车确定即可。

  值得注意的是:Time的增加值限制为1小时。对于Day值,可以用全称或缩写(即 M、T、W、Th、F、Sa、Su)。可以使用12小时或24小时时间表示法。对于12小时表示法,请使用AM、PM或A.M.、P.M.。All值表示用户始终可以登录;空值(空白)意味着用户永远不能登录。用逗号分隔日期和时间,用分号分隔日期和时间单元(例如,M,4AM-5PM;T,1PM-3PM)。指定时间时不要使用空格。

  另外,Passwordchg:{yes | no}参数可用来指定用户是否可以更改自己的密码,默认设置为 Yes。

- 作者: 桃园之后 2007年03月28日, 星期三 18:22  回复(0) |  引用(0) 加入博采

递归实现Hanoi塔问题

//自己写着玩的,其实一点意思也没有

#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
 
int c=0;

void move(char x,int n,char z)
{
// printf("%i.move disk %i from %c to %c\n",++c,n,x,z);
 cout<<++c<<" move disk "<<n<<" from "<<x<<" to "<<z;
 cout<<endl;


void hanoi(int n,char x,char y,char z)
{
 if(n==1)
  move(x,1,z);
 else
 {
  hanoi(n-1,x,y,z);
  move(x,n,z);
  hanoi(n-1,y,x,z);
 }
}

void main()
{
 int n=0;
 char a,b,c;
 printf("%s","please input one digit and three char\n");
 scanf("%d,%c,%c,%c",&n,&a,&b,&c);
 hanoi(n,a,b,c);
}

- 作者: NEINC 2006年11月27日, 星期一 20:35  回复(0) |  引用(0) 加入博采

我的第一次面试

 
  今天在东软的面试终于彻底结束了!
虽然最终结果明天才能出来,但不论结果如何,在东软的面试注定只能成为我锻炼的一次机会。
人的第一次总是让人发出许多感慨,无论是成功还是失败。
回想起在东软面试的经历,一下子就让我明白了很多。

九月一号
  刚回到学校几天,就已经听说东软要到我们院来招人了,当时有点惊讶,没有想到这么快就来了,还以为十一以后才开始呢!但是没有怎么注意,因为没有想到要到一个公司去,我当时还一心一意想考国家公务员来着,但是觉得这是一个不错的机会,能参加的话,一定去试一试。
九月四号
  今天正式开学了,下午接到通知,五号晚上7:00院103教室举行东软笔试,辅导员说希望大家都去看一看,因为东软也是一个很不错的IT企业,而且第一次到我们学校来,希望大家要给别人一个好印象。
  晚上我和老喻早早来到103,等待东软的笔试。其实我们院绝大部分人都是打算来考研的,来笔试的,都是考研决心不是很坚决的,而那些考研决心很坚决的,学习超棒的,根本就没有来。但是来的人不算少吧,来了200多人,占毕业生总人数的二分之一了,居然还有几个04级的!
  七点多的时候,投影仪、扩音器等等终于什么都准备好了,人也来了,30岁左右吧,相貌平平。来人自称徐老师,他解释说因为东软是东北大学的,所以东软称呼上司一律为老师,还算比较有特色。
  然后就开始先做宣传了,这人演讲水平不怎么样,太普通了,没有激情,或者根本说就是差,开始半天不说一个字,一开口讲的有点不自信的样子,反正很不好,接下来就是照本宣科了,看着幻灯片说。真不知道东软咋找这样的人做宣传,难道不知道这样会影响形象么?不用说,下面的听众情绪很不高,当时就有人离开了。
  但总算听明白了,不欢迎考研的同学,考东北大学和东软PL班的除外(东北大学计算机那么牛,谁敢考啊,我现在也不知道PL班是什么,估计也是研究生班吧),先笔试,后面试,然后确定录用后先在本校由专人进行培训,然后明年直接进入公司,很可能去大连。呀,一听说去大连,我太兴奋了,整个中国让我梦寐以求的地方也就是青岛和大连,这两个地方不仅气候环境好,软件业也很发达,又靠近大海,这不正是我的理想么?
  如果我没有改变注意打算考研的话,我相信如果东软选择我,我一定会去的!
  宣传完毕,那位徐老师告诉大家明天晚上7:00在这个地方举行笔试,希望大家都能参加,他还说即使打算考研也可以参加笔试和面试,只要不签合同就行,我当时认为他肯定看到我们情绪不高,害怕明天笔试人太少,所以想让我们都参加笔试,后来发现他是高明的,本来有的同学下定决心考研的,后来都一心一意想进东软了。
  然后他就问我们是否有问题提问,啊,场面很尴尬,没有一个人提问,然后老喻问我不知道他准备招多少人,干脆我就站起来提问:“徐经理,你好,请问你准备在我们学校招多少人啊?”。他说二三十个左右,但是他觉得如果我们很优秀的,他会多招的。
接下来开始有人提问了几个问题,就结束了。

九月五号
  晚上7:00,老早在103等好了,来的人还不少,120多人,然后那个徐经理和辅导员就搂了两摞试卷过来,一摞试题,一摞填写个人资料。考试之前,辅导员特别叮嘱,不要作弊,呵呵,搞笑。
  添完个人资料,就开始做题了。啊,这题还是很有个性的,第一大题是分析数字测智商的,第二大题分辨图形测反应速度,第三大题数学,第四大题专业课,第五大题职商(孤陋寡闻,以前没有听说过),第六大题专业英语。
  考的我很崩溃,第一大题有的不会做,第二大题看的我眼睛好疼,第三题我蒙了三个选择,计算题根本不会(就这还想考研?),第四题我还有点自信,第五题没有分数,想怎么选就怎么选,第六题英译汉还行,汉译英就快给我累坏了。
  到交卷的时候我根本没有写完,但不管了,交上得了!
  接下来就是等待了,漫长的等待!

九月十四号
  晚上在考研自习教室,团支书让我把东软录取名单中咱班男生名单抄下来。
  还好,有我,考了70分,第一名叫屈世富,80分,真没有想到,还凑合吧。这一轮刷掉了一半,录了63个参加面试,我们班就有22个,应该是最多的了。

九月十五号
  本来说早晨十点开始面试,但不知道为什么耽误了,下午才三点开始。面试前发下上次考试成绩单,第二题还不错,数学三个选择题都蒙对了,英语最好,差点满分,其他都一般。
  面试分单双号,单号到三楼,双号到四楼,一个人大约20多分钟吧,很慢,先面试的回来说很简单,就一个人面试,就是问问JAVA和数据库知识。五点的时候,我和一个女孩上三楼去了,她居然是个04级的,她先进去,五点25的时候才出来,然后我就敲门进去了。里面一个矮矮的有点胖的人,一个笔记本,他很客气的让我坐在他旁边,很和蔼,真好,我一点也不感到拘束,后来我跟我女朋友说,考官就应该这样。
  我把自己的笔试成绩单给他看,他就问我,六级过了吗,我说,过了,英语竞赛三等奖,我说,是的,他说,那你听力怎么样,我说,还行吧,他就说,那口语应该也不错吧,我说,这个不太清除,本来打算参加口语考试的,忙其他的,没有来得及参加,他就笑着说,那肯定不错。我就想,这个人真奇怪,我口语根本就不好,我女朋友就说我口语差。他接着问我JAVA,我说我JAVA还行吧,因为大一没有学好C++,所以后来拼了命的学JAVA,考试拿了全班第一名。他就问我,考了多少分,我说考了98分(其实我记错了,是96分),他很惊讶,也很高兴,又问我有没有做过项目,我说,做过,一个教务管理系统,用JBuilder做的,是本地应用程序,有学生、教师、排课管理等等。他又问,几个人做的,你担任组长吗?我说,四个人做的,我担任组长。他问,你主要干什么呢,我说,我承担绝大部分代码编写。他很高兴,又问我平时怎么了解新技术,我说,我喜欢看电脑报和计算机世界,还有其他的计算机杂志,当然也通过网络。他说,挺不错的,你对日本态度怎么样?我之前听过东软的大部分业务是日本的,我就说,虽然整体上,舆论反日情绪严重,但应该就事论事,不能一概而论。他点点头,又问,你考研吗?我说,未有此打算。呵呵,这是我惟一的一句谎话,其实我是要考的。他就说,很好,挺不错的,就这样吧,你先会去吧。我出来一看表,天啊,整个面试还不到五分钟!心里真有点发毛,不会被刷了吧!
  出来一问他们为什么面试了那么长时间,原来那个考官问他们JAVA基础知识来着,而他根本没有问我,后来我跟我女朋友说,她说,大概是怕他自己JAVA没有你好吧。呵呵,我估计他也饿了,也想早点结束吧。
  然后就听说二十号举行第二轮面试,好麻烦!

九月二十号
  老早等着,突然通知,明天面试,毛病!

九月二十一号
  第一轮面试出来了,初步确定录用了30个,外加还要考察的10个,我在被录用之列,好高兴啊!十一点二十开始面试,我是下午一点开始第二轮面试,中午回去吃饭,然后跟女朋友说了一下,就征求她的意见,她要说那你去吧,我也许就打定主意走了。没有想到她居然哭了起来,弄的我比她还难受,就下定决心不和东软签合同了。
  刚到教室,辅导员就告诉我说,轮到我了,才知道是小组发言式面试,七个人一组。于是我就和他们一块上去了,有一个女生。考官也是河南的,是人力资源部的,相貌平平,但能力还不错吧,也很和蔼。然后我们就开始做自我介绍,他们都表达了打定主意去东软的意向,轮到我的时候我就说,我比较喜欢大连,环境优美,很适合人生活。我说的时候很轻松,因为没有压力。然后考官说,可能不去大连,我说,去沈阳是吗?沈阳也好啊,有世博会呢?考官居然说我比较活泼,不知道是夸还是贬。反正听其他人说觉得有些人比我牛多了,都在实验室待了两三年了,遗憾,我没有进实验室,当然不是因为进不去。
  考官又说了一些话吧,工资最高开到3000,好心动啊!
  面试完我就给女朋友打电话,跟她说我不去。然后我就直接回宿舍了,懒得看结果。
  晚上11点多,才知道结果早出来了,我被录取了,我们班录取了11个,一共29个,我们班比较多吧。我当时就说我不去了,他们就说我不拉屎还占茅坑,我说难道那十个都去吗,结果很让我吃惊,他们都去,唯独我。那十个其中有很牛的人,有下定决心考研的,真没有想到!
  体育委员告诉我说,不想签合同的话,明天亲自和辅导员解释。
九月二十二号
  过一会就去和辅导员解释了,其实没有啥说的,不就不去呗。
  我和东软也就此告一段落了。

- 作者: NEINC 2006年09月21日, 星期四 20:52  回复(0) |  引用(0) 加入博采

百度,赶上!
 
        “众里寻她千百度,蓦然回首,那人却在灯火阑珊处”。 ------李彦宏以此为他的搜索命名。 

   无论怎么说,我对百度的影响都非常好,甚至于对google的赞扬我都很难以容忍。从感情上说,我非常喜欢百度,首先因为她的国产的,对于国产的东西我一向很支持,更何况是代表着高科技的互连网产业。当然我首次接触“搜索”用的也是百度,从那以后我再也没有离开过搜索,没有离开过百度。每次用到搜索的时候用到的当然是百度。
   百度在市场上的表现也没有令人失望,她占据着中国搜索的半壁江山,即使面队世界上最强大的对手google,她也表现相当的令人出色。google在世界上的其他地方也许正如Microsoft一样可以横扫全球,但偏偏在中国却不得不屈于百度之下。正因为如此,提到百度,我们甚至会有一种自豪感,这不仅仅是百度的胜利,也是中国的胜利!
   然而我们不能仅仅用感情来决定人们使用哪个搜索的权利,使用搜索是为了得到准确而详细的信息。也许我使用的最多的百度,但我们必须承认在很多方面,google比百度做的要好的多。
   拿地图搜索做个比较,我们就可以惊讶的发现,google能提供比百度详细很多的资料,虽然google是外国公司,然而它所提供的信息的详细程度却超过了百度,在信息的精确度上,无疑百度并不比google好。
   我用过百度和google的硬盘搜索(google为桌面搜索),相比之下,百度明显处于下风,无论是功能多少还是界面选择上。当然百度的并非无可圈可点之处,她的文件分类就要比google的好,当然对于我来说也更实用,所以我仍然用的是百度的,并且我相信她会越来越好。
   面对google不断加大在中国推广和本地化的程度,希望百度能看到挑战,树立中国人自己的品牌。我衷心祝愿百度越做越好!
  百度,赶上!

- 作者: NEINC 2006年04月27日, 星期四 21:18  回复(0) |  引用(0) 加入博采

一个用JAVA实现的简单计算器
摘要:用JAVA语言实现的计算器,供大家作为参考. 查看全文

- 作者: neinc 2005年12月8日, 星期四 17:15  回复(1) |  引用(0) 加入博采

CDMA(码分多址)蜂窝移动通信——功率控制
摘要:这是一篇关于CDMA通信的小论文,也是老师要求的课外设计作业,主要是关于它的通信原理技术问题,研讨的不是很深,只就一点进行了讨论. 查看全文

- 作者: neinc 2005年11月25日, 星期五 20:20  回复(0) |  引用(0) 加入博采

论文格式

                论文格式

  1、毕业论文的写作顺序是:标题、作者班级、作者姓名、指导教师姓名、中文摘要及关键词、英文摘要及英文关键词、正文、参考文献。

   2、附表的表头应写在表的上面,居中;附图的图题应写在图的下面,居中。按表、图、公式在论文中出现的先后顺序分别编号。

   3、参考文献的书写格式严格按以下顺序:序号、作者姓名、书名(或文章名)、出版社(或期刊名)、出版或发表时间。

   4、字体:各类标题(包括“参考文献”标题)用粗宋体;作者姓名、指导教师姓名、摘要、关键词、图表名、参考文献内容用楷体;正文、图表、页眉、页脚中的文字用宋体;英文用Times New Roman字体。

   5、字号:论文题目用三号字体,居中;一级标题用四号字体;二级标题、三级标题用小四号字体;页眉、页脚用小五号字体;其它用五号字体;图、表名居中。

   6、论文正文打印页码,下面居中。

   7、打印纸张规格:A4  210×297毫米。

   8、在文件选项下的页面设置选项中,“字符数/行数”选使用默认字符数;页边距设为  上:3厘米;下:2.5厘米;左:2.8厘米;右:2.8厘米;装订线:0.8厘米;装订线位置:左侧;页眉:1.8厘米;页脚1.8厘米。

   9、在格式选项下的段落设置选项中,“缩进”选0厘米,“间距”选0磅,“行距”选1.5倍,“特殊格式”选(无),“调整右缩进”选项为空,“根据页面设置确定行高格线”选项为空。

   10、页眉用小五号字体打印“XX大学XX学院XX级XX专业学年论文”字样,并左对齐

- 作者: neinc 2005年11月25日, 星期五 19:51  回复(1) |  引用(0) 加入博采

大三必读手册:2007年考研复习规划(1)
摘要:很好的一篇关于07年考研准备的文章。 查看全文

- 作者: neinc 2005年11月22日, 星期二 17:54  回复(0) |  引用(0) 加入博采

大三必读手册:2007年考研复习规划(2)
摘要:接上一篇,希望对大家能有所帮助。 查看全文

- 作者: neinc 2005年11月22日, 星期二 17:51  回复(0) |  引用(0) 加入博采

采访唐骏
摘要:唐骏的人生思想,一个IT界的成功人士,也许能够我们一些很好的人生思想。 查看全文

- 作者: neinc 2005年11月19日, 星期六 13:31  回复(5) |  引用(0) 加入博采

有一种美丽叫放弃
摘要:有些东西不放弃,意味着终将获得成功;而一旦选择放弃,将再也没有可能。有些时候,有些人,有些事,必须选择放弃! 查看全文

- 作者: neinc 2005年11月17日, 星期四 21:10  回复(4) |  引用(0) 加入博采

JDBC学习笔记——JDBC性能优化
摘要:JDBC真是麻烦的要命,但是没有办法,既然选择了JAVA,还是好好学吧。也许只有没有学好的人才会觉得它麻烦。 查看全文

- 作者: neinc 2005年11月11日, 星期五 20:57  回复(2) |  引用(0) 加入博采

JDBC介绍
 JDBC是Java的开发者——Sun的Javasoft公司制定的Java数据库连接(Java Data Base Connectivity)技术的简称,是为各种常用数据库提供无缝联接的技术。JDBC在Web和Internet应用程序中的作用和ODBC在Windows系列平台应用程序中的作用类似。ODBC(OpenData Base Connectivity),称为开放式数据库互联技术,是由Microsoft公司倡导并得到业界普遍响应的一门数据库连接技术,如果读者有使用ODBC编程的经验,就会发现JDBC与ODBC很类似。JDBC现在可以连接的数据库包括:xbase、Oracle、Sybase、Aceess以及Paradox等。 

JDBC的工作机制

  如果用户是从事软件领域工作的,不可能没有听说过SQL(Structure Query Language:结构化查询语言),它是一种标准化的关系型数据库访问语言。在SQL看来,数据库就是表的集合,其中包含了行和列。SQL标准虽然也还处在不断变革之中(任何一门标准如果已一成不变了,那只能说明这门学科已经停止发展了),但其基本内容相对稳定。JDBC定义了Java语言同SQL数据之间的程序设计接口。
  JDBC有一个非常独特的动态连接结构,它使得系统模块化。使用JDBC来完成对数据库的访问包括以下四个主要组件:Java的应用程序、JDBC驱动器管理器、驱动器和数据源。
  JavaSoft公司开发了JDBC API,JDBC API是一个标准统一的SQL数据存取接口。  JDBC在Internet中的作用与ODBC在Windows系列中的作用类似。它为Java程序提供了一个统一缝地操作各种数据库的接口,程序员编程时,可以不关心它所要操作的数据库是哪个厂家的产品,从而提高了软件的通用性,而且在Internet上确实无法预料你的用户想访问什么类型的数据库。只要系统上安装了正确的驱动器组,JDBC应用程序就可以访问其相关的数据库。
用JDBC来实现访问数据库记录可以采用下面的几个步骤:
1、 通过驱动器管理器获取连接接口。
2、 获得Statement或它的子类。
3、 限制Statement中的参数。
4、 执行Statement。
5、 查看返回的行数是否超出范围。
6、 关闭Statement。
7、 处理其它的Statement
8、 关闭连接接口。

Java作为数据库前台 

  在信息时代,数据库是用于收集和处理数据的工具,数据库形成了许多公司基础结构的基础。尽管数据库系统非常适合数据的存储和取得,但人类需要某种前台应有程序以查阅和使用存放的数据。
  Java对建立数据库服务器前台应用程序的开发人员提供了几个好处。Java是“一旦写成,到处运行”的语言,即Java程序不经改变即可部署到任何运行Java虚拟机的计算机结构和操作系统。对于大公司,有一个公用开发平台好处很大,编程人员可以不再为大公司中的各个平台分别编程。Java也很吸引第三方开发者,单个Java程序即可满足大公司客户的需求。
  建立公司系统中基于Java的应用程序和小程序的动力是巨大的。公司对于将结构和操作系统相关模型变成针对网络的模型相当有兴趣。Java代表着节约资源成本的长期战略。
  对于开发人员,Java代表巨大的市场机会。大中型企业很少不用数据库进行业务工作的,大部分公司将数据库应用到业务的各个方面,从人事资源到前线客户销售。

JDBC API

  JDBC API使开发者不必不断重写程序而可以建立数据库前台。尽管ANSI委员会有个标准组,但每个数据库系统厂家的系统连接和通讯方法仍然五花八门。
  为了建立健全独立于平台的应用程序和基于Web的小程序,开发人员应考虑用Java开发前台连接办法。从外部看,第三方软件开发者通过专用办法,通过本地方法集成客户机方库或通过建立第三层和新协议来满足这种需求。
  JavaSoft是Sun公司负责开发Java产品的业务单位,和数据库与数据库工具厂家一起建立独立于DBMS的机制,使开发人员不必考虑所用的特定数据库而编写客户机方应用程序。产生的JDBC API第一版是核心JDK 2的一部分。
  JDBC向应用程序开发者提供了独立于数据库的统一的API。这个API提供了编写的标准和考虑所有不同应用程序设计的标准。其奥秘是一组由驱动程序实现的Java接口。驱动程序负责标准JDBC调用向支持的数据库所要的具体调用转变。
  应用程序编写一次并移植到各种驱动程序上。应用程序不变,驱动程序则各不相同。驱动程序可以用于开发多层数据库设计的中间层,也称中间件(middleware)。
  除了向开发者提供统一的独立于DBMS的框架外,JDBC还提供了让开发者保持数据库厂家提供的特定功能的办法。JDBC驱动程序必须支持ANSI AQL-2项目层,但JDBC允许开发者直接将查询字符串传递到连接的驱动程序。这些字段可能是ANSI SQL也可能不是,或者根本不是AQL。这些字符串的使用是基础驱动程序的事。
  JDBC不是Mincrosoft的ODBC(开放式数据库连接)规范派生的,JDBC完全是用Java编写的,而ODBC是个C接口。但是,JDBC和ODBC都是基于X/开放SQL命令层接口(CLI),相同的概念性基础使API工作进展更快,使API的接受更加容易。JavaSoft提供了将JDBC变成ODBC的JDBC-ODBC桥。这个用本地方法完成的版本很小很有效。
  一般来说,JDBC API中有两层接口:应用程序层,开发人员用API通过SQL调用数据库和取得结果,驱动程序层,处理与具体驱动程序版本的所有通讯。
  每个JDBC应用程序(或小程序)至少要有一个JDBC驱动程序,每个驱动程序是针对一种DBMS的。但驱动程序不必直接联到数据库。

利用JDBC代替CGI

  迄今为止,通过Java访问数据库的唯一方法就是利用Java中的流调和访问Common Gateway Interface(CGI,公用网关接口)程序。通过Java调用CGI脚本其实是执行一个访问数据库并返回结果的独立程序。
  使用这种方法速度很慢,而且会在应用程序中引入更多的错误。这是由于利用两种不同的开发语言开发程序,需要掌握两种不同的技术。使用JDBC,用户只要了解Java语言即可,而使用CGI,用户必须同时使用Java和另一种编程语言。
  使用JDBC的另一个原因是它的速度比CGI方法更快。使用CGI方法通常要求计算机执行另一个独立的程序。这个独立的程序访问数据库,处理数据,并将结果返回给调用程序。这就需要多级处理,因而增加了等待时间和出错概率。
  调用CGI脚本通常是通过Web服务器执行一个新的脚本,而执行JDBC的数据库命令只需要某种将SQL命令发送给数据库的服务器。这就大大缩短了执行SQL语句的时间,CGI脚本必须独立地连接数据库,处理执行结构,而JDBC的解决方案使应用程序直接与数据库相连,执行各种操作。

JDBC的优点和缺点

  JDBC API用于连接Java应用程序与各种关系数据库。这使得人们在建立客户/服务器应用程序时,通常把Java作为编程语言,把任何一种浏览器作为应用程序的友好界面,把Internet或Intranet作为网络主干,把有关的数据库作为数据库后端。以下是使用JDBC的优缺点。
  优点如下:
  1.JDBC API与ODBC十分相似,有利于用户理解。
  2.JDBC使得编程人员从复杂的驱动器调用命令和函数中解脱出来,可以致力于应用程序中的关键地方。
  3.JDBC支持不同的关系数据库,使得程序的可移植性大大加强。
  4.用户可以使用JDBC-ODBC桥驱动器将JDBC函数调用转换为ODBC。
  5.JDBC API是面向对象的,可以让用户把常用的方法封装为一个类,备后用。
  缺点如下:
  1.使用JDBC,访问数据记录的速度会受到一定程度的影响。
  2.JDBC结构中包含了不同厂家的产品,这就给更改数据源带来了很大的麻烦。

- 作者: neinc 2005年11月11日, 星期五 20:50  回复(0) |  引用(0) 加入博采

JDBC优化数据库连接
摘要:关于JDBC的数据库连接问题,我学习的时候遇到了很多的困难,现在把有用的东西拿出来。 查看全文

- 作者: neinc 2005年11月11日, 星期五 20:46  回复(0) |  引用(0) 加入博采

六大代码问题检验你的Java知识
你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗?

  1 OutputStreamWriter out = ...
  2 java.sql.Connection conn = ...
  3 try { // ⑸
  4 Statement stat = conn.createStatement();
  5 ResultSet rs = stat.executeQuery(
  6 "select uid, name from user");
  7 while (rs.next())
  8 {
  9 out.println("ID:" + rs.getString("uid") // ⑹
  10 ",姓名:" + rs.getString("name"));
  11 }
  12 conn.close(); // ⑶
  13 out.close();
  14 }
  15 catch(Exception ex) // ⑵
  16 {
  17 ex.printStackTrace(); // ⑴,⑷
  18 }

  作为一个Java程序员,你至少应该能够找出两个问题。但是,如果你不能找出全部六个问题,请继续阅读本文。

  本文讨论的不是Java异常处理的一般性原则,因为这些原则已经被大多数人熟知。我们要做的是分析各种可称为“反例”(anti-pattern)的违背优秀编码规范的常见坏习惯,帮助读者熟悉这些典型的反面例子,从而能够在实际工作中敏锐地察觉和避免这些问题。

  反例之一:丢弃异常

  代码:15行-18行。

  这段代码捕获了异常却不作任何处理,可以算得上Java编程中的杀手。从问题出现的频繁程度和祸害程度来看,它也许可以和C/C++程序的一个恶名远播的问题相提并论——不检查缓冲区是否已满。如果你看到了这种丢弃(而不是抛出)异常的情况,可以百分之九十九地肯定代码存在问题(在极少数情况下,这段代码有存在的理由,但最好加上完整的注释,以免引起别人误解)。

  这段代码的错误在于,异常(几乎)总是意味着某些事情不对劲了,或者说至少发生了某些不寻常的事情,我们不应该对程序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace算不上“处理异常”。不错,调用printStackTrace对调试程序有帮助,但程序调试阶段结束之后,printStackTrace就不应再在异常处理模块中担负主要责任了。

  丢弃异常的情形非常普遍。打开JDK的ThreadDeath类的文档,可以看到下面这段说明:“特别地,虽然出现ThreadDeath是一种‘正常的情形’,但ThreadDeath类是Error而不是Exception的子类,因为许多应用会捕获所有的Exception然后丢弃它不再理睬。”这段话的意思是,虽然ThreadDeath代表的是一种普通的问题,但鉴于许多应用会试图捕获所有异常然后不予以适当的处理,所以JDK把ThreadDeath定义成了Error的子类,因为Error类代表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常这一坏习惯是如此常见,它甚至已经影响到了Java本身的设计。

  那么,应该怎样改正呢?主要有四个选择:

  1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。再次说明,调用printStackTrace算不上已经“处理好了异常”。
  2、重新抛出异常。处理异常的代码在分析异常之后,认为自己不能处理它,重新抛出异常也不失为一种选择。
  3、把该异常转换成另一种异常。大多数情况下,这是指把一个低级的异常转换成应用级的异常(其含义更容易被用户了解的异常)。
  4、不要捕获异常。

  结论一:既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后又把它丢弃,不予理睬。

  反例之二:不指定具体的异常

  代码:15行。

  许多时候人们会被这样一种“美妙的”想法吸引:用一个catch语句捕获所有的异常。最常见的情形就是使用catch(Exception ex)语句。但实际上,在绝大多数情况下,这种做法不值得提倡。为什么呢?

  要理解其原因,我们必须回顾一下catch语句的用途。catch语句表示我们预期会出现某种异常,而且希望能够处理该异常。异常类的作用就是告诉Java编译器我们想要处理的是哪一种异常。由于绝大多数异常都直接或间接从java.lang.Exception派生,catch(Exception ex)就相当于说我们想要处理几乎所有的异常。
  再来看看前面的代码例子。我们真正想要捕获的异常是什么呢?最明显的一个是SQLException,这是JDBC操作中常见的异常。另一个可能的异常是IOException,因为它要操作OutputStreamWriter。显然,在同一个catch块中处理这两种截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOException就要好多了。这就是说,catch语句应当尽量指定具体的异常类型,而不应该指定涵盖范围太广的Exception类。

  另一方面,除了这两个特定的异常,还有其他许多异常也可能出现。例如,如果由于某种原因,executeQuery返回了null,该怎么办?答案是让它们继续抛出,即不必捕获也不必处理。实际上,我们不能也不应该去捕获可能出现的所有异常,程序的其他地方还有捕获异常的机会——直至最后由JVM处理。

  结论二:在catch语句中尽可能指定具体的异常类型,必要时使用多个catch。不要试图处理所有可能出现的异常。

  反例之三:占用资源不释放

  代码:3行-14行。

  异常改变了程序正常的执行流程。这个道理虽然简单,却常常被人们忽视。如果程序用到了文件、Socket、JDBC连接之类的资源,即使遇到了异常,也要正确释放占用的资源。为此,Java提供了一个简化这类操作的关键词finally。

  finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理任务的代码总是有机会执行。遗憾的是有些人却不习惯使用finally。

  当然,编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常——这是执行清理任务的最后机会,尽量不要再有难以处理的错误。

  结论三:保证所有资源都被正确释放。充分运用finally关键词。

  反例之四:不说明异常的详细信息

  代码:3行-18行。

  仔细观察这段代码:如果循环内部出现了异常,会发生什么事情?我们可以得到足够的信息判断循环内部出错的原因吗?不能。我们只能知道当前正在处理的类发生了某种错误,但却不能获得任何信息判断导致当前错误的原因。

  printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程,但只提供了一些最基本的信息,未能说明实际导致错误的原因,同时也不易解读。

  因此,在出现异常时,最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。

  结论四:在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读。

  反例之五:过于庞大的try块

  代码:3行-14行。

  经常可以看到有人把大量的代码放入单个try块,实际上这不是好习惯。这种现象之所以常见,原因就在于有些人图省事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大箱子,虽然东西是带上了,但要找出来可不容易。

  一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明Exception,而不是分离各个可能出现异常的段落并分别捕获其异常。这种做法为分析程序抛出异常的原因带来了困难,因为一大段代码中有太多的地方可能抛出Exception。

  结论五:尽量减小try块的体积。

  反例之六:输出数据不完整

  代码:7行-11行。

  不完整的数据是Java程序的隐形杀手。仔细观察这段代码,考虑一下如果循环的中间抛出了异常,会发生什么事情。循环的执行当然是要被打断的,其次,catch块会执行——就这些,再也没有其他动作了。已经输出的数据怎么办?使用这些数据的人或设备将收到一份不完整的(因而也是错误的)数据,却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可能比系统停止运行带来更大的损失。

  较为理想的处置办法是向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。

  结论六:全面考虑可能出现的异常以及这些异常对执行流程的影响。


  改写后的代码

  根据上面的讨论,下面给出改写后的代码。也许有人会说它稍微有点啰嗦,但是它有了比较完备的异常处理机制。

  OutputStreamWriter out = ...
  java.sql.Connection conn = ...
  try {
   Statement stat = conn.createStatement();
   ResultSet rs = stat.executeQuery("select uid, name from user");
   while (rs.next())
   {
    out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name"));
   }
  }
  catch(SQLException sqlex)
  {
   out.println("警告:数据不完整");
   throw new ApplicationException("读取数据时出现SQL错误", sqlex);
  }
  catch(IOException ioex)
  {
   throw new ApplicationException("写入数据时出现IO错误", ioex);
  }
  finally
  {
   if (conn != null) {
    try {
     conn.close();
    }
    catch(SQLException sqlex2)
    {
     System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连接: " + sqlex2.toString());
    }
   }
   if (out != null) {
    try {
     out.close();
    }
    catch(IOException ioex2)
    {
     System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文件" + ioex2.toString());
    }
   }
  }

  本文的结论不是放之四海皆准的教条,有时常识和经验才是最好的老师。如果你对自己的做法没有百分之百的信心,务必加上详细、全面的注释。
  一方面,不要笑话这些错误,不妨问问你自己是否真地彻底摆脱了这些坏习惯。即使最有经验的程序员偶尔也会误入歧途,原因很简单,因为它们确确实实带来了“方便”。所有这些反例都可以看作Java编程世界的恶魔,它们美丽动人,无孔不入,时刻诱惑着你。也许有人会认为这些都属于鸡皮蒜毛的小事,不足挂齿,但请记住:勿以恶小而为之,勿以善小而不为。

- 作者: neinc 2005年11月11日, 星期五 20:05  回复(0) |  引用(0) 加入博采