phpexecl 多sheet使用

<?php
include ‘excel/PHPExcel.php’;
include ‘excel/PHPExcel/Writer/Excel5.php’;
//创建一个excel
$objPHPExcel = new PHPExcel();

//——————————————————————————————————————–
$i=1;
foreach ($array as $k=>$v) {
 //第一个sheet
 if ($i==1){
  //设置当前的sheet
  $objPHPExcel->setActiveSheetIndex(0);
  
  //设置sheet的name
  $objPHPExcel->getActiveSheet()->setTitle(’sheetname1′);
  
  //设置单元格的值  
  $objPHPExcel->getActiveSheet()->setCellValue(‘A1′, ‘test’);
  $number = 1;
  foreach ($v as $k1=>$v1){
   $number++;
   $objPHPExcel->getActiveSheet()->setCellValueExplicit(‘A’.$number, ”.$v1['data'].”);
  }

 }else{
  //添加一个新的worksheet
  $index[$i]=$objPHPExcel->createSheet();
  $index[$i]->setTitle(’sheetname’.$i);
  
  
  //设置单元格的值  
  $index[$i]->setCellValue(‘A1′, ‘test’);
  
  $number = 1;
  foreach ($v as $k1=>$v1){
   $number++;
   $index[$i]->setCellValueExplicit(‘A’.$number, ”.$v1['data'].”);
  }
 }
$i++;

//直接输出到浏览器
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header(“Pragma: public”);
header(“Expires: 0″);
header(“Cache-Control:must-revalidate, post-check=0, pre-check=0″);
header(“Content-Type:application/force-download”);
header(“Content-Type:application/vnd.ms-execl”);
header(“Content-Type:application/octet-stream”);
header(“Content-Type:application/download”);;
header(‘Content-Disposition:attachment;filename=”excel’.xls”‘);
header(“Content-Transfer-Encoding:binary”);
$objWriter->save(‘php://output’);

有关myeclipse的设置

Eclipse本身很快的,但是加上了myeclipse后,就狂占内存,而且速度狂慢,那如何让Eclipse拖着myeclipse狂飚呢?这里提供一个:

技巧:取消自动validation
validation有一堆,什么xml、jsp、jsf、js等等,我们没有必要全部都去自动校验一下,只是需要的时候才会手工校验一下,速度立马提升好几个档次!
取消方法: windows–>perferences–>myeclipse–>validation 除开Manual下面的复选框全部选中之外,其他全部不选手工验证方法:
在要验证的文件上,单击鼠标右键–>myeclipse–>run validation
程序代码自动排版:Ctrl+Shift+F,会自动把代码进行格式化的排版,非常方便
快速执行程序:Ctrl + F11第一次执行时,它会询问您执行模式,设置好后,以后只要按这个热键,它就会快速执行.
Ctrl+Shift+/ 加上段注释/**/
Ctrl+Shift+\ 取消段注释/**/
Ctrl+/ 加上行注释或取消行注释
自动汇入所需要的类别:Ctrl+Shift+M Ctrl+Shift+O 好象使用Ctrl+Shift+O 也可以
重要技巧(机器配置低就别用了,呵呵)
Eclipse中默认是输入”.”后出现自动提示,用于类成员的自动提示,可是有时候我们希望它能在我们输入类的首字母后就出现自动提示,可以节省大量的输入时间(虽然按alt + /会出现提示,但还是要多按一次按键,太麻烦了).
从Window -> preferences -> Java -> Editor -> Content assist -> Auto-Activation下,我们可以在”.”号后面加入我们需要自动提示的首字幕,比如”ahiz”.
然后我们回到Eclipse的开发环境,输入”a”,提示就出现了.
但是我们可以发现,这个Auto-Activation下的输入框里最多只能输入5个字母,也许是Eclipse的开发人员担心我们输入的太多会影响性能,但计算机的性能不用白不用,所以我们要打破这个限制.
其实上面都是铺垫,制造一下气氛,以显得我们下面要做的事情很牛似的,其实不然,一切都很简单.嘿嘿 :)
在”.”后面随便输入几个字符,比如”abij”,然后回到开发环境,File -> export -> general -> preferences -> 选一个地方保存你的首选项,比如C:\a.epf
用任何文本编辑器打开a.epf,查找字符串“abij”,找到以后,替换成“abcdefghijklmnopqrstuvwxyz”,总之就是你想怎样就怎样!!然后回到Eclipse,File -> import -> general -> preferences -> 导入刚才的a.epf文件.此时你会发现输入任何字幕都可以得到自动提示了.爽!!!
最后:自动提示弹出的时间最好改成100毫秒以下,这样会比较爽一点,不然你都完事了,自动提示才弹出来:),不过也要看机器性能.

