随笔:-4 文章:58 评论:4 引用:0
首页 发新随笔
发新文章 联系 聚合管理

2009年9月15日

volatile:
      Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。 而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。 使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。     由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
Synchronized:
防止多个线程同时访问相同的代码段。
Transient:
表明类序列化时,变量不必序列化。
posted @ 2010-04-09 13:47 久久不醉 阅读(119) | 评论 (0)编辑 收藏
 

配置一个数据源
    Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0。可以在Spring配置文件中利用这两者中任何一个配置数据源。

 DBCP数据源
    DBCP类包位于 <spring_home></spring_home>/lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖 Jakarta commons-pool对象池机制的数据库连接池,所以在类路径下还必须包括<spring_home></spring_home>/lib/jakarta- commons/commons-pool.jar。下面是使用DBCP配置MySql数据源的配置片断:

xml 代码
  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"       
  2.         destroy-method="close">       
  3.     <property name="driverClassName" value="com.mysql.jdbc.Driver" />      
  4.     <property name="url" value="jdbc:mysql://localhost:3309/sampledb" />      
  5.     <property name="username" value="root" />      
  6.     <property name="password" value="1234" />      
  7. </bean>  

BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method=”close”属性, 以便Spring容器关闭时,数据源能够正常关闭。除以上必须的数据源属性外,还有一些常用的属性:
    defaultAutoCommit:设置从数据源中返回的连接是否采用自动提交机制,默认值为 true;
    defaultReadOnly:设置数据源是否仅能执行只读操作, 默认值为 false;
    maxActive:最大连接数据库连接数,设置为0时,表示没有限制;
    maxIdle:最大等待连接中的数量,设置为0时,表示没有限制;
    maxWait:最大等待秒数,单位为毫秒, 超过时间会报出错误信息;
    validationQuery:用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据, 如你可以简单地设置为:“select count(*) from user”;
    removeAbandoned:是否自我中断,默认是 false ;
    removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值;
    logAbandoned:是否记录中断事件, 默认为 false;

C3P0数据源
    C3P0是一个开放源代码的JDBC数据源实现项目,它在lib目录中与Hibernate一起发布,实现了JDBC3和JDBC2扩展规范说明的 Connection 和Statement 池。C3P0类包位于<spring_home></spring_home>/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一个 Oracle数据源:

xml 代码
  1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"       
  2.         destroy-method="close">      
  3.     <property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/>      
  4.     <property name="jdbcUrl" value=" jdbc:oracle:thin:@localhost:1521:ora9i "/>      
  5.     <property name="user" value="admin"/>      
  6.     <property name="password" value="1234"/>      
  7. </bean>  

ComboPooledDataSource和BasicDataSource一样提供了一个用于关闭数据源的close()方法,这样我们就可以保证Spring容器关闭时数据源能够成功释放。
    C3P0拥有比DBCP更丰富的配置属性,通过这些属性,可以对数据源进行各种有效的控制:
    acquireIncrement:当连接池中的连接用完时,C3P0一次性创建新连接的数目;
    acquireRetryAttempts:定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30;
    acquireRetryDelay:两次连接中间隔时间,单位毫秒,默认为1000;
    autoCommitOnClose:连接关闭时默认将所有未提交的操作回滚。默认为false;
    automaticTestTable: C3P0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数,那么属性preferredTestQuery将被忽略。你 不能在这张Test表上进行任何操作,它将中为C3P0测试所用,默认为null;
    breakAfterAcquireFailure:获取连接失败将会引起所有等待获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调   用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认为 false;
    checkoutTimeout:当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒,默认为0;
    connectionTesterClassName: 通过实现ConnectionTester或QueryConnectionTester的类来测试连接,类名需设置为全限定名。默认为 com.mchange.v2.C3P0.impl.DefaultConnectionTester; 
    idleConnectionTestPeriod:隔多少秒检查所有连接池中的空闲连接,默认为0表示不检查;
    initialPoolSize:初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值。默认为3;
    maxIdleTime:最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0;
    maxPoolSize:连接池中保留的最大连接数。默认为15;
    maxStatements:JDBC的标准参数,用以控制数据源内加载的PreparedStatement数量。但由于预缓存的Statement属 于单个Connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素,如果maxStatements与 maxStatementsPerConnection均为0,则缓存被关闭。默认为0;
    maxStatementsPerConnection:连接池内单个连接所拥有的最大缓存Statement数。默认为0;
    numHelperThreads:C3P0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作同时被执行。默认为3;
    preferredTestQuery:定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个参数能显著提高测试速度。测试的表必须在初始数据源的时候就存在。默认为null;
    propertyCycle: 用户修改系统配置参数执行前最多等待的秒数。默认为300;
    testConnectionOnCheckout:因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都 将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。默认为false;
    testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。默认为false。

