Posted by:hzxl

Posted on:2003-08-31 18:14

系统临时表的使用:

在一些程序中,我们需要一些仅仅在程序中使用的临时表,但是程序结束后就不再使用,数据库系统对这些应用提供系统临时表,关于系统临时表的生命存在周期和临时表的数据存在周期说明一下:

1、生命存在周期:

A、理论上系统临时表是不需要显示的drop的,它是基于会话的,当系统临时表基于的连接关闭的时候,系统临时表将结束它的生命,这是最普通也是最常用的。

B、当一个被调用对象的返回值是一个在临时表上执行的结果集,这个被调用对象执行完毕的时候,是关闭连接的,但是,这时候临时表是不消失的,这时候系统临时表在调用者结束的时候才消失。因为返回的结果集只是一个相当于指针的东西,指向临时表内存中的地址,指向临时表的指针还在使用的时候,临时表是不能drop掉的。这带来了很复杂的问题,首先:存储过程中是不能drop临时表的,而程序中没有创建临时表,也应该是不drop的,临时表什么时间drop呢?其次:我们在一个连接中,无法2次调用一个存储过程,他将告诉你临时表已经存在。可以做一个简单的例子:写一个带有临时表返回结果的存储过程,在调用存储存储过程的程序中,我们完全可以访问这个临时表。

简单例子:

存储过程

/**

* JDBC 存储过程 ADMINISTRATOR.P1

*/

import java.sql.*; // JDBC 类

public class P1

{

public static void p1 ( ResultSet[] rs ) throws SQLException, Exception

{

// 获取与数据库的连接

Connection con = DriverManager.getConnection("jdbc:default:connection");

PreparedStatement stmt = null;

String sql;

sql = "declare global temporary table session.temp(cc char(5)) not logged";

stmt = con.prepareStatement( sql );

stmt.executeUpdate();

sql = "insert into session.temp values ('1'),('2')";

stmt = con.prepareStatement( sql );

stmt.executeUpdate();

sql = "SELECT * from session.temp";

stmt = con.prepareStatement( sql );

rs[0] = stmt.executeQuery();

//关闭连接(注意,这个地方在rs[0]为临时表的结果集返回的时候,stmt是无法关闭的,临时表是无法drop的,而con是可以关闭的,关闭后临时表还存在)

if (con != null) con.close();

}

}

客户端调用我直接用命令行调用的。

db2 => connect to sample

数据库连接信息

数据库服务器 = DB2/NT 7.2.1

SQL 授权标识 = ADMINIST...

本地数据库别名 = SAMPLE

//将自动提交设为false。

db2 => update command options using c off

DB20000I UPDATE COMMAND OPTIONS 命令成功完成。

//调用过程

db2 => call p1()

CC

1

2

"P1" RETURN_STATUS:"0"

//看看存储过程中使用的临时表,数据是可以看到的。

db2 => select * from session.temp

CC

-----

1

2

2 条记录已选择。

//一个连接中再次调用,失败了

db2 => call p1()

SQL0601N 要创建的对象名与类型为"DECLARED TEMPORARY TABLE" 的现存名称 "SESSION.TEMP" 相同。 SQLSTATE=42710

//drop一下?ok,可以的

db2 => drop table session.temp

DB20000I SQL 命令成功完成。

//看看还有吗?没了!

db2 => select * from session.temp

SQL0204N "SESSION.TEMP" 是未定义的名称。 SQLSTATE=42704

//再次调用,成功了

db2 => call p1()

CC

1

2

"P1" RETURN_STATUS:"0"