myeclipse自动提示背景颜色设置(再也不那么淡)
window–preference–java–editor- completion proposals Background 颜色推荐85,90,205

Eclipse 常用快捷键
Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率。Eclipse中有如下一些和编辑相关的快捷键。
1. 【ALT+/】
此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类、方法和属性的名字时,多体验一下【ALT+/】快捷键带来的好处吧。
2. 【Ctrl+O】
显示类中方法和属性的大纲,能快速定位类的方法和属性,在查找Bug时非常有用。
3. 【Ctrl+/】
快速添加注释,能为光标所在行或所选定行快速添加注释或取消注释,在调试的时候可能总会需要注释一些东西或取消注释,现在好了,不需要每行进行重复的注释。
4. 【Ctrl+D】
删除当前行,这也是笔者的最爱之一,不用为删除一行而按那么多次的删除键。
5. 【Ctrl+M】
窗口最大化和还原,用户在窗口中进行操作时,总会觉得当前窗口小(尤其在编写代码时),现在好了,试试【Ctrl+M】快捷键。
查看和定位快捷键
在程序中,迅速定位代码的位置,快速找到Bug的所在,是非常不容易的事,Eclipse提供了强大的查找功能,可以利用如下的快捷键帮助完成查找定位的工作。
1. 【Ctrl+K】、【Ctrl++Shift+K】
快速向下和向上查找选定的内容,从此不再需要用鼠标单击查找对话框了。
2. 【Ctrl+Shift+T】
查找工作空间(Workspace)构建路径中的可找到Java类文件,不要为找不到类而痛苦,而且可以使用“*”、“?”等通配符。
3. 【Ctrl+Shift+R】
和【Ctrl+Shift+T】对应,查找工作空间(Workspace)中的所有文件(包括Java文件),也可以使用通配符。
4. 【Ctrl+Shift+G】
查找类、方法和属性的引用。这是一个非常实用的快捷键,例如要修改引用某个方法的代码,可以通过【Ctrl+Shift+G】快捷键迅速定位所有引用此方法的位置。
5. 【Ctrl+Shift+O】
快速生成import,当从网上拷贝一段程序后,不知道如何import进所调用的类,试试【Ctrl+Shift+O】快捷键,一定会有惊喜。
6. 【Ctrl+Shift+F】
格式化代码,书写格式规范的代码是每一个程序员的必修之课,当看见某段代码极不顺眼时,选定后按【Ctrl+Shift+F】快捷键可以格式化这段代码,如果不选定代码则默认格式化当前文件(Java文件)。
7. 【ALT+Shift+W】
查找当前文件所在项目中的路径,可以快速定位浏览器视图的位置,如果想查找某个文件所在的包时,此快捷键非常有用(特别在比较大的项目中)。
8. 【Ctrl+L】
定位到当前编辑器的某一行,对非Java文件也有效。
9. 【Alt+←】、【Alt+→】
后退历史记录和前进历史记录,在跟踪代码时非常有用,用户可能查找了几个有关联的地方,但可能记不清楚了,可以通过这两个快捷键定位查找的顺序。
10. 【F3】
快速定位光标位置的某个类、方法和属性。
11. 【F4】
显示类的继承关系,并打开类继承视图。
调试快捷键
Eclipse中有如下一些和运行调试相关的快捷键。
1. 【Ctrl+Shift+B】:在当前行设置断点或取消设置的断点。
2. 【F11】:调试最后一次执行的程序。
3. 【Ctrl+F11】:运行最后一次执行的程序。
4. 【F5】:跟踪到方法中,当程序执行到某方法时,可以按【F5】键跟踪到方法中。
5. 【F6】:单步执行程序。
6. 【F7】:执行完方法,返回到调用此方法的后一条语句。
7. 【F8】:继续执行,到下一个断点或程序结束。
常用编辑器快捷键
通常文本编辑器都提供了一些和编辑相关的快捷键,在Eclipse中也可以通过这些快捷键进行文本编辑。
1. 【Ctrl+C】:复制。
2. 【Ctrl+X】:剪切。
3. 【Ctrl+V】:粘贴。
4. 【Ctrl+S】:保存文件。
5. 【Ctrl+Z】:撤销。
6. 【Ctrl+Y】:重复。
7. 【Ctrl+F】:查找。
其他快捷键
Eclipse中还有很多快捷键,无法一一列举,用户可以通过帮助文档找到它们的使用方式,另外还有几个常用的快捷键如下。
1. 【Ctrl+F6】:切换到下一个编辑器。
2. 【Ctrl+Shift+F6】:切换到上一个编辑器。
3. 【Ctrl+F7】:切换到下一个视图。
4. 【Ctrl+Shift+F7】:切换到上一个视图。
5. 【Ctrl+F8】:切换到下一个透视图。
6. 【Ctrl+Shift+F8】:切换到上一个透视图。
Eclipse中快捷键比较多,可以通过帮助文档找到所有快捷键的使用,但要掌握所有快捷键的使用是不可能的,也没有必要,如果花点时间熟悉本节列举的快捷键,必将会事半功倍

