2012年12月1日

Oracle 临时表空间暴涨(转)

http://blog.csdn.net/weikaifenglove/article/details/4059258            昨天在做测试的时候发现一个非常奇怪的问题:在程序的查询模块中做查询的时候,开始速度很快,但是过了一段时间以后速度就变慢,最后干脆就报错,不工作了。在排错的过程中,发现Oracle临时表空间暴涨,达到了几十个GB,在Oracle中对Session进行跟踪,发现磁盘空间还在不停的消耗,几乎是每隔5s,临时表空间就会增长500MB左右,最后报错的原因应该是因为没有磁盘空间可以分配造成的。这是一件十分恐怖的事情。

        我们知道Oracle临时表空间主要是用来做查询和存放一些缓存的数据的,磁盘消耗的一个主要原因是需要对查询的结果进行排序,如果没有猜错的话,在磁盘空间的(内存)的分配上,Oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。像上文提到的恐怖现象经过分析可能是以下几个方面的原因造成的。
        1. 没有为临时表空间设置上限,而是允许无限增长。但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。
        2.查询的时候连表查询中使用的表过多造成的。我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。
       3.对查询的某些字段没有建立索引。Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间,而如果有索引的话,一般只是将索引的数据复制到临时表空间中。
       针对以上的分析,对查询的语句和索引进行了优化,情况得到缓解,但是需要进一步测试。

       总结:
       1.SQL语句是会影响到磁盘的消耗的,不当的语句会造成磁盘暴涨。
       2.对查询语句需要仔细的规划,不要想当然的去定义一个查询语句,特别是在可以提供用户自定义查询的软件中。
       3.仔细规划表索引。

临时表空间使用注意:
1.临时表空间 是用于在进行排序操作(如大型查询,创建索引和联合查询期间存储临时数据)
每个用户都有一个临时表空间
2.对于大型操作频繁,(大型查询,大型分类查询,大型统计分析等),应指定单独的临时表空间,以方便管理

3.分配用户单独临时表空间,一般是针对 大型产品数据库,OLTP数据库,数据库仓库
对于小型产品不需要单独制定临时表空间,使用默认临时表空间
原文链接:
http://blog.csdn.net/weikaifenglove/article/details/4059258

posted @ 2013-09-02 13:51 Alter 阅读(277) | 评论 (0)编辑 收藏