读配置文件的方式引用属性:

  1. <bean id="propertyConfigurer"     
  2.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">      
  3.     <property name="location" value="/WEB-INF/jdbc.properties"/>      
  4. </bean>      
  5. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"       
  6.         destroy-method="close">      
  7.     <property name="driverClassName" value="${jdbc.driverClassName}" />      
  8.     <property name="url" value="${jdbc.url}" />      
  9.     <property name="username" value="${jdbc.username}" />      
  10.     <property name="password" value="${jdbc.password}" />      
  11. </bean>   

    在jdbc.properties属性文件中定义属性值:
    jdbc.driverClassName= com.mysql.jdbc.Driver
    jdbc.url= jdbc:mysql://localhost:3309/sampledb
    jdbc.username=root
    jdbc.password=1234
    提示 经常有开发者在${xxx}的前后不小心键入一些空格,这些空格字符将和变量合并后作为属性的值。如: <property name="username" value=" ${jdbc.username} "></property> 的属性配置项,在前后都有空格,被解析后,username的值为“ 1234 ”,这将造成最终的错误,因此需要特别小心。

 获取JNDI数据源
    如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源 使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。下面是一个简单的配置:

xml 代码
  1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">      
  2.     <property name="jndiName" value="java:comp/env/jdbc/bbt"/>      
  3. </bean>  

通过jndiName指定引用的JNDI数据源名称。
    Spring 2.0为获取J2EE资源提供了一个jee命名空间,通过jee命名空间,可以有效地简化J2EE资源的引用。下面是使用jee命名空间引用JNDI数据源的配置:

xml 代码
  1. <beans xmlns=http://www.springframework.org/schema/beans    
  2. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance    
  3. xmlns:jee=http://www.springframework.org/schema/jee    
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans     
  5. http://www.springframework.org/schema/beans/spring-beans-2.0.xsd     
  6. http://www.springframework.org/schema/jee    
  7. http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">      
  8. <jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/bbt"/>      
  9. </beans>  

Spring的数据源实现类
    Spring本身也提供了一个简单的数据源实现类DriverManagerDataSource ,它位于org.springframework.jdbc.datasource包中。这个类实现了javax.sql.DataSource接口,但 它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试 或简单的独立应用中使用,因为它不需要额外的依赖类。
     下面,我们来看一下DriverManagerDataSource的简单使用:
当然,我们也可以通过配置的方式直接使用DriverManagerDataSource。

java 代码
  1. DriverManagerDataSource ds = new DriverManagerDataSource ();      
  2. ds.setDriverClassName("com.mysql.jdbc.Driver");      
  3. ds.setUrl("jdbc:mysql://localhost:3309/sampledb");      
  4. ds.setUsername("root");      
  5. ds.setPassword("1234");      
  6. Connection actualCon = ds.getConnection();  

 

小结

    不管采用何种持久化技术,都需要定义数据源。Spring附带了两个数据源的实现类包,你可以自行选择进行定义。在实际部署时,我们可能会直接采用应用服 务器本身提供的数据源,这时,则可以通过JndiObjectFactoryBean或jee命名空间引用JNDI中的数据源。

DBCP与C3PO配置的区别:

C3PO :DBCP:

xml 代码
  1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
  2.     <property name="driverClass">  
  3.         <value>oracle.jdbc.driver.OracleDriver</value>  
  4.     </property>  
  5.     <property name="jdbcUrl">             
  6.         <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseName</value>  
  7.      </property>  
  8.     <property name="user">  
  9.         <value>testAdmin</value>  
  10.     </property>  
  11.     <property name="password">  
  12.         <value>123456</value>  
  13.     </property>  
  14. </bean>  

 

xml 代码
  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2.     <property name="driverClassName">  
  3.         <value>oracle.jdbc.driver.OracleDriver</value>  
  4.     </property>  
  5.     <property name="url">             
  6.         <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseName</value>  
  7.      </property>  
  8.     <property name="username">  
  9.         <value>testAdmin</value>  
  10.     </property>  
  11.     <property name="password">  
  12.         <value>123456</value>  
  13.     </property>  
  14. </bean>  