1. edit->content Assist – > add Alt+/ 代码关联
2. Window -> Next Editor -> add Ctrl+Tab 切换窗口
3. Run/Debug Toggle Line Breakpoint -> add Ctrl+` 在调试的时候 增删断点
4. Source-> Surround with try/catch Block -> Ctrl+Shift+v 增加try catch 框框
5. Source -> Generate Getters and Setters -> Ctrl+Shift+. 增加get set 方法

———–有用的快捷键———–
Alt+/ 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)
Ctrl+1:光标停在某变量上,按Ctrl+1键,可以提供快速重构方案。选中若干行,按Ctrl+1键可将此段代码放入for、while、if、do或try等代码块中。
双击左括号(小括号、中括号、大括号),将选择括号内的所有内容。
Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性
———–Ctrl系列———–
Ctrl+K:将光标停留在变量上,按Ctrl+K键可以查找到下一个同样的变量
Ctrl+Shift+K:和Ctrl+K查找的方向相反
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)
Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)
Ctrl+M 最大化当前的Edit或View (再按则反之)
Ctrl+/ 注释当前行,再按则取消注释
Ctrl+T 快速显示当前类的继承结构
Ctrl+Shift-T: 打开类型(Open type)。如果你不是有意磨洋工,还是忘记通过源码树(source tree)打开的方式吧。
Ctrl+O:在代码中打开类似大纲视图的小窗口
Ctrl+鼠标停留:可以显示类和方法的源码
Ctrl+H:打开搜索窗口
Ctrl+/(小键盘) 折叠当前类中的所有代码
Ctrl+×(小键盘) 展开当前类中的所有代码
———–Ctrl+Shift 系列———–
Ctrl+Shift+F 格式化当前代码
Ctrl+Shift+X 把当前选中的文本全部变味小写
Ctrl+Shift+Y 把当前选中的文本全部变为小写
Ctrl+Shift+O:快速地导入import
Ctrl+Shift+R:打开资源 open Resource
———–F快捷键 系列———–
F3:打开声明该引用的文件
F4:打开类型层次结构
F5:单步跳入
F6:单步跳过
F7:单步跳出
F8:继续,如果后面没有断点,程序将运行完
———–行编辑用———–
Ctrl+D: 删除当前行
Ctrl+Alt+↓ 复制当前行到下一行(复制增加)
Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)
Alt+↑ 当前行和上面一行交互位置(同上)
Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)
Ctrl+Shift+Enter 在当前行插入空行(原理同上条)
———–不常用的———–
Alt+← 前一个编辑的页面
Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)
Ctrl+Shift+S:保存全部
Ctrl+W 关闭当前Editer
Ctrl+Shift+F4 关闭所有打开的Editer
Ctrl+Shift+G: 在workspace中搜索引用
Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)
———–不明白———–
Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)
Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)

本文来自CSDN博客http://blog.csdn.net/cchaha/archive/2009/03/04/3955762.aspx

Oracle时间格式的问题

1 oracle对时间格式的数据存贮
oracle数据库中存放时间格式的数据,是以oracle特定的格式存贮的,占7个字节,与查询时显示的时间格式无关,具体哪个字节表示什么,我不太清楚,请高手补充。存贮的时间包括年月日时分秒,最小精度为秒,不存贮秒以下的时间单位。因此在一些前台支持毫秒级的程序(如PB客户端程序)连接到oracle数据库时应注意这点。查询时显示的时间格式,由会话环境决定,或者由用户定义,与数据库无关。

2 oracle时间显示形式
通常,客户端与数据库建立起连接后,oracle就会给一个缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。例如,使用us7ascii字符集(或者是其他的英语字符集)时,缺省的时间格式显示为:28-Jan-2003,而使用zhs16gbk字符集(或其他中文字符集)时时间格式缺省显示为:2003-1月-28。向表中插入数据时,如果不使用转换函数,则时间字段的格式必须遵从会话环境的时间格式,否则不能插入。查看当前会话的时间格式,可以使用以下的SQL语句:
SQL> select sysdate from dual;

3 向oracle表中插入时间格式的数据
向oracle表插入时间格式的数据是一个相对来讲比较麻烦的事情,要么你严格遵从当前会话的时间格式书写你的时间值,要么使用转换函数自定义时间数据的格式。有两个与时间相关的转换函数:to_char 和 to_date 。to_char(时间值,时间格式)函数将时间值转换为字符串形式,通常在查询中使用;to_date(字符串,时间格式)则把格式字符串转换时间值,通常在insert 语句中使用。在日期格式中,各种日期格式
分量这里不作详细的讨论,请查oracle帮助文档中这两个函数的用法,或者查一查PL/SQL编程的书,讲得很详细的。

4 如何修改会话中的日期格式
修改当前会话中的日期格式据说有三种办法,我只做过前两种办法的试验,修改glogin.sql文件的办法我没有试过,不知道是不是真的能行。下面一一解说。
(1) 在sql*plus中修改当前会话的日期格式
SQL> alter session set nls_date_format = ‘yyyy-mm-dd hh24:mi:ss’;
将当前会话的时间格式修改为这种格式: 2003-01-28 15:23:38,即四位年-两位月-两位日,空格,24小时的制的小时:分钟:秒。
这种修改方法,只对当前会话有效。注意,是对当前会话,而不是当前的sql*plus窗口。即如果你这样修改之后,又使用connect命令以其他用户连接到数据库或者是连接到其他的数据库,则这个日期格式就失效了,又恢复到缺省的日期格式。
(2) 修改注册表(只对windows系统)
在注册表hkey_local_machinesoftwareoraclehome0主键中增加一个字串(8i版本),字串名为nls_date_format,字串的值为你希望定义的时间格式,如: yyyy-mm-dd hh24:mi:ss ,然后重新启动sql*plus。
这种修改方法,对sql*plus窗口有效,即不论你打开多少个sql*plus窗口,缺省的都是这种时间格式。修改服务器端的注册表无效,只有修改客户端的注册表才有效。
unix系统下有没有这类似的方法,我不知道,我不会用unix或者是linux系统。
(3) 修改$oracle_homesqlplusadmin目录中glogin.sql文件
这种方法我没有试过,不敢乱说,以免误导大家。请了解这种方法的高手来指教。

5 日期格式的优先级
如果在一个具体的环境中,既修改了注册表,又使用alter session命令修改了当前会话,那么哪一种修改方法有效呢?alter session命令有效,它的优先级是最高的。即不管当前的客户端环境是什么样的,
注册表修改成什么样子了,只要你使用了alter session命令来修改了时间格式,那么就以你修改后的时间格式为准。
因此,如果直接使用sql*plus交互式查询或插入时间格式的数据,两种方法都可以用。如果使用sql文件来进行批量的插入或者是定时执行,最好在使用时间数据前使用alter session命令来修改会话,以保证这个sql语句的正常运行与环境无关。同样的,如果是前台的客户端程序中需要使用到时间格式的数据,最好也在使用之前修改会话,或者使用to_char或to_date函数进行转换(强烈推荐使用转换函数),以保证
程序运行与环境无关。

在oracle中一次导入多个SQL文件的方法

1. 这次拿到手上的sql文件总共有一千多个,先把所有的文件都放在同一个目录下,然后在命令行里执行命令:

Z:\L\SQL\SQL>dir/b > z:\1.sql
(其中Z:\L\SQL\SQL是需要导入的sql文件所在的路径)

会把所有的sql文件名都输出到一个sql文件中。

2. 用UltraEdit打开生成的sql文件,切换到column mode,给所有的行前都添加一个“@”,保存。

3. 最后一步,在sqlplus中“@ z:\1.sql”,执行就OK了。

关于修改计算机名名后oracle的监听器无法启动的解决方法

工作时修改了计算机的名字,原来为“shunni”,而改为“XXX”,之后机子上的Oracle的监听器服务OracleOraHome92TNSListener就起不来了,一直找不到问题根源,后来经过仔细研究,发现了解决方法如下:

原来Oracle的监听程序OracleOraHome92TNSListener使用的配置文件用到了电脑的名字,

在Oracle9i的安装路径下,找到:【例如安装在D盘根目录下】
盘符:/oracleora92/network/admin 找到并修改以下几个文件:

listener.ora文件 、tnsnames.ora文件、snmp_ro.ora文件 ,把其中的有关

(ADDRESS = (PROTOCOL = TCP)(HOST = XXX)(PORT = 1521))

把HOST换为对应的电脑的名称即可;

Oracle数据库Decode()函数的使用方法

DECODE函数的作用:它可以将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。

  区别于SQL的其它函数,DECODE函数还能识别和操作空值。

  语法如下:

  DECODE(control_value,value1,result1[,value2,result2…][,default_result]);

  control _value

  试图处理的数值。DECODE函数将该数值与后面的一系列的偶序相比较,以决定返回值。

  value1

  是一组成序偶的数值。如果输入数值与之匹配成功,则相应的结果将被返回。对应一个空的返回值,可以使用关键字NULL于之对应

  result1

  是一组成序偶的结果值。

  default_result 未能与任何一个值匹配时,函数返回的默认值。

  示例如下:

  select decode( x , 1 , ‘x is 1 ’, 2 , ‘x is 2 ’, ‘others’) from dual

  当x等于1时,则返回‘x is 1’。

  当x等于2时,则返回‘x is 2’。

  否则,返回others’。

  在需要比较2个值的时候,我们可以配合SIGN()函数一起使用。

  SELECT DECODE( SIGN(5 -6), 1 ‘Is Positive’, -1, ‘Is Nagative’, ‘Is Zero’)

  同样,也可以用CASE实现:

  SELECT CASE SIGN(5 – 6)

  WHEN 1 THEN ‘Is Positive’

  WHEN -1 THEN ‘Is Nagative’

  ELSE ’Is Zero’ END

  FROM DUAL

  另外,大家还可以在Order by中使用Decode。

  例:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。

  select * from table_subject order by decode(subject_name, ‘语文’, 1, ‘数学’, 2, , ‘外语’,3)

Oracle专用服务器与共享服务器的区别

在建立Oracle数据库的时候,应该会在数据库建立助手向导上面看到这么一个选项,就是数据库的连接模式采用什么方式。在Oracle9i或者10g中,可以看到有2种连接模式,一种叫做专用服务器连接(dedicated server) ,另外一种叫做共享服务器连接(shared server)。下面我们来分类说一下这两种连接方式的不同点。

  专用服务器模式就是说每次在对Oracle进行访问的时候,Oracle服务器的Listener会得到这个访问请求,然后回为这个访问创建一个新的进程来进行服务。所以说,对于每一个客户端的访问,都会生成一个新的进程进行服务,是一种类似一对一的映射关系。这种连接模式的一个很重要的特点就是UGA(用户全局域)是存储在PGA(进程全局域)中的,这个特性也很好说明了当前用户的内存空间是按照进程来进行分配的。

  而另外的共享服务器连接则是一种在程序编写的时候通常会用到的连接池(pool)的概念。采用这种模式的话,在数据库的初始化的时候就会创建一批服务器连接的进程,然后把这些连接进程放入一个连接池来进行管理。初始化的池中的进程数量在数据库初始化建立的时候是可以手动设置的。在连接建立的时候,Listener首先接受到客户端的建立连接的请求,然后Listener去生成一个叫做调度器(dipatcher)的进程与客户端进行连接。调度器把把客户端的请求放在SGA(系统全局域)的一个请求队列中,然后再共享服务器连接池中查找有无空闲的连接,然后让这个空闲的服务器进行处理。处理完毕以后再把处理结果放在SGA的相应队列中。调度器通过查询相应队列,得到返回结果,再返回给客户端。这种连接模式的优点在于服务器进程的数量可以得到控制,不大可能出现因为连接人数过多而造成服务器内存崩溃。但是由于增加了复杂度以及请求相应队列,可能性能上有所下降。

  总之,在开发阶段中,用第一种专用服务器可能好一些,因为少了一些中间的复杂度,而且开发的时候一般连接的数量也少。而在多个应用同时使用一个数据库的实际应用环境下,采用第二种方法可能好一些,因为如果到时候突然有1000个或者10000个请求连接的话,数据库服务器如果同时建立10000个连接,肯定要受不了的。当然,也要看到时候的实际情况如何再做决定,两者没有绝对的哪种好哪种不好的差别

关于这两者的比较”假如你来到一个城市,要在这个城市的不同的地方办几件事情,在交通方面你有两种选择:一个是雇一辆专车,这辆专车将会把你从A带到B,一直等你把在B的事情办完,在把你从B带到C。。。。。。另一种选择是给出租车公司打电话订辆出租车,先把你从A带到B,然后你和出租车该干嘛干嘛,你去办你的事情,出租车去接别的生意,等你在B的事情办完了,你再跟出租车公司订车,出租车公司将会联系当时在B附近的其他出租车去接你。。。。。。

首先,dedicated servers的设置非常简单—–不需要设置,这个是oracle的默认选项

而对于shared servers,你就要需要做一些额外的设置,当让按照administrator guide并不难,关键是你需要决定到底需要多少个shared server servers和多少个dispatcher,这不仅仅需要经验的积累,还需要持续的观察和调整。
在dedicated servers里,你所有的等待都是数据库本身的等待,而在shared servers里你有可能需要等待一个available的shared server process。

很明显,当用户并发的连接数很大的时候,dedicated servers的server process个数也会变得很大,对于操作系统来说多一个process就意味着多一点管理负担,要知道操作系统支持的同时并发数可不是无限的。这意味着,在dedicate servers里,当你有大量的用户连接(比如,同一时间超过5000个用户连上来),你的系统负担就会相当大。而这种情况shared servers就可以处理的相对好一些,因为加入同时有5000个用户连上来而且我们知道一般只有1%的连接是active,那我们只需要设置50个shared servers就可以把所有的用户请求处理得很好,并节省了系统资源。

作为一个好处,shared servers可以用来控制concurrent。要知道用户的并发数和系统的处理能力决不是成正比的(可以下面的图),当用户并发数超过一个阀值,系统的处理能力会明显下降。通过shared servers可以控制系统的concurrent不超过这个阀值。

在引入PGA的自动管理以前,shared servers是要比dedicated servers节省内存的,然后在自动管理的PGA引入之后,shared servers的这个优势已经不像我们想象的那么不明显了。

dedicate servers一个server process为了一个较大的request而长时间的工作而不影响其它的users,然而在shared servers,一些较大的request会影响其它的用户。

还需要考虑其他的因素,比如,如果在前端使用了weblogic的connecting pool,那么你在database level再使用shared servers可能就不是很必要,因为这时你的用户连接已经在weblogic层面上得到了控制。

shared servers还有一个所谓的伪死锁的问题,这点大家参考一下tom的新书就知道了。

关于dedicated servers和shared servers的话题我们就讨论这么多,最后给大家一个小提示:其实dedicated servers和shared servers是可以并存的,实际上,即使你使用了shared servers,某些管理操作也是必须在dedicated 模式下来做的,比如startup或shutdown database。如果你实在难以选择,如果你的应用可能一部分是OLTP的(用户量也很大),一部分是DW的,其实你可以考虑同时使用dedicated servers和shared servers。

Oracle中的水位线

Oracle表段中的高水位线HWM     
 
在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。
下面我们来谈一下Oracle中Select语句的特性。Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于delete语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。
    那有没有办法让高水位线下降呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。所以如果需要把表清空,在有可能利用TRUNCATE语句来删除数据的时候就利用TRUNCATE语句来删除表,特别是那种数据量有可能很大的临时存储表。
    在手动段空间管理(Manual Segment Space Management)中,段中只有一个HWM,但是在Oracle9iRelease1才添加的自动段空间管理(Automatic Segment Space Management)中,又有了一个低HWM的概念出来。为什么有了HWM还又有一个低HWM呢,这个是因为自动段空间管理的特性造成的。在手段段空间管理中,当数据插入以后,如果是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动段空间管理中,数据插入到新的数据块以后,数据块并没有被格式化,而是在第一次在第一次访问这个数据块的时候才格式化这个块。所以我们又需要一条水位线,用来标示已经被格式化的块。这条水位线就叫做低HWM。一般来说,低HWM肯定是低于等于HWM的。

(转载)程序员和妓女的相同点

1、程序员和妓女的相同点都是靠出卖为生。
2、吃青春饭,人老珠黄肯定混不下去。
3、越高级收入越高,当然中间人的抽头会更高。
4、生活没有规律,以夜生活为主,如果需要,凌晨也要加班。
5、名声越大,越容易受到青睐。
6、必须尽最大可能满足客户各种各样变态的需求。
7、鼓励创新精神。
8、喜欢扎堆。程序员集中的地方称为软件园,妓女集中的地方叫红灯区。
9、流动性较大,正常情况下没有工会。
10、如果怀孕了,既不能做程序员,也不能做妓女。
11、都为防病毒的问题而烦恼。
12、当然,个中高手还专门以制毒传毒为乐。
13、一个是Microsoft,一个是Plug & Play。
14、工作状态相同。工作时精神高度集中,最怕外界干扰,工作完毕身心放松,体会到一种不可替代的工作快乐。
15、女孩子最好还是不要做这两个职业,但还是有很多女孩子做。
16、除非在转行以后,否则都不愿意结婚,没空儿啊。
17、程序员怕查户口的。妓女怕查房的。
18、妓女工作的地方(床)是程序员最向往的地方。
19、程序界的高手通常很讨厌微软,妓女界的高手嗯。。。这个。。。恐怕也如此。
20、都是吃青春饭,不过到人老珠黄后,凭着混个脸熟,程序员可以混个管理员,妓女也行,不过俗称老鸨。
21、妓女靠的本钱是三围,程序员靠的可是四围(思维)。
22、程序员为了拉客,通常会在交易前提供一个DEMO,妓女提供的那叫PHOTO。
23、程序员现在出的活时兴叫吃霸(词霸)、结霸(解霸),妓女大姐一律叫波霸。
24、心不在焉的妓女可以一边工作一边do { beep(1); sleep(9) } until overflow。心不在焉的程序员也可以一边工作一边navigate到成人网站上去。
25、程序员手册:一套好的人机操作界面要求,对于新手,能够一步一步的引导他进入功能,相反对于熟客,能够直奔主题;妓女同样要遵守程序员手册对人鸡界面的规定。
26、妓女在工作中最怕的是临检,程序员最怕的是停电。
27、新上手的程序员叫菜鸟,刚入行的妓女叫雏鸡,都是好可怜的小动物。
28、程序界现在流行OO的方法,虽然在XXXX年前妓女已在床上掌握了O?O???的技术。
29、程序员为了拉客,无奈之时,也可以先让客人试玩,妓女当然有时也会先给你甜头。

不过总之程序员比妓女还惨,补充如下:
1、妓女每个月总有几天可以理直气壮的说不,程序员如果老板不发话,可要一年干到黑。
2、女人做程序那叫奇女、才女,男人要是做妓,那就叫鸭了。
3、妓女不干了人家那叫从良,程序员如果不干了,估计是下了岗。
4、程序员有千年虫问题,妓女好象没听说有。
5、妓女的工作隐蔽性很强,程序员的工作只怕亲戚朋友都知道,所以更加没脸皮。
6、程序员做的越好,要做的程序越多,妓女做的好,就可以挑三拣四。
7、程序员现在流行FREE、OPEN什么的,说白了就是自己玩自己,妓女界好象还没这样恶性竞争。

分页算法

<?php
/**
* 分页
*page()
*
* @param int $pageId 当前页数
* @param int $iTotal 当前查询的记录数,取35条
*  35条表示,后面还有记录,就显示后面的链接
*  小于30或等于30 则不显示后面的链接
*
*/
define(CENTER,5);
define(TOTAL,30);  // 默认分页数
function page($pageId,$iTotal){
if($pageId > CENTER){
$star = $pageId – CENTER;
}else{
$star =1;
}
if($iTotal>TOTAL){
$pageTotal = $iTotal-TOTAL > CENTER ? CENTER : ceil($iTotal/TOTAL);
$pageTotal += CENTER+$star+1;
}else{
$pageTotal = $pageId+1;
}
for ($i=$star; $i<$pageTotal; $i++){
echo ‘[ '.$i.' ]‘;
}
}
page(20,10);

<?php

/**

* 分页

*page()

*

* @param int $pageId 当前页数

* @param int $iTotal 当前查询的记录数,取35条

* 35条表示,后面还有记录,就显示后面的链接

* 小于30或等于30 则不显示后面的链接

*

*/

define(CENTER,5);

define(TOTAL,30);  // 默认分页数

function page($pageId,$iTotal){

if($pageId > CENTER){

$star = $pageId – CENTER;

}else{

$star =1;

}

if($iTotal>TOTAL){

$pageTotal = $iTotal-TOTAL > CENTER ? CENTER : ceil($iTotal/TOTAL);

$pageTotal += CENTER+$star+1;

}else{

$pageTotal = $pageId+1;

}

for ($i=$star; $i<$pageTotal; $i++){

echo ‘[ '.$i.' ]‘;

}

}

page(20,10);