完整java开发中JDBC连接数据库代码和步骤

  1. JDBC连接数据库   
  2. •创建一个以JDBC连接数据库的程序,包含7个步骤:   
  3.  1、加载JDBC驱动程序:   
  4.     在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),   
  5.     这通过java.lang.Class类的静态方法forName(String  className)实现。   
  6.     例如:   
  7.     try{   
  8.     //加载MySql的驱动类   
  9.     Class.forName("com.mysql.jdbc.Driver") ;   
  10.     }catch(ClassNotFoundException e){   
  11.     System.out.println("找不到驱动程序类 ,加载驱动失败!");   
  12.     e.printStackTrace() ;   
  13.     }   
  14.    成功加载后,会将Driver类的实例注册到DriverManager类中。   
  15.  2、提供JDBC连接的URL   
  16.    •连接URL定义了连接数据库时的协议、子协议、数据源标识。   
  17.     •书写形式:协议:子协议:数据源标识   
  18.     协议:在JDBC中总是以jdbc开始   
  19.     子协议:是桥连接的驱动程序或是数据库管理系统名称。   
  20.     数据源标识:标记找到数据库来源的地址与连接端口。   
  21.     例如:(MySql的连接URL)   
  22.     jdbc:mysql:   
  23.         //localhost:3306/test?useUnicode=true&characterEncoding=gbk ;   
  24.    useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为   
  25.    gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。   
  26.  3、创建数据库的连接   
  27.     •要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,   
  28.      该对象就代表一个数据库的连接。   
  29.     •使用DriverManager的getConnectin(String url , String username ,    
  30.     String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和   
  31.      密码来获得。   
  32.      例如:   
  33.      //连接MySql数据库,用户名和密码都是root   
  34.      String url = "jdbc:mysql://localhost:3306/test" ;    
  35.      String username = "root" ;   
  36.      String password = "root" ;   
  37.      try{   
  38.     Connection con =    
  39.              DriverManager.getConnection(url , username , password ) ;   
  40.      }catch(SQLException se){   
  41.     System.out.println("数据库连接失败!");   
  42.     se.printStackTrace() ;   
  43.      }   
  44.  4、创建一个Statement   
  45.     •要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3  
  46.      种类型:   
  47.       1、执行静态SQL语句。通常通过Statement实例实现。   
  48.       2、执行动态SQL语句。通常通过PreparedStatement实例实现。   
  49.       3、执行数据库存储过程。通常通过CallableStatement实例实现。   
  50.     具体的实现方式:   
  51.         Statement stmt = con.createStatement() ;   
  52.        PreparedStatement pstmt = con.prepareStatement(sql) ;   
  53.        CallableStatement cstmt =    
  54.                             con.prepareCall("{CALL demoSp(? , ?)}") ;   
  55.  5、执行SQL语句   
  56.     Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate   
  57.    和execute   
  58.     1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句   
  59.         ,返回一个结果集(ResultSet)对象。   
  60.      2int executeUpdate(String sqlString):用于执行INSERT、UPDATE或   
  61.         DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等   
  62.      3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的   
  63.         语句。   
  64.    具体实现的代码:   
  65.           ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;   
  66.     int rows = stmt.executeUpdate("INSERT INTO ...") ;   
  67.     boolean flag = stmt.execute(String sql) ;   
  68.  6、处理结果   
  69.     两种情况:   
  70.      1、执行更新返回的是本次操作影响到的记录数。   
  71.      2、执行查询返回的结果是一个ResultSet对象。   
  72.     • ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些   
  73.       行中数据的访问。   
  74.     • 使用结果集(ResultSet)对象的访问方法获取数据:   
  75.      while(rs.next()){   
  76.          String name = rs.getString("name") ;   
  77.     String pass = rs.getString(1) ; // 此方法比较高效   
  78.      }   
  79.     (列是从左到右编号的,并且从列1开始)   
  80.  7、关闭JDBC对象    
  81.      操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声   
  82.      明顺序相反:   
  83.      1、关闭记录集   
  84.      2、关闭声明   
  85.      3、关闭连接对象   
  86.           if(rs != null){   // 关闭记录集   
  87.         try{   
  88.             rs.close() ;   
  89.         }catch(SQLException e){   
  90.             e.printStackTrace() ;   
  91.         }   
  92.           }   
  93.           if(stmt != null){   // 关闭声明   
  94.         try{   
  95.             stmt.close() ;   
  96.         }catch(SQLException e){   
  97.             e.printStackTrace() ;   
  98.         }   
  99.           }   
  100.           if(conn != null){  // 关闭连接对象   
  101.          try{   
  102.             conn.close() ;   
  103.          }catch(SQLException e){   
  104.             e.printStackTrace() ;   
  105.          }   
  106.           }  
posted @ 2013-03-06 21:03 Alter 阅读(129) | 评论 (0)编辑 收藏

C#程序脱离.net框架的多种方法与应用 [转]

本文介绍的是C#编写的winform程序脱离.net框架的方法。【也支持VB.NET和C++.NET】

原文地址:http://hi.baidu.com/44498/blog/item/dabd37166a11bd10962b437d.html


很多朋友会问,为何选择C#   ?其实原因很简单,因为它具有其他任何语言都不具备的生产力。

软件工程的发展,主要目的也就是提高生产力,这个核心不变,我们的学习方向也就不变。

本文代码示例支持.NET FRAMEWORK 2.0 ,3.0 , 3.5 ,LINQ等先进的解决方案。

一看就懂,一学就会,一目了然。。。

以下所有例子,均经过测试,在2k,xp,2003,vista,2008,Win7下都是可以运行的。也包括X86和X64平台。

 

声明:本文讲解的是解决方案,并不提供下载【主要是没有稳定的网盘】,

 

 

---------------------------------------------------------

 

 

1, .Net Linker :中国移动的飞信就利用了它的核心。飞信是使用C#在.NET上开发的。贵,最便宜的版本要1000多美金。【傻瓜式操作,这里不做介绍】

2,用飞信的虚拟机来引导自己开发的.NET程序。

3,使用mono来达到脱离.NET框架的效果,可以跨平台。【完美支持.net2.0,以及绝大多数.NET3.5,目前已经支持WPF系列新技术了】

///////////////////////实验过程/////////////////////////

例子1:先说最简单的,使用飞信虚拟机来试验吧。

【不要引用VB编写的控件或者是类库,因为飞信的虚拟机功能很少】

先安装"飞信2008 3.5版",然后打开安装目录,里面有个VMDotNet文件夹,里面就是.NET虚拟环境相关文件了,找到飞信安装目录下的"VMDotNet\v2.0.50727\FetionVM.exe"来启动运行我们的.NET WinForm程序:

【可以使用命令行来传值也可以用其他方式,都是一样的】例如:

WinExec("FetionVM.exe 我的程序.exe", SW_SHOW);     //C++ code

为了方便,我们可以编写一个检测.net框架版本的程序作为引导程序,如果已经安装了.net框架就不用虚拟机,如果没有安装,调用虚拟器来启动程序。【请不要使用C#或者其他托管类型的语言来编写这个引导程序,否则失去了意义】。

很容易吧?但是有个弊端,你的.NET程序如果要操作类似于SQL SERVER2000,2005,2008 或者是MYSQL,Oracle,DB2等数据库,用这个飞信自带的虚拟机实现就比较麻烦,所以这个飞信的虚拟机只能做简单的程序应用。还有一点大家要注意,使用飞信的虚拟机,涉及到的还有版权问题。测试一下,压缩以后文件大概是6,7M左右,还行。

例子2:使用MONO来脱离框架并且跨平台。注:测试结果显示,使用MONO启动.NET程序速度是最快的。

首先到MONO的官方网站下载源代码或者最新版本,然后安装,我用的是2.2版本【目前已经有2.4版本了,比较新,支持的更多】。

为了方便各位朋友试验,我提供我本次试验的MONO版本2.2 :

下载地址:

安装完毕,打开目录,找到两个子目录,名字分别是bin,lib ,然后复制到另外一个目录里面去【因为安装的时候默认安装在C盘的】然后把你的.net开发的程序也复制到这个目录里面去;假设这个目录名字叫做VM,那么你的这个文件夹里应该有个最少三个文件,一个是bin文件夹,一个是lib文件夹,还有一个就是你写的.net程序了。

然后可以用C++编写一个引导程序用来调用你的.NET程序;贴个简单的代码吧:

int main()
{
WinExec("bin\\mono.exe 你的应用程序.exe",SW_SHOWNORMAL);
return 0;
}
当然,为了方便,你可以自己在逻辑里面判断一下,机器里安装的是.NET的哪个版本?如果版本低了,就调用MONO来执行,如果匹配,就不调用MONO了。

【这个例子只是支持简单的WINFORM和数据库访问,WEBSERVICE的,在文章末尾】

如果按照我说的一路操作,肯定是可以运行的了,但是你会发现,现在你的.NET程序是一个绿色软件,但是他所在的目录下lib,或者是bin文件夹的大小是非常恐怖的。。。有300M以上的大小,这岂不是和我们的想法冲突了?当然不是;我们来精简目录吧:

在bin目录下,保留以下文件,其他的删除即可

然后打开lib文件夹,在2.0文件夹下保留Accessibility.dll,mscorlib.dll,mscorlib.dll.mdb,然后在GAC文件夹里面保留以下文件夹【下图中的类库全部保留,最好不要删除】:

这样,整个目录就精简的差不多了,当然,你可以根据自己的需要定制需要的各种类库。然后打包即可,以我本人机器为例,压缩后的文件是9.8M,比.NET 2.0的框架小了很多,但是比飞信的那个虚拟机还是大了一些;换个角度来看,用mono不涉及版权问题,也可以调用各种数据库,我本机测试操作的是SQL SERVER 2005数据库,一切正常。让你的.NET程序也跨平台吧!只有MONO能做到这一点。

本文原创,抄袭的别太过分哦,最起码也专业点,别图片都不贴就发布,

耽误别人学习,那才是最大的犯罪。。。

例子3:使用.Net Linker 的一个老版本来测试的

通过命令行来提取.net环境的一些类库文件,然后模拟,不知道飞信用的是哪个版本,反正我这个老版本是不太好用,要手动精简目录的。

但是唯一的好处就是兼容性比较好,而且不限制数据库的使用。这个也涉及到版权问题,就不啰嗦了。

精简后的文件大小是8.66M,一般的应用都可以满足了,呵呵。

好了,时间不早了,睡觉了。欢迎大家留言,提出各种不同的见解。

更新:2009年3月30日

抽空拿到了.Net Linker 的破解版,用了一下还是不错的,稳定性很好,兼容多种数据库。美中不足的是有了MONO的比较,用.net linker虚拟机以后,程序启动的时候速度稍微慢了一点,和飞信的启动速度一样。。。不过这也没办法,忍了。

更新:2009年4月14日 支持web service

今天看到一个朋友咨询MONO平台上调用webservice的问题;事实上,MONO是完全支持web service的     ;我这里也做个示例吧。

新建一个项目,winform的,版本是.net2.0;然后添加一个引用,引用我们准备好的web服务。

引用的url:http://www.ayandy.com/, 这个web服务的功能是天气预报那种的,包括国内外400多个主要城市。【如果图片不清晰,可以保存到本地然后查看。】

然后,引用好了,就调用吧~    我这里例子显示的是北京当天的天气。

然后运行程序:

我的机器上有.net 3.5,当然没问题,但是我们要是在其他机器上呢?

切换到虚拟机里,虚拟机是xp sp2,没有安装.NET任何版本的框架;

把程序复制到mono的目录中,运行之。。。

可以看到,没有任何问题。。。这里用的MONO版本是2.2,支持的很好。

大家可以看到,整个winform程序的按钮,字体样式都做了改变,

因为MONO是在LINUX上的解决方案,没有使用微软默认的字体和样式。

 

本文偶尔更新,更新时间不确定。感谢大家的关注。。。

有问题可以留言。。。下一篇日志《使用托管C++【c++.net】脱离.NET框架实战》

2009.04.23 更新:

关于有些朋友提出,MONO到底支持多少种数据库的问题,其实MONO支持的数据库绝对比我们想象的多,几乎是很多我们都没有用过的。。。好了,我给个清单,让大家心里有数。最近上网少,资料也没怎么查,就先拿个05年的文章参考一下吧。

Mono Supported Database Access- -
                                      

Mono has many ADO.NET Data Providers to get you connected.

Providers for Open Source databases:

PostgreSQL: Npgsql is fully managed provider for PostgreSQL and is actively maintained

SQL Lite: actively maintained. Requires sqlite library.

Firebird Interbase: fully managed provider for Firebird and is actively maintained.

MySQL: use the MySQL Connector/Net from MySQL AB which is fully managed and actively maintained by MySQL AB, but it is not included with Mono. There is the ByteFX.Data.MySqlClient provider which is not actively maintained, but it is included with Mono.


Providers for commercial databases:

IBM DB2 Universal Database Requires DB2 client software

ODBC requires ODBC software which is available for Unix and Windows

Oracle requires client software including Oracle Call Interface

OLE DB Requires libgda (http://www.gnome-db.org/) System.Data.OleDb is not actively maintained plus it only works on Linux with GNOME 2.x

Microsoft SQL Server fully managed provider which is actively maintained for Microsoft SQL Server 7.0/2000/2005 databases

Sybase fully managed provider for Sybase 12.x databases and is actively maintained

Older Microsoft SQL Server and Sybase databases Not actively maintained.


Alternative to ADO.NET is GdaSharp (Gnome Data Access)

Gnome Data Access (http://www.gnome-db.org/) GdaSharp is C# bindings to GDA (GNOME Data Access) and is included with GtkSharp (http://www.mono-project.com/GtkSharp), but it requires libgda be installed. Works only on Linux with GNOME 2.x installed.

External Projects that have created ADO.NET Providers that work on Mono:

MySQL Connector/Net from MySQL AB (http://dev.mysql.com/downloads/connector/net/) is the .NET and Mono data provider for MySQL

ByteFX.Data.MySqlClient (http://sourceforge.net/projects/mysqlnet/) is a MySQL Managed data provider. ByteFX.Data is no longer actively developed, but it is included with Mono. Please use the MySQL Connector/Net provider from MySQL AB instead.

NPgsql (http://gborg.postgresql.org/project/npgsql/projdisplay.php) is a fully managed provider for PostgreSQL and is included with Mono.

Firebird (http://sourceforge.net/projects/firebird/) fully managed provider for Firebird databases and is included with Mono.

Advanced Data Provider (http://advanced-ado.sourceforge.net/) ADP, is a transparent factory for ADO.NET which loads providers dynamically.

Other Projects

DB40 (http://www.mono-project.com/DB4O) Open source object database for C#

2009.05.27 更新

要注意的是,在X86下编译的程序,如果选择ANYCPU,那么提取后的程序可以在X64下运行。

但是,如果是编译的时候选择X64,那就无法通过LINKER提取。

posted @ 2012-12-01 03:49 Alter 阅读(836) | 评论 (0)编辑 收藏