C、Websphere上的程序中使用系统临时表:因为websphere的连接使用连接池的技术,这带来了好处,但是同时也带来了一些让人容易误解的地方,我们在程序中要关闭连接,很多时候看上去是关闭了数据库的连接,事实上也是这样的,但是当websphere的连接数在websphere连接池规定的连接数的范围之内的时候,程序中关闭连接是不能直接关闭数据库的连接的,连接池使连接继续保持,这时候,我们的关闭连接释放的是该连接和相关因素在websphere和java程序中使用的资源,而该连接使用的数据库资源是无法得到释放的。也就是说,当我们在该连接上使用临时表的时候,我们在程序中关闭了连接,但是临时表是还存在的,连接池中把这个连接分配给其他程序使用的时候,其他程序还可以使用这个临时表,这并不是我们想要的。这要求我们在程序的中显式的drop掉临时表。(这是在南宁解决系统临时表使用问题中,碰到的一个问题,大家可以很容易的模拟出来)

同时这也让我们注意,一些设置,应该采取人为控制的方式,而不要采取默认,比如autoCommit,我们不能觉得程序结束了,就提交了,因为默认是程序结束提交的,如果错了就都回滚了,但是如果连接上设定的是autoCommit为true的话,程序出错就只能回滚你的出错前最后一次未提交事务,也许你还在为你程序中出现的这种错误头疼,他为什么前面的会提交呢?

一段代码,应尽可能的保持它的独立性,执行不要过多依赖于环境和其他的代码,我想这是应该考虑的。就象在oracle数据库上执行sql和在db2数据库上执行sql有很明显的区别一样,oracle默认是不提交的,而db2默认是提交的,这样在不主动控制事务的情况下,一个sql执行的结果是完全不同的。

2、数据存在周期

临时表的数据是在内存中的,当你向一个临时表插入数据的时候,他同时是直接的写到硬盘中的,如果你的缓冲池可以满足临时表的数据都存在内存中,它在使用的时候是不需要读硬盘上的数据的,除非你的缓冲池不能满足,这样会降低临时表的性能。我们知道,事务的提交和回滚是对数据库的更改做永久化,从内存中的更改到硬盘上的更改或者放弃更改(在更改实现的同时,是回收曾经占用的内存资源的)。对一个永久表,插入数据,就是在你提交之前,别的程序访问不了你插入的数据,在你提交之后,所有的程序都可以访问你插入的数据;而临时表不是这样的,无论执行提交还是回滚,临时表数据占用的内存资源都将被释放,同时临时表写到硬盘上的数据也全部删除。

也就是说,无论执行提交还是回滚,临时表的数据都没了,但是临时表还是存在的,这一点需要大家注意,在使用的过程中说插入了数据,但是没有数据,为什么呢??

看一个简单的命令行模拟的例子:

db2 => connect to sample

数据库连接信息

数据库服务器 = DB2/NT 7.2.1

SQL 授权标识 = ADMINIST...

本地数据库别名 = SAMPLE

//创建临时表

db2 => declare global temporary table session.test(col1 char(5)) not logged

DB20000I SQL 命令成功完成。

//插入数据

db2 => insert into session.test values('5')

DB20000I SQL 命令成功完成。

//选择数据,没有数据?是的!

db2 => select * from session.test

COL1

-----

0 条记录已选择。

//我们把提交方式改为默认不提交

db2 => update command options using c off

DB20000I UPDATE COMMAND OPTIONS 命令成功完成。

//再次插入数据

db2 => insert into session.test values('5')

DB20000I SQL 命令成功完成。

//选择数据,ok,我们看到数据了!

db2 => select * from session.test

COL1

-----

5

1 条记录已选择。

//提交一下,或者执行rollback也可以

db2 => commit

DB20000I SQL 命令成功完成。

//数据没了

db2 => select * from session.test

COL1

-----

0 条记录已选择。

以上是系统临时表使用的过程中我们程序开发者需要注意的可能出现的问题,知道问题是怎么出现的,我们应该如何解决出现的问题和如何更好的使用临时表,这是我们的目标。