posted @ 2010-03-03 14:12 久久不醉 阅读(175) | 评论 (0)编辑 收藏
 

oracle xe universal默认创建AL32UTF8字符集,这种字符集1个汉字占用3个字节,而
ZHS16GBK字符集1个汉字占用2个字节,为了节约空间,我尝试改变数据库的字符集,
但是失败了,因为新字符集不是旧字符集的超集。即使用restrict模式也不行。
考虑到oracle xe 安装时只是建一个空库,仅包含系统表空间等,设想通过手工执行
创建ZHS16GBK字符集数据库的办法实现。
从sybex的10g ocp教材中复制并修改得下面语句,其中E:\ORADATA\TEST是我们要存放
新数据库物理文件的目录,以和旧数据库区分。


CREATE DATABASE XE
CONTROLFILE REUSE
LOGFILE
GROUP 1 'E:\ORADATA\TEST\REDO01.LOG' SIZE 10M,
GROUP 2 'E:\ORADATA\TEST\REDO02.LOG' SIZE 10M,
GROUP 3 'E:\ORADATA\TEST\REDO03.LOG' SIZE 10M
DATAFILE 'E:\ORADATA\TEST\SYSTEM01.DBF' SIZE 400M
AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE 'E:\ORADATA\TEST\SYSAUX01.DBF' SIZE 250M
AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE temp
TEMPFILE 'E:\ORADATA\TEST\TEMP01.DBF' SIZE 100M
AUTOEXTEND ON NEXT 100M MAXSIZE 8000M
UNDO TABLESPACE undo
DATAFILE 'E:\ORADATA\TEST\undo01.DBF' SIZE 200M
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16
USER SYS IDENTIFIED BY SYS
USER SYSTEM IDENTIFIED BY SYS
;
在执行这个脚本以前,有3点要注意:
1 要修改F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\init.ora'

F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
把所有路径改成E:\ORADATA\TEST及其子目录,为此我们需要在E:\ORADATA\TEST下建立
bdump等目录,这些目录可以从现有的XE数据库F:\oraclexe\app\oracle\admin\XE复制得到。

2 要去掉EXTENT MANAGEMENT LOCAL语句否则执行出错。(没有找出原因)

CREATE DATABASE XE
*
第 1 行出现错误:
ORA-25146: EXTENT MANAGEMENT ?????

3 test.ora中的db_name不能改变,否则执行出错。(没有找出原因)
ORA-02778: Name given for the log directory is invalid

具体执行步骤(以Windows XP为例)
1在cmd命令行窗口执行 net start oracleservicexe
C:\Documents and Settings\Administrator>net start oracleservicexe
OracleServiceXE 服务正在启动 .........
OracleServiceXE 服务已经启动成功。

2 以sys用户登录
C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 5月 30 22:07:45 2006

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn / as sysdba
已连接。
3 查看现有的字符集设置
SQL> set lines 140
SQL> select * from nls_database_parameters;

PARAMETER
------------------------------------------------------------
VALUE
-------------------------------------------------------------------
------------------------------------------------------------
NLS_LANGUAGE
AMERICAN

NLS_TERRITORY
AMERICA

NLS_CURRENCY
$

NLS_ISO_CURRENCY
AMERICA

NLS_NUMERIC_CHARACTERS
.,

NLS_CHARACTERSET
AL32UTF8

NLS_CALENDAR
GREGORIAN

NLS_DATE_FORMAT
DD-MON-RR

NLS_DATE_LANGUAGE
AMERICAN

NLS_SORT
BINARY

NLS_TIME_FORMAT
HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT
DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT
HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT
DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY
$

NLS_COMP
BINARY

NLS_LENGTH_SEMANTICS
BYTE

NLS_NCHAR_CONV_EXCP
FALSE

NLS_NCHAR_CHARACTERSET
AL16UTF16

NLS_RDBMS_VERSION
10.2.0.1.0


已选择20行。

SQL> select lengthb('择') from dual;

LENGTHB('择')
-------------
            3

已选择 1 行。

我们可以看到,当前AL32UTF8字符集1个汉字占用3个字节
4 关闭数据库,但不停止服务
QL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
5 用修改过的pfile test.ora启动数据库(nomount)
SQL> startup nomount pfile='F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
ORACLE 例程已经启动。

