??xml version="1.0" encoding="utf-8" standalone="yes"?>
struts2.1需要的?/strong>
首先是struts2.1必须的包Q?br />
然后是要与spring集成需要的包:struts2-spring-plugin-2.1.6.jar
spring2.5需要的?/strong>
q里用的是集成了spring所有模块的包:spring.jar
ibatis2.3需要的?/strong>
ibatis-2.3.*.*.jar
web.xml的配|?/strong>
2 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
5 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
6 <filter>
7 <filter-name>struts2</filter-name>
8 <filter-class>
9 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
10 </filter-class>
11 </filter>
12 <listener>
13 <listener-class>
14 org.springframework.web.context.ContextLoaderListener
15 </listener-class>
16 </listener>
17 <filter-mapping>
18 <filter-name>struts2</filter-name>
19 <url-pattern>/*</url-pattern>
20 </filter-mapping>
21 <welcome-file-list>
22 <welcome-file>login.jsp</welcome-file>
23 </welcome-file-list>
24 </web-app>
25
applicationContext.xml的配|?/strong>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="WEB-INF/sql-map-config.xml" />
</bean>
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>
<!-- 其他配置Q如DAOQAction--/>
</beans>
sql-map-config.xml的配|?/strong>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings useStatementNamespaces="true" />
<sqlMap resource="ssi/persistance/sqlmap/user_SqlMap.xml" />
</sqlMapConfig>
具体sql-map文g的配|,q里׃写了Q我也是刚刚学习ibatisQ呵呵,׃最q马上就要开发了Q就找了工具来加快速度Qibatis官方提供的ibatorQ原来叫abatorQ这个工L当猛啊,q在学习?..
在配|过E当中,特别需要注意各个配|文件的存放位置Q比如对于applicationContext.xml来说Q默认应该存攑֜WEB-INF文g夹中Q如果想攑ֈc\径上去,需要在web.xml里面配置Q一般配|在web.xml的开头部分:
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
一、简介:
hsql数据库是一ƄJava~写的免Ҏ(gu)据库Q许可是BSD-style的协议?
相对其他数据库来_其体U小Q才563kb?
仅一个hsqldb.jar文g包括了数据库引擎,数据库驱动,q有其他用户界面操作{内宏V?
下蝲地址Q?a >http://hsqldb.org/
二、用hsql数据库:
1、hsql数据库引擎有几种服务器模式:常用的Server模式、WebServer模式、Servlet模式、Standlone模式、Memory-On­ly数据库?
2、最为常用的Server模式Q?
1)首先却换到l(f)ib文g夹下Q运行java -cp hsqldb.jar
org.hsqldb.Server -database.0 db/mydb -dbname.0 xdb
执行命o后,会在db文g夹下创徏一个数据库mydbQ别名(用于讉K数据库)是xdbQ如果存在mydb数据库,会打开它?
2)q行数据库界面操作工Pjava -cp hsqldb.jar
org.hsqldb.util.DatabaseManager
在Type选项里选上相应的服务器模式Q这里选择HSQL
Database Engine
Server模式QDriver不用修改QURL修改为jdbc:hsqldb:hsql://localhost/xdb
Q主要这里xdb是上面我们讄的别名);user里设|用户名Q第一ơ登录时Q设|的是管理员的用户名Qpassword讄密码。然后点击Ok?
3)W一ơ运行数据库引擎Q创建数据库完毕。好了,你可以打开db文g夹,会发现里面多了几个文件?
mydb.properties文gQ是关于数据库的属性文件?
mydb.scriptQhsql主要保存的表Q这里按hsql的说法是Memory表,是最为常用的Q,里面的格式都是文本格式,可以用文本查看,里面的语­句都是sql语句Q熟(zhn)sql语句的话Q你也可以手动修改它。每ơ运行数据库引擎的话都是从这里加载进内存的?
mydb.lck表示数据库处于打开状态?
其他的请参看hsqldb包里的手册?
3、WebServer模式和Serverq行模式基本一P只是支持了Http{协议,主要用于防火墙,默认端口?001。启动ServerQjava
-cp hsqldb.jar org.hsqldb.WebServer ...剩余的和上面的一致?
4、Servlet模式可以允许你通过Servlet容器来访问数据库Q请查看hsqlServlet.java的源代码Q和WebServercM?
5、另一个值得思考的模式是Standalone模式Q不能通过|络来访问数据库Q主要是在一个JVM中用,那样的话Q访问的速度会更加快。虽然文档里
面提?amp;shy;主要是用于开发时使用Q但是我们可以假设一下,该方法不需要一个引擎类的东西,而类g打开文g的方式,q回一?
Connection对象Q?
Connection c = DriverManager.getConnection("jdbc:hsqldb:file:mydb",
"sa", "");
会在当前目录找到mydb数据库相xӞ打开q返回一个Connection对象。该方式有点好处是可以不用引擎,在需要的时候操作数据。所以那
些对?amp;shy;据库不是特别有要求的Q但又需要一个操作数据库的方式的话,可以使用q种Ҏ(gu)。对于那些不想额外在数据库引擎花贚wq话,可以
使用q种Ҏ(gu)。但是不推荐使用?amp;shy;Ҏ(gu)。记得Hibernate里SessionFactory可以使用
openSession(Connecttion
c)来获得一个Session对象的,因此Q在试或者实际应用的话都可以q样使用?
6、Memory-Only
数据库:思义Q主要是内存中用,不用于保存数据。可以用于在内存中交换数据?
上面是关于hsqldb的一些基本信息的介绍Q可以看到它的一些优势和Ҏ(gu)?
我们可以把hsqldb内置在webE序中,除考虑Standalone模式外,最好是采用最为常用的Server模式?
那么Server模式如何和webE序合理搭配使用呢?
可以采用两种方式Q?
1Q采用上面提到的Ҏ(gu)Q运行java -cp hsqldb.jar
org.hsqldb.Server -database.0 db/mydb -dbname.0 xdb
来启动dbQ通过讄的URLQjdbc:hsqldb:hsql://localhost/xdb
以达到在E序中访问hsql数据库的
Q注Q设|URL{信息,可以通过hibernate来配|,例如Q?
hibernate.dialect org.hibernate.dialect.HSQLDialect
hibernate.connection.driver_class org.hsqldb.jdbcDriver
hibernate.connection.username sa
hibernate.connection.password
hibernate.connection.url jdbc:hsqldb:hsql://localhost/xdb Q?
2Qؓ了省ȝ一U方法的琐碎Q可以在启动web容器的过E中同时启动hsqldb。具体做法如下:~写一个有关hsql的Listenerc,扩展javax­.servlet.ServletContextListenerQ可以在配置文g中设|dbPath、dbName、port{等hsqldb的信息,启动h­sqldb?
在web.xml中配|?
<listener>
<listener-class>com.iplan.portal.framework.web.HsqlListener</listener-class­>
</listener>
q样在启动web容器的时候,同时启动了hsqldbQ关闭容器的时候同时也shutdown掉hsqldb?
ROWNUMҎ(gu)能的媄?br />
ROWNUM可以避免oracle在磁盘上q行排序。rownum无法避免全表扫描的发生,但是它可以避免对整个表数据的排序操作Q在指定了rownum后,排序操作在内存中可以L完成?/p>
如上图,事务2会报主键冲突的错误,而再h一下页面(再执行一边程序)Q可能就正常了?br />
q有一个问题,那就是完成生成主键的E序
Q一般情况包含plsql块)本n对于q发调用也是一个瓶颈,因ؓq样的程序段往往是提供给好多E序去调用,如果代码端写的不够优化(比如没有使用邦定?
量等{)Q或者此代码D存在问题,那么它所影响的是pȝ的全局。我们应该提倡开发h员用sequence。sequence消除了序列化问题Q而且改善
了应用的q发能力?/p>
sequence的命名最重要的是要统一Q命名规则是ơ要的?br />
CREATE SEQUENCE emp_sequence
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 10;
q?
里需要重点说明的是cache参数Q它是ؓ了应对ƈ发访问的。cache参数告诉oracle预先分配一个sequence
numbers的集合,q且保留在内存中Q以便sequence
number能够被快速的讉K。这个内存的大小是cache所指定的大,当多个用户同时访问一个sequence的时候,是在oracle
SGA中读取sequence当前的合理数|如果q发讉K太大Qcache的大不够,那么׃产生sequence
cache相关的等待(enq: SQ - contentionQ,影响pȝ性能?br />
既然cache涉及C内存Q那么就会想到oracle实例恢复的问题。如果数据库shutdown abortQsequence会如何呢Q当然会有问题,sequence number保存在内存里的但是没有被应用到表中的会丢失!
除了修改sequence的starting numberQ你什么都能改Q如果想改starting numberQ只能先drop然后create?br />
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE
CACHE 20;
?
改很有用Q最典型的情冉|“需要把sequence 的current value改大一点,避免E序报错Q?#8221;。你可以看看current
value是多,然后修改increment by _大的|然后执行.nextvalQ最后别忘了再将increnent
byҎ(gu)原来的|q要注意做这些工作的前提是当前没有h用此sequence?/p>
CURRVAL ?NEXTVAL 能够在以下情况?
insert的values字句、select中的select列表、update中的set字句
CURRVAL ?NEXTVAL 不能够在以下情况使用:
子查询、视囑֒实体化视囄查询、带distinct的select语句、带
group by和order
by的select语句、带union或intersect或minus的select语句、select中的where字句、create
table与alter table中的default倹{checkU束条g?/p>
drop sequence seq_a;
当删除sequence后,对应它的同义词会被保留,但是引用时会报错?/p>
oracleZ在rac环境下ؓ了sequence的一致性,使用了三U锁Qrow cache lock、SQ锁、SV锁?br />
row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextvalq程中保证序列的序性;
SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextvalq程中?br />
SV
锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创徏sequence时指定了cache
和order属?(cache+order)。order参数的目的是Z在RAC上节点之间生成sequence的顺序得C障?/p>
创徏sequence赋予的cacheD?yu)时Q有enq:sq-contention{待增加的趋ѝ?br /> cache的缺省值是20.因此创徏q发讉K多的sequenceӞcacheh值应取大一些。否则会发生enq:sq-contention{待事g?/p>
rac上创建sequenceӞ如果指定了cache大小而赋予noorder属性,则各节点会把不同范围的sequence值cache到内 存上。若两个节点之间都必通过依次递增方式使用sequenceQ必赋予如下的order属性(一般不需要这样做Q?sql> create sequence seq_b cache 100 order"。如果是已赋予了cache+order属性的sequenceQoracle使用SV锁进行同步。SV锁争用问题发生时的解x法与sq? 的情늛同,是cache D行适当调整?/p>
在RAC多节点环境下QSequence的Cache属性对性能的媄响很大。应该尽量赋予cache+noorder属性,q要l予_?
cache倹{如果需要保障顺序,必须赋予cache+order属性。但q时Z保障序Q实例之间需要不断的交换数据。因此性能E差?/p>
一Q引a
ORACLE数据库字W集Q即Oracle全球化支?Globalization Support)Q或卛_家语a支持QNLSQ其作用是用本国语言和格式来存储、处理和索数据。利用全球化支持QORACLE为用h供自q(zhn)的数据库母语环境,诸如日期格式、数字格式和存储序列{。Oracle可以支持多种语言及字W集Q其中oracle8i支持48U语a?6个国家地域?29U字W集Q而oracle9i则支?7U语a?8个国家地域?35U字W集。由于oracle字符集种cdQ且在存储、检索、迁Uoracle数据时多个环节与字符集的讄密切相关Q因此在实际的应用中Q数据库开发和理人员l常会遇到有关oracle字符集方面的问题。本文通过以下几个斚w阐述Q对oracle字符集做要分?/font>
二.字符集基本知?/font>
2.1字符?/font>
实质是按照一定的字符~码Ҏ(gu)Q对一l特定的W号Q分别赋予不同数值编码的集合。Oracle数据库最早支持的~码Ҏ(gu)是US7ASCII?/font>
Oracle的字W集命名遵@以下命名规则:
<Language><bit size><encoding>
? <语言><比特位数><~码>
比如: ZHS16GBK表示采用GBK~码格式?6位(两个字节Q简体中文字W集
2.2字符~码Ҏ(gu)
2.2.1 单字节编?/font>
Q?Q单字节7位字W集Q可以定?28个字W,最常用的字W集?/font>US7ASCII
Q?Q单字节8位字W集Q可以定?56个字W,适合于欧z大部分国家
例如QWE8ISO8859P1(西欧?位、ISO标准8859P1~码)
2.2.2 多字节编?/font>
Q?Q变长多字节~码
某些字符用一个字节表C,其它字符用两个或多个字符表示Q变长多字节~码常用于对亚洲语言的支持,例如日语、汉语、印地语{?/font>
例如QAL32UTF8Q其中AL代表ALL,指适用于所有语aQ?/font>zhs16cgb231280
Q?Q定长多字节~码
每一个字W都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节~码是AF16UTF16Q也是仅用于国家字符?/font>
2.2.3 unicode~码
Unicode是一个涵盖了目前全世界用的所有已知字W的单一~码Ҏ(gu)Q也是说Unicode为每一个字W提供唯一的编码。UTF-16是unicode?6位编码方式,是一U定长多字节~码Q用2个字节表CZ个unicode字符QAF16UTF16是UTF-16~码字符集?/font>
UTF-8是unicode?位编码方式,是一U变长多字节~码Q这U编码可以用1??个字节表CZ个unicode字符QAL32UTF8QUTF8、UTFE是UTF-8~码字符?/font>
2.3 字符集超U?/font>
当一U字W集Q字W集AQ的~码数值包含所有另一U字W集Q字W集BQ的~码数|q且两种字符集相同编码数g表相同的字符Ӟ则字W集A是字W集B的超U,或称字符集B是字W集A的子集?/font>
Oracle8i和oracle9i官方文档资料中备有子?对照表(subset-superset pairsQ,例如QWE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式,因此有许多字W集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集?/font>
2.4 数据库字W集Qoracle服务器端字符集)
数据库字W集在创建数据库时指定,在创建后通常不能更改。在创徏数据库时Q可以指定字W集(CHARACTER SET)和国家字W集(NATIONAL CHARACTER SET)?/font>
2.4.1 字符?/font>
(1)用来存储CHAR, VARCHAR2, CLOB, LONG{类型数?/font>
(2)用来标示诸如表名、列名以及PL/SQL变量{?/font>
(3)用来存储SQL和PL/SQLE序单元{?/font>
2.4.2 国家字符集:
(1)用以存储NCHAR, NVARCHAR2, NCLOB{类型数?/font>
(2)国家字符集实质上是ؓoracle选择的附加字W集Q主要作用是Z增强oracle的字W处理能力,因ؓNCHAR数据cd可以提供对亚z用定长多字节~码的支持,而数据库字符集则不能。国家字W集在oracle9i中进行了重新定义Q只能在unicode~码中的AF16UTF16和UTF8中选择Q默认值是AF16UTF16
2.4.3查询字符集参?/font>
可以查询以下数据字典或视图查看字W集讄情况
nls_database_parameters、props$?/font>v$nls_parameters
查询l果中NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示国家字符?/font>
2.4.4修改数据库字W集
按照上文所_数据库字W集在创建后原则上不能更攏V如果需要修改字W集Q通常需要导出数据库数据Q重建数据库Q再导入数据库数据的方式来{换,或通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字W集是有限制的,只有新的字符集是当前字符集的集时才能修Ҏ(gu)据库字符集,例如UTF8是US7ASCII的超集,修改数据库字W集可用ALTER DATABASE CHARACTER SET UTF8?/font>
2.5 客户端字W集QNLS_LANG参数Q?/font>
2.5.1 客户端字W集含义
客户端字W集定义了客L字符数据的编码方式,M发自或发往客户端的字符数据均用客L定义的字W集~码,客户端可以看作是能与数据库直接连接的各种应用Q例如sqlplus,exp/imp{。客L字符集是通过讄NLS_LANG参数来设定的?/font>
2.5.2 NLS_LANG参数格式
NLS_LANG=<language>_<territory>.<client character set>
Language:昄oracle消息,校验Q日期命?/font>
TerritoryQ指定默认日期、数字、货币等格式
Client character setQ指定客L用的字符?/font>
例如Q?/font>NLS_LANG=AMERICAN_AMERICA.US7ASCII
AMERICAN是语aQAMERICA是地区,US7ASCII是客L字符?/font>
2.5.3客户端字W集讄Ҏ(gu)
1)UNIX环境
$NLS_LANG=“simplified chinese”_china.zhs16gbk
$export NLS_LANG
~辑oracle用户的profile文g
2)Windows环境
~辑注册?/font>
Regedit.exe---HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0
2.5.4 NLS参数查询
Oracle提供若干NLS参数定制数据库和用户Z适应本地格式Q例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER{,可以通过查询以下数据字典或v$视图查看?/font>
NLS_DATABASE_PARAMETERS--昄数据库当前NLS参数取|包括数据库字W集取?/font>
NLS_SESSION_PARAMETERS--昄由NLS_LANG 讄的参敎ͼ或经qalter session 改变后的参数|不包括由NLS_LANG 讄的客L字符集)
NLS_INSTANCE_PARAMETE--昄由参数文件init<SID>.ora 定义的参数V$NLS_PARAMETERS--昄数据库当前NLS参数取?/font>
2.5.5修改NLS参数
使用下列Ҏ(gu)可以修改NLS参数
Q?Q修改实例启动时使用的初始化参数文g
Q?Q修改环境变?/font>NLS_LANG
Q?Q用ALTER SESSION语句Q在oracle会话中修?/font>
Q?Q用某些SQL函数
NLS作用优先U别QSql function>alter session>环境变量或注册表>参数文g>数据库默认参?/font>
三.导入/导出与字W集转换
3.1 EXP/IMP
Export ?Import 是一对读写Oracle数据的工兗Export ?Oracle 数据库中的数据输出到操作pȝ文g? Import 把这些文件中的数据读到Oracle 数据库中Q由于用exp/impq行数据q移Ӟ数据从源数据库到目标数据库的q程中有四个环节涉及到字W集Q如果这四个环节的字W集不一_会发生字符集{换?/font>
EXP
____________ _________________ _____________
|imp导入文g|<-|环境变量NLS_LANG|<-|数据库字W集|
------------ ----------------- -------------
IMP
____________ _________________ _____________
|imp导入文g|->|环境变量NLS_LANG|->|数据库字W集|
------------ ----------------- -------------
四个字符集是
Q?Q源数据库字W集
Q?QExportq程中用户会话字W集Q通过NLS_LANG讑֮Q?/font>
Q?QImportq程中用户会话字W集Q通过NLS_LANG讑֮Q?/font>
Q?Q目标数据库字符?/font>
3.2导出的{换过E?/font>
在Exportq程中,如果源数据库字符集与Export用户会话字符集不一_会发生字W集转换Qƈ在导出文件的头部几个字节中存储Export用户会话字符集的ID受在q个转换q程中可能发生数据的丢失?/font>
?如果源数据库使用ZHS16GBKQ而Export用户会话字符集用US7ASCIIQ由于ZHS16GBK?6位字W集,而US7ASCII?位字W集Q这个{换过E中Q中文字W在US7ASCII中不能够扑ֈ对等的字W,所以所有中文字W都会丢p变?#8220;?? ”形式Q这栯{换后生成的Dmp文g已经发生了数据丢失?/font>
因此如果x导出源数据库数据,则Exportq程中用户会话字W集应等于源数据库字W集或是源数据库字符集的集
3.3导入的{换过E?/font>
Q?Q确定导出数据库字符集环?/font>
通过d导出文g_可以获得导出文g的字W集讄
Q?Q确定导入session的字W集Q即导入Session使用的NLS_LANG环境变量
Q?QIMPd导出文g
d导出文g字符集IDQ和导入q程的NLS_LANGq行比较
Q?Q如果导出文件字W集和导入Session字符集相同,那么在这一步骤内就不需要{换,如果不同Q就需要把数据转换为导入Session使用的字W集。可以看出,导入数据到数据库q程中发生两ơ字W集转换
W一?导入文g字符集与导入Session使用的字W集之间的{换,如果q个转换q程不能正确完成QImport向目标数据库的导入过E也׃能完成?/font>
W二?导入Session字符集与数据库字W集之间的{换?/font>
然?oracle8i的这U{换只能在单字节字W集之间q行,oracle8i导入Session不支持多字节字符集之间的转换Q因此ؓ了避免第一ơ{换,导入Session使用的NLS_LANG与导出文件字W集相同Q第二次转换Q通过SQL*NetQ支持Q何两U字W集。以上情况在Oracle9i中略有不?/font>
四.q问题
oracle在数据存储、迁U过E中l常发生字符q问题Q归根到底是׃字符集用不当引赗下面以使用客户端sqlplus向数据库插入数据和导?导出QEXP/IMPQ过Eؓ例,说明q产生的原因?/font>
4.1使用客户端sqlplus向数据库存储数据
q个q程存在3个字W集讄
Q?Q客L应用字符?/font>
Q?Q客LNLS_LANG参数讄
Q?Q服务器端数据库字符?Character Set)讄
客户端应用sqlplus中能够显CZ么样的字W取决于客户端操作系l语a环境(客户端应用字W集)Q但在应用中录入q些字符后,q些字符能否在数据库中正常存储,q与另外两个字符集设|紧密相养I其中客户端NLS_LANG参数主要用于字符数据传输q程中的转换判断。常见的q大致有两U情形:
Q?Q汉字变成问?#8220;Q?#8221;Q?/font>
当从字符集A 转换成字W集BӞ如果转换字符之间不存在对应关p,NLS_LANG使用替代字符“Q?#8221;替代无法映射的字W?/font>
Q?Q汉字变成未知字W(虽然有些是汉字,但与原字W含义不同)
转换存在对应关系Q但字符集A 中的字符~码与字W集B 中的字符~码代表不同含义
4.2发生q原因
q产生是由于几个字W集之间转换不匹配造成Q分以下几种情况Q?/font>
Q注Q字W集之间如果不存在子集、超集对应关pL的情况不予考虑Q因U情况下字符集之间{换必产生qQ?/font>
1Q服务器端数据库字符集与客户端应用字W集相同Q与客户端NLS_LANG参数讄不同
如果客户端NLS_LANG字符集是其它两种字符集的子集Q{换过E将出现q?/font>
解决Ҏ(gu)Q将三种字符集设|成同一字符集,或NLS_LANG字符集是其它两种字符集的集
2Q服务器端数据库字符集与客户端NLS_LANG参数讄相同Q与客户端应用字W集不同
如果客户端应用字W集是其它两U字W集的超集时Q{换过E将出现qQ但对于单字节编码存储中文问题,可参看本文第5章节的分?/font>
3Q客L应用字符集、客LNLS_LANG参数讄、服务器端数据库字符集互不相?/font>
此种情况较ؓ复杂Q但三种字符集之间只要有不能转换的字W,则必产生q
4.3导入/导出q程出现q原因
q个q程存在4个字W集讄Q在3.1章节中已分析
Q?Q源数据库字W集
Q?QEXPq程中NLS_LANG参数
Q?QIMPq程中NLS_LANG参数
Q?Q目标数据库字符?/font>
出现q原因
1Q当源数据库字符集不{于EXPq程中NLS_LANG参数Q且源数据库字符集是EXPq程中NLS_LANG的子集,才能保证导出文g正确Q其他情况则导出文g字符q
2QEXPq程中NLS_LANG字符集不{于IMPq程中NLS_LANG字符集,且EXPq程中NLS_LANG字符集是IMPq程中NLS_LANG字符集的子, 才能保证W一ơ{换正常,否则W一ơ{换中出现q?/font>
3Q如果第一ơ{换正常,IMPq程中NLS_LANG字符集是目标数据库字W集的子集或相同Q才能保证第二次转换正常Q否则则W二ơ{换中出现q
五.单字节编码存储中文问?/font>
׃历史的原因,早期的oracle没有中文字符集(如oracle6、oracle7、oracle7.1Q?但有的用户从那时起就使用数据库了Qƈ用US7ASCII字符集存储了中文Q或是有的用户在创徏数据库时Q不考虑清楚Q随意选择一个默认的字符集,如WE8ISO8859P1或US7ASCIIQ而这两个字符集都没有汉字~码Q虽然有些时候选用q种字符集好象也能正怋用,但用q种字符集存储汉字信息从原则上说是错误的,它会l数据库的用与l护带来一pd的麻烦?/font>
正常情况下,要将汉字存入数据库,数据库字W集必须支持中文Q而将数据库字W集讄为US7ASCII{单字节字符集是不合适的。US7ASCII字符集只定义?28个符Pq不支持汉字。另外,如果在SQL*PLUS中能够输入中文,操作pȝ~省应该是支持中文的Q但如果在NLS_LANG中的字符集设|ؓUS7ASCIIQ显然也是不正确的,它没有反映客L的实际情c但在实际应用中汉字昄却是正确的,q主要是因ؓOracle查数据库与客L的字W集讄是同LQ那么数据在客户与数据库之间的存取过E中不发生M转换Q但是这实际上导致了数据库标识的字符集与实际存入的内Ҏ(gu)不相W的。而在SELECT的过E中QOracle同样查发现数据库与客L的字W集讄是相同的Q所以它也将存入的内容原不动地传送到客户端,而客L操作pȝ识别是汉字编码所以能够正显C?/font>
在这个例子中Q数据库与客L都没有设|成中文字符集,但却能正常显CZ文,从应用的角度看好象没问题。然而这里面却存在着极大的隐(zhn),比如在应用length或substr{字W串函数Ӟ可能得到意外的l果?/font>
对于早期使用US7ASCII字符集数据库的数据迁Udoracle8i/9i中(使用zhs16gbkQ,׃原始数据已经按照US7ASCII格式存储Q对于这U情况,可以通过使用Oracle8i的导出工P讄导出字符集ؓUS7ASCIIQ导出后使用UltraEdit{工h开dmp文gQ修改第二、三字符Q修?0001 ?354,q样可以将US7ASCII字符集的数据正确导入到ZHS16GBK的数据库中?/font>
六.l束?/font>
Z避免在数据库q移q程中由于字W集不同D的数据损失,oracle提供了字W集扫描工具Qcharacter set scannerQ,通过q个工具我们可以试在数据迁U过E中׃字符集{换可能带来的问题Q然后根据测试结果,定数据q移q程中最?jng)_W集解决Ҏ(gu)?/font>
来自J道Banq http://www.jdon.com/artichect/dbdead.htm
随着用户的爆发量增长Q在某个凌晨醒来Ӟ你发玎ͼ数据库已歅R?/p>
传统软gpȝ实则应该叫数据库软gpȝQ是一个数据库pȝQ开发这Lpȝ非常单,成本 也非怽廉,只要Ҏ(gu)需求先设计好数据表l构Q然后,找一些大学毕业生写大量SQL语句Q虽然还使用 JAVA/PHP/.NET{语aQ但实际上这些语a只是SQL送往数据库执行的q输工,没有什么h(hun)值和C?/p>
所以,q样的系l运行在互联|环境下以后Q主要负载就集中在数据库的SQLq行上,也就是说Q整个Y件系l性能关键点就集中在数据库上了Q数据库是性能 主角Q是王者;虽然你购|了昂贵的Websphere/weblogic{应用服务器Q但是由于Java只是q输工,Ҏ(gu)起不到性能上负载分担的作用?/p>
著名的社区网站MySpace是因ؓ一个好的ideaQ用L狂增长,但是pȝ却不能^滑承受增长的用户讉KQ这些用戯问网站缓慢、无法访问甚至丢失数据,他们l过几次伤筋动骨的架构升U,在微软SQLServer直接技术支持下Q? 好容易才勉强应付q去。看看他们痛苦经历,你是否也愿意再来一ơ呢Q详l情况: http://www.jdon.com/jivejdon/thread/34601.html
从中可以看出Q数据库性能微调和挖潜L有限度的Q对数据库性能优化提高性能的步伐永q赶不上用户增长量, 有h也提出数据库集群的概念,其实数据库集是一个骗人概念,一般只是备份,在集数量和failover上有制约Q? 否则Q数据库巨头Oracle不会跑到JavaEE阵营摇旗呐喊Q还最早推出EJB3服务器,q扬a要收购JavaEEq去老大 Bea Weblogic?/p>
很显Ӟ数据库成已经Y件系l的主要性能瓉了,单纯依靠数据库自救的方式已经行不通,是宣布数据库退Z角时候了Q那么由谁来宣布Q教皇数据库已死Q无疑是Java?/p>
JavaC早在本世U初提Z间g概念Q用以取代数据库CQ实则就是将软gpȝ主要负蝲从数据库上{Ud中间件服务器上,分担负蝲? 也就是说QJavaC提出Q既然数据库已经成ؓ瓉Q修修补补也无济于事Q不如放弃它Q不再依赖它?/p>
也就是说QJava不再做SQL的运输工Q不再是跑龙套的了,而是主角Q那么如何让Java成ؓ主角呢?那必M?a target="_blank">对象q个概念Q对象是生活在中间g服务器内存中Q它又是数据库数据的业务装Q它和数据库有着 千丝万缕的关p,但是它又?a target="_blank">关系数据库存在天然矛?/a>Q两者水火不宏V?/p>
q去Q我们是业务逻辑写成SQL送往数据库执行,D数据库成Z务逻辑主要q行瓉Q那么,如果我们? 业务逻辑用对象概念表达,而不是SQLQ那么我们的业务逻辑围l内存中的对象反复计,q样Q负载不是集中在 对象q行的中间g服务器上Q也是应用服务器Weblogic/websphere/JBoss/TomcatQ?而对?中间仉是用Java 语言表达的,无疑Q这L架构QJava才成Z角?/p>
再进一步想惻I如果我们从Y件系l开始之初,׃用对象分析设计,不与数据库沾边,整个程完全OOQ分析设计直至代码都摆脱了数据库影响Q这个流E如下:
分析建模 l化设计(通过Evans DDD) 架构设计 代码实现 调试试 部vq行?br />
那么数据库在什么时候徏立呢Q数据库表结构的创徏可以延缓到部|运行时Q由Hibernate/EJB CMP/JPA{ORM技术自动实现。这P
整个上游环节׃涉及数据库技术,而是使用更符合自然的表达OO方式QY件质量就更高了。我在J道网站已l大量阐qC如何从OO分析
到OO实现的过E,包括我的Jdon框架也直接支持这样一个自然方式?/p>
现在Q很多h已经理解Q分析设计要用OOQ但是数据库是运行阶D늼不了的Q确实,q是正确观点Q我们夺取数据库的王位,不是它打倒,只是理性和q移交权力重心而已Q数据库退Z角地位,让位于Java中间Ӟ也预C着q去数据库ؓ王的时代的结束, 但是数据库会和操作系l一P成ؓ我们C软gpȝ一个不可缺重要的基础环节?/p>
正是Zq样事实Q虽然我早在2005q喊?#8220;数据库时代的l结一文,回帖长达几百_
大部分是怀疑论Q不信论Q其?003q国外TSS有一?#8220;l数据库休息?/a>”
Q休息不代表退休,而是退居幕后,p操作pȝ作用一PQ由此可见,׃传统观点影响和不及时与国际新思想同步Q国内数据库保皇z还是有相当人数的。我
BanQ人微a轻,抛出q些观点被保皇派讥讽为所疯话Q那么看看,著名ORM框架Hibernate和SEAM框架创始人Gavin
King的一D观点:
In almost all enterprise applications, the database is the primary bottleneck, and the least scalable tier of the runtime environment. 数据库成Z大多C业应用的主要瓉Q也成ؓ了运行环境中最不具伸羃性的层?.. PHP/Ruby的用户会说什么都不共享(share nothingQ的架构照样h很好的~性,.... q些?c)真正想的?#8220;除了数据库以外什么都不共?Share nothing except for the database)”的架构。更?a target="_blank">参看q里
所谓~性,是Ҏ(gu),整个软g架构既支持小负蝲q行Q也支持大负载支持,只要增加服务器即可; ׃软gpȝ负蝲已经从SQL转移到内存中的对象上Q那么我们就可以通过增加q些应用服务器数量,通过分布式计甚至云计算Q达C务对象在多台应用服务 器之间传递共享,而不必通过数据库这个环节,既减L据库负蝲Q又能轻松扩充性能Q不必走 集中试大型主Z路,只要ȝ低廉PC服务器即可。经q权威测试:websphere/weblogic?0台PC服务?a href="javascript:window.location.href=encodeURI('http://www.jdon.com/jivejdon/query/searchThreadAction.shtml?query=%E9%9B%86%E7%BE%A4')" target="_blank">集群性能不亚于一台SUN/IBM的中型机Q性h(hun)比已l一目了然了?/p>
JavaEE的服务器?a href="javascript:window.location.href=encodeURI('http://www.jdon.com/jivejdon/query/searchThreadAction.shtml?query=%E9%9B%86%E7%BE%A4')">集群相对于Linux{操作系l?a href="javascript:window.location.href=encodeURI('http://www.jdon.com/jivejdon/query/searchThreadAction.shtml?query=%E9%9B%86%E7%BE%A4')" target="_blank">集群的好处在于:JavaEE集群能够针对某个J忙负蝲大的具体业务功能q行集群Q换句话_ 是做到_制导Q精解决问题,而显ӞLinux操作pȝ的集则无法直至业务核心的?/p>
从另外一个方面看Q虽然现在PHPLC对象路线QRuby的铁轨开始铺q企业,但是他们的运行环境实则依赖数据库的,
特别是Ruby On Railsq是最适合Evans DDD对象建模路线Q但是目前来讲还?披着皮的狼"Q批着DDDQ实则是以数据库中心。当然相?
ROR{将来会提供分布式计环境,但是JavaEE?002q时通过EJB以及分布式缓?/a>成熟E_地提供分布式计算的中间gQƈ且已l大量成熟应用?/p>
本文l束以前Q我怿大家明白Q在众多语言q_竞争中,Z么Java能够击|q去拳王数据库,夺得新的拳王冠军Q以及他的特Ҏ(gu)在。有人可能会_你忘记谈.NET了,q个不用我回{你Q用微Y中国董事长张亚勤的话回答Q?a target="_blank">8q前.NET战略很天?/a>Q?
你会你的重要业务企业计依赖一个很天真不成熟的技术吗Q除非你自己也很天真:)?/p>