java操作mysql临时表_Java开发网 - 系统临时表使用问题相关推荐

  1. java工作流 数据库设计_Java开发网

    于 2007-12-06 16:10 基于JGRAHP的工作流模型设计器 JWFD v0.9 comsci@163.com QQ: 784092877 群:7428804 简介 JDK1.4以上 运行 ...

  2. java禁止ie后退_Java开发网 - 【讨论】html页面禁用右键,浏览器后退、刷新,以及相应快捷键...

    Posted by:lisliefor Posted on:2006-06-15 21:36 前些天交付一个系统时,客户提出新要求回车等同于Tap键的功能,并能提交表单:禁用鼠标右键:禁用浏览器后退. ...

  3. java缺少方法主体_Java开发网 - 总是报错(缺少方法主体,或声明抽象)

    Posted by:wslss007 Posted on:2005-10-31 12:37 今天我做了一个题目,要求是对一般取款机进行模拟,让用户输入密码1234,就显示密码正确,否则密码错误.程序如 ...

  4. java操作mysql数据库_java连接mysql数据库 三 实现增删改查操作

    public classJDBCTest {public static voidmain(String[] args){//add(uname, uemail, upwd);//update(&quo ...

  5. java获取http文件大小_Java开发网 - 关于通过HTTPUrlConnection获取一个文件的大小?...

    于 2005-01-11 11:12 例如有个文件http://127.0.0.1/tester/a.zip 我需要通过程序把它下载到本地来,这个没有问题 但是我想现实一个下载的进度 所以,就必须先知 ...

  6. Java操作MySQL

    Java操作MySQL PS:在之前的博客中详细的介绍了JAVA怎么用JDBC连接数据库,包括SQL Server和Oracle,用JDBC连接MySQL除了加载驱动和获得连接不同,其他都是一样的操作 ...

  7. java 读取mysql数据库_原生Java操作mysql数据库过程解析

    这篇文章主要介绍了原生Java操作mysql数据库过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.引入数据库驱动的jar包 以通过mav ...

  8. Java 操作MySql Blob 字段

    Java 操作MySql Blob 字段 import java.sql.*; import java.io.*; import javax.swing.*; import java.awt.*; i ...

  9. Java操作Mysql实例

    Java操作Mysql实例 来自:http://junehuang111.blog.163.com/blog/static/627072201191933118658/ 2011-10-19 15:3 ...

最新文章

  1. tensorflow-yolov4实施方法
  2. 使用属性position:fixed的时候如何才能让div居中
  3. 零基础Java学习之初级项目实践(客户信息管理软件-附源码)
  4. oracle xtts 介绍,oracle_rman_xtts_v3
  5. 前端做后台管理系统有前途吗_关于后台管理系统前端项目的思考
  6. 基础计算机构,基础计算与设计
  7. 转贴:从现在电力短缺看今后劳动力短缺和高校破产
  8. .net Core 学习笔记(实体字段映射,IOC注入)
  9. “使用 iNalyzer 分析应用程序的类结构”
  10. JNI FindClass出错的一种特殊情况
  11. 在Windows 10 增加和使用英语语音包
  12. 天使投资,众筹与项目背书
  13. ODOO_posbox_打印出的小票(收据)如何修改?
  14. 利用阿里云oss实现上传视频和图片功能
  15. dede后台系统基本参数空白怎么办?
  16. Android 环信 客服集成
  17. 2021-06-10 MYSQL存储过程与触发器作业
  18. 如何破解自如的反爬机制
  19. 在CorelDRAW 2019创建对称绘图模式
  20. Shell编程(week4_day5)--技术流ken

热门文章

  1. C#LeetCode刷题之#104-二叉树的最大深度​​​​​​​(Maximum Depth of Binary Tree)
  2. 任务完成从不加班_我如何从不知道如何编码转变为在9个月内交付9个项目-都在我15岁之前就完成了……...
  3. java 一些容易忽视的小点-数据类型和运算符篇
  4. 用 Python 识别图片中的文字
  5. Python高级——HTTP协议
  6. 处理Redis里的数据
  7. 源码分析参考:Dupefilter
  8. 使用母版頁是內容如何使用CSS和javascript
  9. CV《神经风格转换》
  10. 漫步微积分二十三——重力作用下的运动 逃逸速度和黑洞