Total System Global Area  285212672 bytes
Fixed Size                  1287016 bytes
Variable Size              92277912 bytes
Database Buffers          188743680 bytes
Redo Buffers                2904064 bytes
6 执行建立数据库脚本
SQL> CREATE DATABASE XE
  2  CONTROLFILE REUSE
  3  LOGFILE
  4  GROUP 1 'E:\ORADATA\TEST\REDO01.LOG' SIZE 10M,
  5  GROUP 2 'E:\ORADATA\TEST\REDO02.LOG' SIZE 10M,
  6  GROUP 3 'E:\ORADATA\TEST\REDO03.LOG' SIZE 10M
  7  DATAFILE 'E:\ORADATA\TEST\SYSTEM01.DBF' SIZE 400M
  8  AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED
  9  SYSAUX DATAFILE 'E:\ORADATA\TEST\SYSAUX01.DBF' SIZE 250M
 10  AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED
 11  DEFAULT TEMPORARY TABLESPACE temp
 12  TEMPFILE 'E:\ORADATA\TEST\TEMP01.DBF' SIZE 100M
 13  AUTOEXTEND ON NEXT 100M MAXSIZE 8000M
 14  UNDO TABLESPACE undo
 15  DATAFILE 'E:\ORADATA\TEST\undo01.DBF' SIZE 200M
 16  AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
 17  CHARACTER SET ZHS16GBK
 18  NATIONAL CHARACTER SET AL16UTF16
 19  USER SYS IDENTIFIED BY SYS
 20  USER SYSTEM IDENTIFIED BY SYS
 21  ;

数据库已创建。
7 执行创建数据字典和程序包的系统SQL脚本
@F:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catalog.sql
@F:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catproc.sql
大约需要10几分钟
8 关闭数据库,但不停止服务
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
9 用修改过的pfile test.ora启动数据库
SQL> startup  pfile='F:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora'
ORACLE 例程已经启动。

Total System Global Area  285212672 bytes
Fixed Size                  1287016 bytes
Variable Size              92277912 bytes
Database Buffers          188743680 bytes
Redo Buffers                2904064 bytes
数据库装载完毕。
数据库已经打开。
10 查看新建数据库的字符集设置
SQL> set lines 140
SQL> select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ -------------------------------------------------
-------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               ZHS16GBK
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              AMERICAN
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY              $
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_RDBMS_VERSION              10.2.0.1.0

已选择20行。

SQL> select lengthb('A') from dual;

LENGTHB('A')
------------
           1

已选择 1 行。

SQL> select lengthb('择') from dual;

LENGTHB('择')
-------------
            2

已选择 1 行。
可见我们新的数据库的确是ZHS16GBK字符集,1个汉字占用2个字节
11 要启动旧数据库(因为新旧数据库同名,而且oracle xe限制同时只能打开一个数据库)
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  285212672 bytes
Fixed Size                  1287016 bytes
Variable Size              96472216 bytes
Database Buffers          184549376 bytes
Redo Buffers                2904064 bytes
数据库装载完毕。
数据库已经打开。

----

如果以后要用spfile自动新建数据库
SQL> create spfile from pfile='D:\oraclexe\app\oracle\product\10.2.0\server\config\scripts\test.ora';

文件已创建。

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 285212672 bytes
Fixed Size 1287016 bytes
Variable Size 92277912 bytes
Database Buffers 188743680 bytes
Redo Buffers 2904064 bytes
数据库装载完毕。
数据库已经打开。
SQL> select lengthb('择') from dual;

LENGTHB('择')
-------------
2

已选择 1 行。

远程登录,客户端也需要10g
SQL> conn system/sys@//10.6.xx.xx:1521/XE
已连接。
SQL> conn sys/sys@//10.6.xx.xx:1521/XE as sysdba
已连接。

[url]http://www.itpub.net/558697.html[/url]
的问题也算得到了解决

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/l1t/archive/2006/05/31/765125.aspx

