??xml version="1.0" encoding="utf-8" standalone="yes"?> 一、在PD9中先选择扩展属性的cd?/p>
如果是新Z个Physical data model 的话Q可以在[new physical data model]对话框中选择[extended model definitions] 标签Q选择中[powerbuilder]V也可以选择菜单来完成同L(fng)操作[model] [extended model difinitions] q样在PD9中的表,列的[extended attributes]的属性中有了powerbuilder的扩展属性了?/p>
二、设|PD9中的pb扩展属?/p>
默认情况下extended attributes 中的 powerbuilder 的扩展属?value 是引?其它的PD9中的标准属性的 如PB中的Comment 的value ?%Comment% 表示使用PD9中的 Comment 属性值来做ؓ(f)PB的扩展属性中的内? 但如果?zhn)是反向数据库Q包括PB扩展属性)而来的model则此处ؓ(f)PB中已有的内容Q而不?x)将此内容反向至PD9的标准属性中厅R所以会(x)出现反向数据库后Q包括PB扩展属性)不能直接看到PB中的扩展属性内容的现象?/p>
三、生?反向PB扩展属?/p>
当设|完PD9中model中的内容后就可以执行[tool] [powerbuilder] [gererate extended attributes] 来生成PB中的扩展属性,q里需要先通过ODBCq接你的数据库?/p>
如果执行[tool] [powerbuilder] [reverse extended attributes] 则可以将数据库中PB的扩展属性取回。但取回的内容只存放?extended attributes 中,q不反映在视图中?/p>
另外Q如果新建好的数据库最好用PB的database Lq接一下,以便PB生成扩展属性的几个表! 以上只是本h在用过E中的经验,若有不实Q或有更好的Ҏ(gu)可以大家讨论Q本人Email: mzqfk@yahoo.com.cn
exp system/manager@test file=d:\orabackup\%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.dmp owner=datauser
(
A、批处理中可以用%date%调用当前日期Q但%date:~0,4%则可以生成当前时_(d)转换成字W串以后Q从W?位v?个字W的子字W串Q第一位从0计。其??位置的数字还可以是负|应该是代表了从字W串末尾、向前取字符?br />
B、批处理中可以用%time%调用当前旉
)
3、将dbbkup.bat攄于c:\backup文g夹之?br />
4、控刉?->d计划-->dd计划-->选择E序以进行计?->览-->选中dbbkup.bat-->每日执行-->选择旉-->输入用户名密?->完成
5、执行时间过了之后,c:\backup文g夹下面会(x)出现yyyymmddhhmiss(q月日小时分U?.dmp命名的DUMP档案
]]>
ps:应该?个pb的表Q同时要注意W一ơ连接数据库时的用户权限
]]>
xieccQ?br />我们的项目从d12月䆾启动Q采用了Struts+Hibernate的架构,一开始用Hibernate的时候速度极快Q对象操作异常方便,大家都说爽歪歪?
可惜好景不长Q随着我们对象关系的不断复杂,数据量的不断增加QHibernate的性能急剧下降。具体表Cؓ(f)Q我们在设计对象旉用了很多的one-to-many和many-to-one的关p,在取某个对象的几个简单的属性时Q它?x)把所有关联的子对象都取出来,l常出在取一个简单属性的时候,调试H口的SQL语句一屏一屏地往下闪。到最后我的一个test跑完需要1Q分钟?
在忍无可忍之下,我们开始性能优化Ҏ(gu)Q以下我们优化所做的一些事情:(x)
1、将所以one-to-many的关p里lazy设成true
2、修改hibernate.propertiesQ增加了以下两句Q?
hibernate.jdbc.fetch_size=50
hibernate.jdbc.batch_size=100
3、调整WebLogic的pool
4、利用Hibernate提供的CGLIB Proxy机制Qmany-to-one关系的子对象也可以lazy initialization
Q但是我发现调试H口里仍?x)有取子对象的SQL语句Q但速度实快了Q?
5、利用Hibernate提供的Cache机制Q对关键对象使用Cache
l果优化以后Q我的test可以从原来的12分钟变成50U钟跑完?
原以Z事大吉了Q但当我们面对客L(fng)时候,才发现我们系l的性能q远q不够?
我们现在pȝ试运行约两个月,l常在数据保存或者查询时{上一分钟甚至两分钟?
׃客户原来的系l用asp+SQL Server写的Q速度很快。二者一Ҏ(gu)Q我们就被客户骂得惨不忍睏V?
优化真是一件很烦h的事Q在不改动系l框架的情况下,不知q有哪些提高pȝ性能的方法?
freecodeQ?br />同感Q虽然我不用Q不懂hibernate.
前段旉Q我们做了个目Q对一些取数的q程Q采用了javascript脚本Q再通过bsf~译Q运行时Q时间巨长,人家说以前用foxpro做的Q快多了Q弄得我们很没面子?/p>
dhj1Q?br />我也?Struts+Hibernate 做大型项?在ƈ发很高时,每天4500人次讉K量的情况?性能也相当不?
做的旉有几点考虑:
1.大东?如果很多很多的one-to-many和many-to-one的关p? 必定?x)媄响性能,我刚学习(fn)Hibernate 时就有这U直?所以我们没有用one-to-many和many-to-one的关p?而是象SQL一L(fng)L作表的关pL识符.
2.如果大的系l?最l必ȝ成HTML的文?是有数据库中有数据更新?自动生成一个HTML文g.大多数用h在只ȝ?在只ȝ态下只LCHTML文g,节省很多资源.
3.更用CHACHE表技?把访问量高的记录自动提到CACHE表中.
xieccQ?br />谢谢dhj1l我提的?
在hibernate|站上看到的好多资源几乎都说hibernate的性能不错Q而且很多人开发的pȝ性能也不错,包括dhj1的,看来hibernate无罪Q是我们设计得太滥了?
不过q是有点疑问?
1、dhj1提到的第一点很有道理。我们确实在有些关键的地方用了标识符来关联。但是我们这个系l的兌实现太多了,如果所以有东西都用标识W作兌的话Q那我们的实体层设计退化成为面向关pȝER图设计,那我们要Hibernate何用Q我用感觉用Hibernate时最大的便利不是在写代码的时候用对象的操作代替SQL语句,而是在徏模的时候可以用面向对象的思维把很复杂的逻辑用UML图表C出?然后直接转化成实体。所以我们在性能影响太大的地斚w用了面向对象和关pȝl合的方式,但在更多的地方仍然只能采用对象关联的方式?
Q、生成静态ᅢQ_(d)Q,对特定的pȝ实有用Q但我们pȝ中的数据几乎都是动态的Q所以实现v来有困难。而且我也不太清楚q样做的隑ֺ有多高,具体怎么实现Q请dhj1指点qh|?
Q、Cache我们已经采用了。但proxy的用法我至今仍然有点qL(fng)?
在Hibernate的文档里g只要在定义文仉加这么一句就可以了:(x)
<class name="eg.Order" proxy="eg.Order">
但实际用时我们发现q样做之后,Hibernate取数据时的SQL语句g一句都没有?
我们现在的想法是自已来实现Proxyc,它的接口与实体完全一P在Proxy里SQL语句来实现取数据操作。不知是否可行?
sanwaQ?br />我在设计pȝ?Ҏ(gu)个对象图都会(x)采用两套映射模型,
一套用于映实际的UML,当然包括引用,q套对象图主要用于根据关联对象的属性来查询对象时?很少用于更新数据,除非是聚集类.
另一套映?把对象引用映ؓ(f)Long型的属?传递到业务层或表示?需要相关的对象引用?再用q个引用来load对象.而且,对于需要load的对象可以用代理或直接多映一个简单类来处?
另外,对于大数据量的查询或表的兌层次较深(过三层),采用jdbc直接处理.
方世玉:(x)
我们现在也正在用hibernateq行目开?
我认Z是所有相关的表都要做one ManyQmany one映射?
比如说一个用户和他的定购业务Q我们做了双向关联?
但是q个用户的话单就不能和用户做M兌了。话单表每天都有数十万条Q就是做manyone兌也非常吓人,宁可到时候用hql来查?/p>
xieccQ?br />呵呵,hsanwaQ这两套映射模型如何在一个应用中同时使用Q?/p>
dhj1Q?br />我用hibernate,是可以减开发工作量. 特别在开发中或维护过E中对表l构的改?用HIBERNATE是很方便?
做了DAO?对表的父子关pȝ的处?通过ID标识,也只是两三句E序语句.操作也很方便,而且更灵z?
生成静态ᅢQ_(d)Q?以后我做q这L(fng)pȝ,q在XXX省信息港|站上大量?性能当然不错,同时1400人在U?真正的在U?不是那种用网|个几分钟h一ơg时的那种在线),性能也不?开发当然会(x)有一些难?
我说的CACHE不是说用HIBERNATE的CACHE.而是自已开发的,把访问量高的信息自动攑ֈ一个表中去,q个表保证只?00讉K量最高的条记?多于100条记录的出M.
sanwaQ?br />举个例子,比如用户的权?在我们的pȝ中涉?qing)用PUserQ、权?Acl)、组?Component)、组件类(componentDomain){几个对象的兌?
W一套映图Q反映他们的实际关系Q即对应U(ku)ML模型。User和Acl的关联映ؓ(f)idbagQ不要直接映ؓ(f)set,因ؓ(f)在我设计的关联表中存在代理主键,代理主键在第二套映射图中实际为用h限的id.
W二套映图Q只映射用户QUserSOQ和用户拥有的权?UserAclSO)Q是one to many的关pR?
后缀SO表示相关cȝ单对象映类?
q样Q当客户端需要获取某个用L(fng)所有权限时Q直接用W二套映图。返回的集合中就只包括Acl的id。如果要获取用户Ҏ(gu)个组件域的权限,则用W一套映图Q用强大的HQL查询Q再转换为第二套映射图返回到客户端?
当更新用L(fng)权限Ӟ也用W二套映图Q直接操作UserSO和UserAclSOQ传回更新?
使用cM的设计策略时Q对many to many的关联表Q都采用代理主键Q而不是联合主键,q样Q两套映图都较Ҏ(gu)存取数据。只是,多数情况下用W二套映图?
当然,我的E序架构是Swing + Session Bean + DAO + Hibernate + DB,Swing和Session Bean的通信可以用HTTP或RMI,在我的架构中,lazy loading发挥不了多大的作用,才采取这U策略。如果在lazy loading可以发挥作用的地方,对大多数对象图,是没有必要采取这U策略的?
另外Q在我的架构中,swing层有一个组件是可以Ҏ(gu)一个ID来加载这个类的属性,直接用jdbc实现的,独立于Hibernate
xiaoyuQ?br />我也说上一句吧?
虽然HB是好Q方便,但有x据库设计的一些性能原则q是要考虑的?
毕竟它只是Mapping而已?
所以也要设|烦引等东西?/p>
jxb8901Q?br />上面的proxy和cache没有M关系Q只是用于lazy loadingQ请看hibernate中文文档W?章:(x)
java代码:
proxy (可?: 指定一个接口,在gq装载时作ؓ(f)代理使用。你可以在这里用该c自q名字?
coolwycQ?br />Z在性能上得到^?对many-to-one不直接用关q?例如:user&ACL,取user?不取ACL,要取ACL先取user,再取ACL,毕竟应用取user的频率比取ACL?没必要在取user是硬要把ACL一起取出来.
q有其他many-to-one都和q个很类?如果many很少的话没问题,例如:?amp;宠物,通常一个h只有于{于一个宠?q种情况取h的时候把宠物一起取出对pȝ影响不大
willmacQ?br />hibernate本n的性能非常好,关键在设计本w?
和你的数据库本nQ以?qing)你的访问量和数据库的性质
针对不同的环境一定要有不同的设计的,一套设计肯定不能适用于全部的环境
我D个典型例子来说吧
你的hibernate设计可以采用单session的方式,也可以采用多session的方式,应用环境不同Q结果也大大的不同。当用户人群,数据库记录两低的时候,多session的设计是非常有优势的Q这是Z么那么多?
反对使用threadlocal理session的主要理由把Q的?
把两U设计都攑֜q里Q你?x)发现多session的性效要比
threadlocal的强太多了,q且~程也异常的Ҏ(gu)Q这U例子,我不再D了,你在q个论坛上都可以下的到。可?
当h变多,数据库记录v量增长的时候,我们发现问题来了Q我们做的应用无限制的吃d存,应用的响应开始变慢,q是Z么呢Q不知道大家是否理解I竟什么是sessionQ其实从Ҏ(gu)上说是一张hashmap,q样大家好理解了,当不同的用户Q同时访问应用的时候,不同的h建立不同的连表,然后释放Q而当q发人群急速增长的时候,于是问题来了。那怎么办,threadlocal没有其他的办法,你要解决一个同步的问题Q我们只有一个session,你不能够同时往里读取数据,然后又写入数据的Qƈ发用戯么多Q你只可以让他们一个一个得来!Q!
哇,q样效率不是太低了,的确Q我一开始就说了Q小型系l,使用threadlocall对是低效的做法的,可是当规模上来了之后Q我们再来看Q内存不再无限制的开销Qcpu徯荷也降下来了Q唯一一点发生变化的是,用户的客L(fng)可能多等?.001U钟Q一个在服务D队列的旉Q这是设计?
讲了一个设计的例子Q我们来看多对一Q一对多Q会(x)让我们应用的效率降低么?
h意hibernate只是帮助我们完成了mapping 的工?
原来的一对多也好或者多对一也好Q本来就存在的,之所以让你觉得效率低Q是因ؓ(f)在得到父亲后Q还要去把每一个儿子给d来,可是注意Q你只是多执行了一条sql而已Qؓ(f)什么会(x)慢的呢,我想问题q是在设计之?
Oracle数据导入导出imp/expq当于oracle数据q原与备份。exp命o(h)可以把数据从q程数据库服务器导出到本地的dmp文gQimp?令可以把dmp文g从本地导入到q处的数据库服务器中。 利用这个功能可以构Z个相同的数据库,一个用来测试,一个用来正式用?br />
执行环境Q可以在SQLPLUS.EXE或者DOSQ命令行Q中执行Q DOS中可以执行时׃ 在oracle 8i 中?安装目录\ora81\BIN被设|ؓ(f)全局路径Q 该目录下有EXP.EXE与IMP.EXE文g被用来执行导入导出?br /> oracle用java~写QSQLPLUS.EXE、EXP.EXE、IMP.EXEq两个文件有可能是被包装后的cL件?br /> SQLPLUS.EXE调用EXP.EXE、IMP.EXE所包裹的类Q完成导入导出功能?br />
下面介绍的是导入导出的实例?/font>
1 数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp?br /> exp
system/manager@TEST
file=d:\daochu.dmp full=y
2 数据库中system用户与sys用户的表导出
exp
system/manager@TEST
file=d:\daochu.dmp owner=(system,sys)
3 数据库中的表inner_notify、notify_staff_relat导出
exp
aichannel/aichannel@TESTDB2
file= d:\data\newsmgnt.dmp tables=(inner_notify,notify_staff_relat)
4 数据库中的表table1中的字段filed1?00"打头的数据导?br /> exp
system/manager@TEST
file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"
上面是常用的导出Q对于压~,既用winzip把dmp文g可以很好的压~?br /> 也可以在上面命o(h)后面 加上 compress=y 来实现?/font>
1 D:\daochu.dmp 中的数据导入 TEST数据库中?br /> imp
system/manager@TEST
file=d:\daochu.dmp
imp
aichannel/aichannel@HUST
full=y file=file= d:\data\newsmgnt.dmp ignore=y
上面可能有点问题Q因为有的表已经存在Q然后它?yu)报错,对该表就不进行导入?br /> 在后面加?ignore=y 可以了?br /> 2 d:\daochu.dmp中的表table1 导入
imp
system/manager@TEST
file=d:\daochu.dmp tables=(table1)
基本上上面的导入导出够用了。不情况要先是表d删除Q然后导入?br />
注意Q?/strong>
操作者要有够的权限Q权限不够它?x)提C?br /> 数据库时可以q上的。可以用tnsping TEST 来获得数据库TEST能否q上?/font>
附录一Q?/strong>
l用户增加导入数据权限的操作
W一,启动sql*puls
W二Q以system/manager登陆
W三Qcreate user 用户?IDENTIFIED BY 密码 Q如果已l创用户Q这步可以省略)
W四QGRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字
W五, q行-cmd-q入dmp文g所在的目录,
imp userid=system/manager full=y file=*.dmp
或?imp userid=system/manager full=y file=filename.dmp
执行CZ:
F:\Work\Oracle_Data\backup>imp userid=test/test full=y file=inner_notify.dmp
屏幕昄
Import: Release 8.1.7.0.0 - Production on 星期?2?16 16:50:05 2006
(c) Copyright 2000 Oracle Corporation. All rights reserved.
q接? Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
l由常规路径导出由EXPORT:V08.01.07创徏的文?br />已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导?br />导出服务器用UTF8 NCHAR 字符?(可能的ncharset转换)
. 正在AICHANNEL的对象导入到 AICHANNEL
. . 正在导入表 ?"INNER_NOTIFY" 4行被导入
准备启用U束条g...
成功l止导入Q但出现警告?/font>
附录二:(x)
Oracle 不允许直接改变表的拥有? 利用Export/Import可以辑ֈq一目的.
先徏立import9.par,
然后Q用时命o(h)如下Qimp parfile=/filepath/import9.par
?import9.par 内容如下Q?br /> FROMUSER=TGPMS
TOUSER=TGPMS2 Q注Q把表的拥有者由FROMUSER改ؓ(f)TOUSERQFROMUSER和TOUSER的用户可以不同)
ROWS=Y
INDEXES=Y
GRANTS=Y
CONSTRAINTS=Y
BUFFER=409600
file==/backup/ctgpc_20030623.dmp
log==/backup/import_20030623.log
一. 导出工具 exp
1. 它是操作pȝ下一个可执行的文?strong> 存放目录/ORACLE_HOME/bin
exp导出工具数据库中数据备份压~成一个二q制pȝ文g.可以在不同OS间迁U?br />
它有三种模式Q?br /> a. 用户模式Q?导出用户所有对象以?qing)对象中的数据?br /> b. 表模式:(x) 导出用户所有表或者指定的表;
c. 整个数据库:(x) 导出数据库中所有对象?br />
2. 导出工具exp交互式命令行方式的用的例子
$exp test/test123@appdb
Enter array fetch buffer size: 4096 > 回R
Export file: expdat.dmp > m.dmp 生成导出的文件名
(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U > 3
Export table data (yes/no): yes > 回R
Compress extents (yes/no): yes > 回R
Export done in ZHS16GBK character set and ZHS16GBK NCHAR character set
About to export specified tables via Conventional Path ...
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > cmamenu 要导出的表名
. . exporting table CMAMENU 4336 rows exported
Table(T) or Partition(T:P) to be exported: (RETURN to quit) >要导出的表名n
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > 回R
Export terminated successfully without warnings.
3. 导出工具exp非交互式命o(h)行方式的例子
$exp scott/tiger tables=(emp,dept) file=/directory/scott.dmp grants=y
说明:把scott用户里两个表emp,dept导出到文?directory/scott.dmp
$exp scott/tiger tables=emp query=\"where job=\'salesman\' and sal\<1600\" file=/directory/scott2.dmp
说明:在exp里面加上导出emp的查询条件job='salesman' and sal<1600
(但我个h很少q样?q是把满x件的记录生成临时表后,再exp?x)方便一?
$exp parfile=username.par file=/directory1/username_1.dmp,/directory1/username_2.dmp filesize=2000M log=/directory2/username_exp.log
参数文gusername.par内容
userid=username/userpassword
buffer=8192000
compress=n
grants=y
说明:username.par为导出工具exp用的参数文g,里面具体参数可以Ҏ(gu)需要去修改
filesize指定生成的二q制备䆾文g的最大字节数
(可用来解x些OS?G物理文g的限制及(qing)加快压羃速度和方便刻历史数据光盘{?
?导入工具 imp
1. 它是操作pȝ下一个可执行的文?存放目录/ORACLE_HOME/bin
imp导入工具EXP形成的二q制pȝ文g导入到数据库?
它有三种模式Q?br /> a. 用户模式Q?导出用户所有对象以?qing)对象中的数据?br /> b. 表模式:(x) 导出用户所有表或者指定的表;
c. 整个数据库:(x) 导出数据库中所有对象?br />
只有拥有IMP_FULL_DATABASE和DBA权限的用h能做整个数据库导?br />
imp步骤Q?br /> (1) create table (2) insert data (3) create index (4) create triggers,constraints
2.导入工具imp交互式命令行方式的例?/strong>
$ imp
Import: Release 8.1.6.0.0 - Production on 星期?12?7 17:01:08 2001
(c) Copyright 1999 Oracle Corporation. All rights reserved.
用户? test
口o(h):****
q接? Oracle8i Enterprise Edition Release 8.1.6.0.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production
导入文g: expdat.dmp> /tmp/m.dmp
输入插入~冲区大(最ؓ(f) 8192 ) 30720>
l由常规路径导出由EXPORT:V08.01.06创徏的文?br />警告: 此对象由 TEST 导出, 而不是当前用?br />已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导?br />只列出导入文件的内容(yes/no)Qno>
׃对象已存? 忽略创徏错误(yes/no)Qno> yes
导入权限(yes/no)Qyes>
导入表数?yes/no)Qyes>
导入整个导出文g(yes/no)Qno> yes
. 正在TEST的对象导入到 SCOTT
. . 正在导入表 ?"CMAMENU" 4336行被导入
成功l止导入Q但出现警告?
3.导入工具imp非交互式命o(h)行方式的例子
$ imp system/manager fromuser=jones tables=(accts)
$ imp system/manager fromuser=scott tables=(emp,dept)
$ imp system/manager fromuser=scott touser=joe tables=emp
$ imp scott/tiger file = expdat.dmp full=y
$ imp scott/tiger file = /mnt1/t1.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=/oracle_backup/log/imp_scott.log
$ imp system/manager parfile=params.dat
params.dat 内容
file=dba.dmp show=n ignore=n grants=y fromuser=scott tables=(dept,emp)
4.导入工具imp可能出现的问?/strong>
(1) 数据库对象已l存?br />一般情? 导入数据前应该彻底删除目标数据下的表, 序列, 函数/q程,触发器等;
数据库对象已l存? 按缺省的imp参数, 则会(x)导入p|
如果用了参数ignore=y, ?x)把exp文g内的数据内容导入
如果表有唯一关键字的U束条g, 不合条g不被导?br />如果表没有唯一关键字的U束条g, 引赯录重?br />
(2) 数据库对象有d键约?br /> 不符合主外键U束? 数据?x)导入失?
解决办法: 先导入主? 再导入依存表
disable目标导入对象的主外键U束, 导入数据? 再enable它们
(3) 权限不够
如果要把A用户的数据导入B用户? A用户需要有imp_full_database权限
(4) 导入大表( 大于80M ) ? 存储分配p|
默认的EXP? compress = Y, 也就是把所有的数据压羃在一个数据块?
导入? 如果不存在连l一个大数据? 则会(x)导入p|.
导出80M以上的大表时, 记得compress= N, 则不?x)引赯U错?
(5) imp和exp使用的字W集不同
如果字符集不? 导入?x)失? 可以改变unix环境变量或者NT注册表里NLS_LANG相关信息.
导入完成后再改回?
(6) imp和exp版本不能往上兼?br />imp可以成功导入低版本exp生成的文? 不能导入高版本exp生成的文?br />Ҏ(gu)情况我们可以?br />$ imp username/password@connect_string
说明: connect_string 是在/ORACLE_HOME/network/admin/tnsnames.ora
定义的本地或者远端数据库的名U?br />注意事项:
UNIX: /etc/hosts 要定义本地或者远端数据库服务器的L?br />win98: windows\hosts 和IP地址的对应关p?
win2000: winnt\system32\drivers\etc\hosts
原因Qoracle9i/disk1/stage/components/oracle.ocs4j/2.1.0.0.0a/1/datafiles/expanded/ocs4j_conf_nt中缺?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">OCS4J.properties.tmp文g
解决Ҏ(gu)Q把oracle9i/disk1/stage/components/oracle.ocs4j/2.1.0.0.0a/1/datafiles/expanded/ocs4j_conf_nt/OCS4J.properties.tmp文gL.tmp后拷到\oracle\ora92\ocs4j\admin\?/font>
预定义角Ԍ(x)
1.CONNECT角色: 授于最l用L(fng)典型最基本的权?br />ALTER SESSION --修改?x)?br />CREATE CLUSTER --建立聚簇
CREATE DATABASE LINK --建立数据库链?br />CREATE SEQUENCE --建立序列
CREATE SESSION --建立?x)?br />CREATE SYNONYM --建立同义?br />CREATE VIEW --建立视图
2.RESOURCE角色: 是授予开发h员的
CREATE CLUSTER --建立聚簇
CREATE PROCEDURE --建立q程
CREATE SEQUENCE --建立序列
CREATE TABLE --
CREATE TRIGGER --建立触发?br />CREATE TYPE --建立cd
3.DBA角色Q拥有系l所有系l权限
4.IMP_FULL_DATABASE角色、EXP_FULL_DATABASE角色Q?/b>
BACKUP ANY TABLE --备䆾M?br />EXECUTE ANY PROCEDURE --执行M操作
SELECT ANY TABLE --查询M?br />
5.DELETE_CATALOG_ROLE角色Q?/b>
授予用户q个角色Q用户就可以从表sys.aud$中删除记录,
sys.aud$表中记录着审计后的记录Q用这个角色可以简化审计踪q管理?br />
6.SELECT_CATALOG_ROLE角色、EXECUTE_CATALOG_ROLE角色Q?/b>
SELECT_CATALOG_ROLE角色h从数据字典查询的权利Q?br />EXECUTE_CATALOG_ROLE角色h从数据字怸执行部分q程和函数的权利?br />
SQL*PLUS基础
在上一贴中Q我们掌握了些基本的oracle操作Q如创徏、授权用P创徏数据库等。在OEM(Oracle Enterprise Manager)可视化的H口环境中,虽然我们也可以很方便地做q些事,但是事实上,用SQL语言书写在开发上更有效率Q!oracle提供的SQL*Plus是个不错的工具Q如果大家喜Ƣ窗口的开发环境,用SQLPlus Worksheet也行Q下面说点基本的西西Q?br />
SQL(Structure Query Language)语言是结构化查询语言Q是数据库的核心语言Q是面向集合的描q性非q程化语a?br />SQL语言共分为四大类Q数据查询语aDQL,数据操纵语言DMLQ数据定义语aDDL,数据库控制语aDCL?br />
1.数据查询语言DQL的基本结构是由select子句Qfrom子句Qwhere子句l成的查询块Q?br />select <字段名表> from <表或视图?gt; where <查询条g>
2.数据操纵语言DML完成在数据库中确定、修攏V添加、删除某一数据值的d(以下是部分常用DML语句):
insert 增加数据行到?br />delete 从表中删除数据行
Update 更改表中数据
3.数据定义语言DDL完成定义数据库的l构Q包括数据库本n、数据表、目录、视囄数据库元?以下是部分常用DDL语句)
create table 创徏?br />create index 创徏索引
create view 创徏视图
alter table 增加表列Q重定义表列Q更改存储分?br />drop table 删除?br />drop index 删除索引
4.数据库控制语aDCL用来授予或回收访问数据库的某U特权,q控制数据库操纵事务发生的时间及(qing)效果Q对数据库实行监视等。如Q?br />grant 权限或角色授予用户或其它角?br />revoke 回收用户权限
roll 回滚Q是当某个对话更改了数据库中的数据后Q由于某U原因用户不x交此更改Ӟoracle所采取的保护操作。这是一个把信息恢复到用户update、insert、delete前最后提交的状态?br />commit 提交。在完成数据库的插入Q删除和修改操作Ӟ只有当事务提交到数据库才完成,有提交前只有操作数据库的本h才能看到Q别人只有在最后提交完成才可以看到?br />
接下来,我们在SQL*Plus中实战一下,为我们下面将要做的打好基?br />用system登陆到SQL*Plus后,我们做如下操?q次没有截图Q有详细的说?
SQL>create user maxuan identified by max; #创徏口o(h)为max的用户maxuan
SQL>grant connect,resource to maxuan; #为用户maxuan授权
SQL>conn maxuan/max; #以用户maxuanq行q接
SQL>create table test(a number); #建立一个名为test的表Q只有字D名为A的一列,数据cd为数?br />SQL>insert into test values(1); #插入一条记?br />SQL>select * from test; #查询记录Q此时A列的W一行ؓ(f)1
SQL>update test set a=2; #更改记录Q此时A列的W一行已改ؓ(f)2
SQL>commit; #提交
SQL>delete from test; #删除test表中所有的记录Q此时test表中没有记录
SQL>roll; #回滚到提交前Q此时再查询test表,A列第一行值又回复?
oracle的数据类?/font>
在数据库中创建数据表的时候,我们需要定义表中所有字D늚cdQ数据类型大致分为:(x)character,numberic,date,lob和raw{,q些是最基本的数据类型。当然在oracle中也允许自定义数据类型!
在oracle中提供的character数据cd:
char(<size>:固定长度字符Ԍ最大长度ؓ(f)2000字节Q如果不指定长充Q缺省ؓ(f)1个字节长?br />varchar2(<size>:可变长度的字W串Q最大长度ؓ(f)4000字节Q具体定义时指明最大长度,q种cd可以放数字、字母以?qing)ASCII码字W集(或者EBCDIC{数据库pȝ接受的字W集标准)中的所有符受如果数据长度没有达到最大|oracle?x)根据数据大自动调节字D长度。是最长用的数据类型?br />nchar(<size>:Ҏ(gu)字符集而定的固定长度字W串Q最大长?000字节?br />nvarchar2(<size>:Ҏ(gu)字符集而定的可变长度字W串Q最大长?000字节?br />long:可变长字W列Q最大长度限制ؓ(f)2GBQ用于不需要作字符串搜索的长串数据。此cd是一个遗留下来的而且来不会(x)被支持的数据cdQ逐渐被BLOBQCLOBQNCLOB{大的数据类型所取代?br />
numberic数据cd用来存储负的和正的整敎ͼ分数和Q点型数据Q在oracle中提供的numberic数据cdQ?br />number(<m>,<n>:可变长的数值列Q允?、正值及(qing)负|m是所有的有效数字的位敎ͼn是小数点以后的位数?br />
在oracle中提供的date数据cd:
date:~省格式是dd-mon-yy(??q?
在oracle中提供的lob数据cd:
blob、clob、nclobQ?/b>三种大型对象(lob)Q用来保存较大的囑Ş文g或带格式的文本文Ӟ如word文档Q以?qing)音频、视频等非文本文Ӟ最大长充是4GB。晕些数据存储在数据库内部保存?br />bfile:在数据库外部保存的大型二q制对象文gQ最大长度是4GBQ这U外部的LOBcdQ通过数据库记录变化情况,但是数据的具体保存是在数据库外部q行的?br />
在oracle中提供的raw数据cd:
raw(<size>:可变长二q制数据Q具体定义字D|必须指明最大长度,q种格式用来保存较小的图形文件或带格式的文本文gQ它也是一U较老的数据cdQ将被lob数据cd所取代?br />long raw:可变长二q制数据Q最大长度是2GBQ可以用来保存较大的囑Ş或带格式的文本文Ӟ以及(qing)音频、视频等非文本文Ӟq也是一U较老的数据cdQ将被lob数据cd所取代?br />
其它的数据类型:(x)
rowid:q是oracle数据表中的一个伪例,它是数据表中每行数据内在的唯一标识
integer:整数cd
创徏购物|站后台数据?/font>
现在我们回到用J2EE体系开发购物网站的主题Q开始实战徏购物|站的后台数据库?br />Z实现购物|站?b>基本的功能,我们需要徏立四个表Q商品列?products)、商品类型表(item)、订单列?orders)和管理员列表(admin)。表l构如下所C:(x)
item表结构(商品cd?
字段名称 数据cd 允许I?!--ubbcodetab--> 主键/外键 备注
type_id INTEGER(自动~号) ?!--ubbcodetab--> 主键 商品cdI(xin)D标记
type varchar2(30) ?!--ubbcodetab--> 商品cd名称
product表结?商品列表)
字段名称 数据cd 允许I?!--ubbcodetab--> 主键/外键 备注
product_id INTEGER(自动~号) ?!--ubbcodetab--> 主键 商品ID标记
title varchar2(30) ?!--ubbcodetab--> 商品名称
type_id INTEGER ?!--ubbcodetab--> 外键 商品cd标记
info varchar2(80) ?!--ubbcodetab--> 商品?br />price number(16,2) ?!--ubbcodetab--> 商品h
orders表结?订单列表)
字段名称 数据cd 允许I?!--ubbcodetab--> 主键/外键 备注
order_id INTEGER(自动~号) ?!--ubbcodetab--> 主键 订单ID标记
name varchar2(20) ?!--ubbcodetab--> ֮姓名
address varchar2(100) ?!--ubbcodetab--> 发货地址
tel number(16) ?!--ubbcodetab--> 联系?sh)?br />email varchar2(30) ?!--ubbcodetab--> 联系email
btime date ?!--ubbcodetab--> 订购日期
product_id INTEGER ?!--ubbcodetab--> 外键 商品标记
uword varchar2(100) ?!--ubbcodetab--> ֮留言
admin表结?理员列?
字段名称 数据cd 允许I?!--ubbcodetab--> 主键/外键 备注
admin_id INTEGER(自动~号) ?!--ubbcodetab--> 主键 理员I(y)D标记
adminname varchar2(20) ?!--ubbcodetab--> 理员名U?br />password varchar2(20) ?!--ubbcodetab--> 理员密?br />
设计完表l构后,我们p开始创Z?br />创徏表我惛_l不是什么难事了Q那么我们要注意的是product、item、ordersq三个表之间的关联,q有自动~号?/p>
下面是完整的SQL语句Q在后面我会(x)l出详细的说明,你可以在SQL*Plus里对照着输入Q也可以它存ؓ(f)SQL脚本文gQ在SQL*Plus或SQLPlus Worksheet里执行。当然也可以把代码直接拷贝到SQL*Plus里执行!
rem ///BY MAXUAN 开?//
create table item(
type_id integer not null,
type varchar2(30),
constraint item_pk primary key(type_id)
);
create table product(
product_id integer not null,
title varchar2(30) not null,
type_id integer not null,
info varchar2(80),
price number(16,2) not null,
constraint product_pk primary key (product_id),
constraint product_fk foreign key(type_id) references item(type_id)
);
create table orders(
order_id integer not null,
name varchar2(20) not null,
address varchar2(100),
tel number(16),
email varchar2(30) not null,
btime date,
product_id integer not null,
uword varchar2(100),
constraint orders_pk primary key(order_id),
constraint orders_fk foreign key(product_id) references product(product_id)
);
create table admin(
admin_id integer not null,
adminname varchar2(20) not null,
password varchar2(20) not null,
constraint admin_pk primary key(admin_id)
);
create sequence type_id increment by 1 start with 1;
create sequence product_id increment by 1 start with 1;
create sequence order_id increment by 1 start with 1;
create sequence admin_id increment by 1 start with 1;
rem ///BY MAXUAN l束///
说明一Q徏立表之间的关?/b>
product、item、orders三个表通过公共域,通常UCؓ(f)键域(Key Field)q行兌Q存在两U类型的键:(x)主键(Primary key)和外部键(Foreign key)。主键表中的数据行保持唯一Q在表product中,product_idZ键,表orders中也包含有product_id,此时的product_id是外部键。一个表的外部键从其它表中获取信息。看看上面的SQL语句Q应该会(x)了吧Q徏立主外键的SQL语句详解如下Q?br />constraint 主键?primary key (字段?
constraint 外部键名 foreign key(字段? references 对应?对应字段)
当不指名主键名或外部键名Ӟpȝ用默认名Uͼ
如果你要删除一个主键或外部键时Q用如下写法Q?br />ALTER TABLE 表名 DROP CONSTRAINT 主键名或外部键名
如果是主/唯一关键字被外部键引用,先要删除外部键,然后才能删除主键Q!
说明二:(x)关于自动~号
在access中有自动~号的数据类型,MSSQL和MYSQL也都有自动增长的数据cdQ插入记录时不用操作此字D,?x)自动获得数据|而oracle没有自动增长的数据类型,我们需要徏立一个自动增长的序列P插入记录时要把序列号的下一个D于此字段Q可以预见的是,有此功能Q我们可以把数据从ACCESS、MSSQL或MYSQLq移到oracle了!
create sequence type_id increment by 1 start with 1;
q句中,type_id为序列号的名Uͼ每次增长?Qv始序号ؓ(f)1?br />如果要删除序列,用drop sequence 序列名就可以了!Q?/p>
]]>
一、安?/p>
点击setup.exe开始安装后Q一路点几Z下一步”,直到“下一步”ؓ(f)灰色Q上面标题栏昄为“Oracle Universal Installer:数据库标识”,q时请需输入“全局数据库名”(SIDQl点几Z下一步”,直到“安装”,点击“安装”后开始安装?/p>
安装q程中如果出现“错误:(x)没有扑ֈ文gD:\oracle\ora92\ocs4j\admin\OCS4J.properties”时Q点几Z取消”,弹出“取消”对话框后选中“只停止安装该组件”,点击“确定”,安装?x)l?
安装到“Oracle Universal Installer:配置工具”的“Aqent Configuration Assistant”时Q如果报错“ORA-12571:TNS:包写入程序失败”,直接点击“确定”。这步完成时?x)有个“错误”提C,“确定”就是,然后l箋“下一步”,到“Oracle Universal Installer:配置工具”,点击“退出”?/p>
ORACLE9i的初步安装完成后Q接下来׃“ORA-12571:TNS:包写入程序失败”错误,数据库ƈ没有建立Q那么我们将“D:\oracle\ora92\network\admin\sqlnet.ora”打开Q把其中的“NTS”改为“NONE”?/p>
点击“开?E序/Oracle - OraHome92/Configuration and Migration Tools/Database Configuration Assistant”开始添加数据库Q?/p>
“步?Q操作”中选中“创建数据库”,“下一步”;
“步?Q数据库模板”中选中“New Database”,“下一步”;
“步?Q数据库标识”填写“全局数据库名”(我的SID为kkdbQ,“完成”;
此时?x)弹出“概要”对话框Q“确定”开始创建数据库。数据库建立后,ORACLE9i的安装就是完成了?/p>
二、设|用?/p>
1.点击“开?E序/ Oracle - OraHome92/ Application Development/ SQL Plus”;
2.在“用户名U[U]Q”和“口令[P]Q”输入system的用户名和密码,默认为system和managerQ?/p>
3. 创徏表空?TEST",大小100M:
CREATE TABLESPACE "TEST"
LOGGING
DATAFILE 'D:\ORACLE\ORADATA\TEST\HAIG.ora' SIZE 100M;
4.创徏用户"TEST",默认表空?TEST"Q?/p>
CREATE USER "TEST" PROFILE "DEFAULT" IDENTIFIED BY "TEST"
DEFAULT
TABLESPACE "TEST" ACCOUNT UNLOCK;
5.授予其三个权?UNLIMITED TABLESPACE,CONNECT,RESOURCEQ?/p>
GRANT UNLIMITED TABLESPACE, CONNECT, RESOURCE TO "TEST";
6.使用“TEST”用L(fng)录;
CONNECT TEST/TEST;
正常昄“已q接”,OK?/p>
三、创建示例数据库
1.Q?/p>
CREATE TABLE count
(num1 NUMBER(5,2),
num2 NUMBER(5,2),
result NUMBER(6,2));
2.插入数据Q?/p>
INSERT INTO count(num1,num2,result) VALUES(1,1,2);
INSERT INTO count(num1,num2,result) VALUES(1,1,1);
INSERT INTO count(num1,num2,result) VALUES(2,8,10);
INSERT INTO count(num1,num2,result) VALUES(68,90,158);
3.提交数据Q?/p>
COMMIT;
新表建立Q数据也插入成功?br />