posted @ 2009-12-28 15:17 久久不醉 阅读(614) | 评论 (0)编辑 收藏
 

        数据字典dict总是属于Oracle用户sys的。
  1、用户:
   select username from dba_users;
  改口令
   alter user spgroup identified by spgtest;
  2、表空间:
   select * from dba_data_files;
   select * from dba_tablespaces;//表空间

   select tablespace_name,sum(bytes), sum(blocks)
    from dba_free_space group by tablespace_name;//空闲表空间

   select * from dba_data_files
    where tablespace_name='RBS';//表空间对应的数据文件

   select * from dba_segments
    where tablespace_name='INDEXS';
  3、数据库对象:
   select * from dba_objects;
   CLUSTER、DATABASE LINK、FUNCTION、INDEX、LIBRARY、PACKAGE、PACKAGE BODY、
   PROCEDURE、SEQUENCE、SYNONYM、TABLE、TRIGGER、TYPE、UNDEFINED、VIEW。
  4、表:
   select * from dba_tables;
   analyze my_table compute statistics;->dba_tables后6列
   select extent_id,bytes from dba_extents
   where segment_name='CUSTOMERS' and segment_type='TABLE'
   order by extent_id;//表使用的extent的信息。segment_type='ROLLBACK'查看回滚段的空间分配信息
   列信息:
    select distinct table_name
    from user_tab_columns
    where column_name='SO_TYPE_ID';
  5、索引: 
   select * from dba_indexes;//索引,包括主键索引
   select * from dba_ind_columns;//索引列
   select i.index_name,i.uniqueness,c.column_name
    from user_indexes i,user_ind_columns c
     where i.index_name=c.index_name
     and i.table_name ='ACC_NBR';//联接使用
  6、序列:
   select * from dba_sequences;
  7、视图:
   select * from dba_views;
   select * from all_views;
  text 可用于查询视图生成的脚本
  8、聚簇:
   select * from dba_clusters;
  9、快照:
   select * from dba_snapshots;
  快照、分区应存在相应的表空间。
  10、同义词:
   select * from dba_synonyms
    where table_owner='SPGROUP';
    //if owner is PUBLIC,then the synonyms is a public synonym.
     if owner is one of users,then the synonyms is a private synonym.
  11、数据库链:
   select * from dba_db_links;
  在spbase下建数据库链
   create database link dbl_spnew
   connect to spnew identified by spnew using 'jhhx';
   insert into acc_nbr@dbl_spnew
   select * from acc_nbr where nxx_nbr='237' and line_nbr='8888';
  12、触发器:
   select * from dba_trigers;
  存储过程,函数从dba_objects查找。
  其文本:select text from user_source where name='BOOK_SP_EXAMPLE';
  建立出错:select * from user_errors;
  oracle总是将存储过程,函数等软件放在SYSTEM表空间。
  13、约束:
  (1)约束是和表关联的,可在create table或alter table table_name add/drop/modify来建立、修改、删除约束。
  可以临时禁止约束,如:
   alter table book_example
   disable constraint book_example_1;
   alter table book_example
   enable constraint book_example_1;
  (2)主键和外键被称为表约束,而not null和unique之类的约束被称为列约束。通常将主键和外键作为单独的命名约束放在字段列表下面,而列约束可放在列定义的同一行,这样更具有可读性。
  (3)列约束可从表定义看出,即describe;表约束即主键和外键,可从dba_constraints和dba_cons_columns 查。
   select * from user_constraints
   where table_name='BOOK_EXAMPLE';
   select owner,CONSTRAINT_NAME,TABLE_NAME
    from user_constraints
    where constraint_type='R'
    order by table_name;
  (4)定义约束可以无名(系统自动生成约束名)和自己定义约束名(特别是主键、外键)
  如:create table book_example
    (identifier number not null);
    create table book_example
    (identifier number constranit book_example_1 not null);
  14、回滚段:
  在所有的修改结果存入磁盘前,回滚段中保持恢复该事务所需的全部信息,必须以数据库发生的事务来相应确定其大小(DML语句才可回滚,create,drop,truncate等DDL不能回滚)。
  回滚段数量=并发事务/4,但不能超过50;使每个回滚段大小足够处理一个完整的事务;
   create rollback segment r05
   tablespace rbs;
   create rollback segment rbs_cvt
   tablespace rbs
   storage(initial 1M next 500k);
  使回滚段在线
   alter rollback segment r04 online;
  用dba_extents,v$rollback_segs监测回滚段的大小和动态增长。
  回滚段的区间信息
   select * from dba_extents
   where segment_type='ROLLBACK' and segment_name='RB1';
  回滚段的段信息,其中bytes显示目前回滚段的字节数
   select * from dba_segments
    where segment_type='ROLLBACK' and segment_name='RB1';
  为事物指定回归段
   set transaction use rollback segment rbs_cvt
  针对bytes可以使用回滚段回缩。
   alter rollback segment rbs_cvt shrink;
   select bytes,extents,max_extents from dba_segments
    where segment_type='ROLLBACK' and segment_name='RBS_CVT';
  回滚段的当前状态信息:
   select * from dba_rollback_segs
    where segment_name='RB1';
  比多回滚段状态status,回滚段所属实例instance_num
  查优化值optimal
   select n.name,s.optsize
    from v$rollname n,v$rollstat s
     where n.usn=s.usn;
  回滚段中的数据
   set transaction use rollback segment rb1;/*回滚段名*/
   select n.name,s.writes
    from v$rollname n,v$rollstat s
     where n.usn=s.usn;
  当事务处理完毕,再次查询$rollstat,比较writes(回滚段条目字节数)差值,可确定事务的大小。
  查询回滚段中的事务
   column rr heading 'RB Segment' format a18
   column us heading 'Username' format a15
   column os heading 'Os User' format a10
   column te heading 'Terminal' format a10
   select r.name rr,nvl(s.username,'no transaction') us,s.osuser os,s.terminal te
    from v$lock l,v$session s,v$rollname r
     where l.sid=s.sid(+)
     and trunc(l.id1/65536)=R.USN
     and l.type='TX'
     and l.lmode=6
   order by r.name;
  15、作业
  查询作业信息
   select job,broken,next_date,interval,what from user_jobs;
   select job,broken,next_date,interval,what from dba_jobs;
  查询正在运行的作业
   select * from dba_jobs_running;
  使用包exec dbms_job.submit(:v_num,'a;',sysdate,'sysdate + (10/(24*60*60))')加入作业。间隔10秒钟
exec dbms_job.submit(:v_num,'a;',sysdate,'sysdate + (11/(24*60))')加入作业。间隔11分钟使用包exec dbms_job.remove(21)删除21号作业。

posted @ 2009-12-22 15:56 久久不醉 阅读(120) | 评论 (0)编辑 收藏
 
一、什么是Java事务
通常的观念认为,事务仅与数据库相关。
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。
通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系?
实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。因此,数据库操作的事务习惯上就称为Java事务。
二、为什么需要事务
事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。具一个简单例子:比如银行转帐业务,账户A要将自己账户上的1000元转到B账户下面,A账户余额首先要减去1000元,然后B账户要增加1000元。假如在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中断而操作失败,那么整个业务失败,必须做出控制,要求A账户转帐业务撤销。这才能保证业务的正确性,完成这个操走就需要事务,将A账户资金减少和B账户资金增加方到一个事务里面,要么全部执行成功,要么操作全部撤销,这样就保持了数据的安全性。
三、Java事务的类型
Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。
1、JDBC事务
JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 java.sql.Connection 提供了以下控制事务的方法:
public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。
2、JTA(Java Transaction API)事务
JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。
JTA允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC驱动程序的JTA支持极大地增强了数据访问能力。
如果计划用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。
您将需要用应用服务器的管理工具设置 XADataSource 。从应用服务器和 JDBC 驱动程序的文档中可以了解到相关的指导。
J2EE 应用程序用 JNDI 查询数据源。一旦应用程序找到了数据源对象,它就调用 javax.sql.DataSource.getConnection() 以获得到数据库的连接。
XA 连接与非 XA 连接不同。一定要记住 XA 连接参与了 JTA 事务。这意味着 XA 连接不支持 JDBC 的自动提交功能。同时,应用程序一定不要对 XA 连接调用 java.sql.Connection.commit() 或者 java.sql.Connection.rollback() 。相反,应用程序应该使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() 。
3、容器事务
容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。相对编码实现JTA事务管理,我们可以通过EJB容器提供的容器事务管理机制(CMT)完成同一个功能,这项功能由J2EE应用服务器提供。这使得我们可以简单的指定将哪个方法加入事务,一旦指定,容器将负责事务管理任务。这是我们土建的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给J2EE容器去解决。使用EJB CMT的另外一个好处就是程序员无需关心JTA API的编码,不过,理论上我们必须使用EJB。
四、三种事务差异
1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
五、总结
事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC 连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务。
参考资料:
《Pro Spring》
posted @ 2009-09-23 16:19 久久不醉 阅读(139) | 评论 (0)编辑 收藏
 
     摘要: 一、cookie机制和session机制的区别 *************************************************************************************        具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态...  阅读全文
posted @ 2009-09-22 15:54 久久不醉 阅读(117) | 评论 (0)编辑 收藏
 
在SQL语句优化过程中,经常会用到hint, 
以下是在SQL优化过程中常见Oracle中"HINT"的30个用法1. /*+ALL_ROWS*/ 
表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 
例如: 
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 

2. /*+FIRST_ROWS*/ 
表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化. 
例如: 
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 

3. /*+CHOOSE*/ 
表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量; 
表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法; 
例如: 
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 

4. /*+RULE*/ 
表明对语句块选择基于规则的优化方法. 
例如: 
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 

5. /*+FULL(TABLE)*/ 
表明对表选择全局扫描的方法. 
例如: 
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT'; 

6. /*+ROWID(TABLE)*/ 
提示明确表明对指定表根据ROWID进行访问. 
例如: 
SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA' 
AND EMP_NO='SCOTT'; 

7. /*+CLUSTER(TABLE)*/ 
提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效. 
例如: 
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS 
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 

8. /*+INDEX(TABLE INDEX_NAME)*/ 
表明对表选择索引的扫描方法. 
例如: 
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M'; 

9. /*+INDEX_ASC(TABLE INDEX_NAME)*/ 
表明对表选择索引升序的扫描方法. 
例如: 
SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT'; 

10. /*+INDEX_COMBINE*/ 
为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的布尔组合方式. 
例如: 
SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS 
WHERE SAL<5000000 AND HIREDATE<SYSDATE; 

11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/ 
提示明确命令优化器使用索引作为访问路径. 
例如: 
SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE 
FROM BSEMPMS WHERE SAL<60000; 

12. /*+INDEX_DESC(TABLE INDEX_NAME)*/ 
表明对表选择索引降序的扫描方法. 
例如: 
SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT'; 

13. /*+INDEX_FFS(TABLE INDEX_NAME)*/ 
对指定的表执行快速全索引扫描,而不是全表扫描的办法. 
例如: 
SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305'; 

14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/ 
提示明确进行执行规划的选择,将几个单列索引的扫描合起来. 
例如: 
SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306'; 

15. /*+USE_CONCAT*/ 
对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询. 
例如: 
SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M'; 

16. /*+NO_EXPAND*/ 
对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展. 
例如: 
SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M'; 

17. /*+NOWRITE*/ 
禁止对查询块的查询重写操作. 

18. /*+REWRITE*/ 
可以将视图作为参数. 

19. /*+MERGE(TABLE)*/ 
能够对视图的各个查询进行相应的合并. 
例如: 
SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO 
,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO 
AND A.SAL>V.AVG_SAL; 

20. /*+NO_MERGE(TABLE)*/ 
对于有可合并的视图不再合并. 
例如: 
SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL; 

21. /*+ORDERED*/ 
根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接. 
例如: 
SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1; 

22. /*+USE_NL(TABLE)*/ 
将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表. 
例如: 
SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 

23. /*+USE_MERGE(TABLE)*/ 
将指定的表与其他行源通过合并排序连接方式连接起来. 
例如: 
SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 

24. /*+USE_HASH(TABLE)*/ 
将指定的表与其他行源通过哈希连接方式连接起来. 
例如: 
SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 

25. /*+DRIVING_SITE(TABLE)*/ 
强制与ORACLE所选择的位置不同的表进行查询执行. 
例如: 
SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO; 

26. /*+LEADING(TABLE)*/ 
将指定的表作为连接次序中的首表. 

27. /*+CACHE(TABLE)*/ 
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端 
例如: 
SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS; 

28. /*+NOCACHE(TABLE)*/ 
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端 
例如: 
SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS; 

29. /*+APPEND*/ 
直接插入到表的最后,可以提高速度. 
insert /*+append*/ into test1 select * from test4 ; 

30. /*+NOAPPEND*/ 
通过在插入语句生存期内停止并行模式来启动常规插入. 
insert /*+noappend*/ into test1 select * from test4 ;

posted @ 2009-09-15 16:11 久久不醉 阅读(103) | 评论 (0)编辑 收藏
CALENDER
<2009年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

留言簿

随笔档案(54)

文章分类

搜索

  •  

最新评论


Powered By: 博客园
模板提供沪江博客