Oracle 知识篇+会话级全局临时表在不同连接模式中的表现

news2025/2/28 20:18:02
  • 标签:会话级临时表、全局临时表、幻读
  • 释义:Oracle 全局临时表又叫GTT

★ 结论

✔ 专用服务器模式:不同应用会话只能访问自己的数据
✔ 共享服务器模式:不同应用会话只能访问自己的数据
✔ 数据库驻留连接池模式:不同应用会话可能访问到前一个应用会话的数据(当他们连接到同一个数据库会话时),直到应用连接池释放数据库会话(但不像应用连接池,数据库驻留连接池产生的数据库会话由Oracle维护,应用层无法控制其释放)
✔ 数据库连接池方式(HikariCP等):不同应用会话可能访问到前一个应用会话的数据(当他们连接到同一个数据库会话时),直到应用连接池释放数据库会话

★ 实验环境

※ 数据库:19c
※ 会话模式
   └专用服务器模式
   └共享服务器模式
   └数据库驻留连接池模式
   └数据库连接池方式(HikariCP)

★ 实验结果

✔ 专用服务器模式:gtt表的count(*)数值始终为“1”
✔ 共享服务器模式:gtt表的count(*)数值始终为“1”
✔ 数据库驻留连接池模式:gtt表的count(*)数值会在新会话重复访问时累加,并不总是“1”,由于数据库会话的释放由Oracle管理,因此应用下次执行时可能从上次的值开始累加
✔ 数据库连接池方式(HikariCP):gtt表的count(*)数值会在新会话重复访问时累加,并不总是“1”,直到应用连接池释放数据库会话后下次执行重新从“1”计数


★ 配置数据库(需要重启数据库)

✔ 配置共享服务器模式
alter system set shared_server_sessions=1 scope=spfile;
alter system set max_shared_servers=1 scope=spfile;
alter system set shared_servers=1 scope=spfile;
alter system set max_dispatchers=1 scope=spfile;
alter system set dispatchers='(PROTOCOL=TCP)(DISPATCHERS=1)' scope=spfile;

✔ 配置数据库驻留连接池模式
execute dbms_connection_pool.start_pool();
execute dbms_connection_pool.alter_param('','minsize','1');
execute dbms_connection_pool.alter_param('','maxsize','1');

✔ 创建会话级全局临时表
drop table zzt.gtt;
create global temporary table zzt.gtt(id number) on commit preserve rows;

★ Java案例

✔ 专用服务器模式
package PAC_001;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
import oracle.jdbc.pool.OracleDataSource;
public class CLA_oracle {
	public static void main(String args[]) throws SQLException {
		OracleDataSource ods = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		ods = new OracleDataSource();
		ods.setURL("jdbc:oracle:thin:@1.1.1.9:1521/prodpdb1:dedicated");
		ods.setUser("zzt");
		ods.setPassword("zzt");
		for (int i = 0; i <= 5; i++) {
		conn = ods.getConnection();
		try {
			stmt = conn.createStatement();
			int rset1 = stmt.executeUpdate("insert into zzt.gtt values(1)");
			int rset2 = stmt.executeUpdate("commit"); // 默认自动提交,可写可不写
			rset = stmt.executeQuery("SELECT count(*) FROM zzt.gtt");
			while (rset.next())
				System.out.println(i + " : " + rset.getString(1));
				System.out.println("#########");
		}
		finally {
			if (rset != null)
				rset.close();
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		}
		}
	}
}


✔ 共享服务器模式
package PAC_001;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
import oracle.jdbc.pool.OracleDataSource;
public class CLA_oracle {
	public static void main(String args[]) throws SQLException {
		OracleDataSource ods = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		ods = new OracleDataSource();
		ods.setURL("jdbc:oracle:thin:@1.1.1.9:1521/prodpdb1:shared");
		ods.setUser("zzt");
		ods.setPassword("zzt");
		for (int i = 0; i <= 5; i++) {
		conn = ods.getConnection();
		try {
			stmt = conn.createStatement();
			int rset1 = stmt.executeUpdate("insert into zzt.gtt values(1)");
			int rset2 = stmt.executeUpdate("commit"); // 默认自动提交,可写可不写
			rset = stmt.executeQuery("SELECT count(*) FROM zzt.gtt");
			while (rset.next())
				System.out.println(i + " : " + rset.getString(1));
				System.out.println("#########");
		}
		finally {
			if (rset != null)
				rset.close();
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		}
		}
	}
}


✔ 数据库驻留连接池模式
package PAC_001;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
import oracle.jdbc.pool.OracleDataSource;
public class CLA_oracle {
	public static void main(String args[]) throws SQLException {
		OracleDataSource ods = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		ods = new OracleDataSource();
		ods.setURL("jdbc:oracle:thin:@1.1.1.9:1521/prodpdb1:pooled");
		ods.setUser("zzt");
		ods.setPassword("zzt");
		for (int i = 0; i <= 5; i++) {
		conn = ods.getConnection();
		try {
			stmt = conn.createStatement();
			int rset1 = stmt.executeUpdate("insert into zzt.gtt values(1)");
			int rset2 = stmt.executeUpdate("commit"); // 默认自动提交,可写可不写
			rset = stmt.executeQuery("SELECT count(*) FROM zzt.gtt");
			while (rset.next())
				System.out.println(i + " : " + rset.getString(1));
				System.out.println("#########");
		}
		finally {
			if (rset != null)
				rset.close();
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		}
		}
	}
}


✔ 应用连接池方式(HikariCP)
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Statement;
public class C_O {
	// main函数
	public static void main(String[] args) {
		executeQuery();
	}
	public static void executeQuery() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setPoolName("HikariCP 连接池");
		hikariConfig.setDataSourceClassName("oracle.jdbc.pool.OracleDataSource");
		hikariConfig.addDataSourceProperty("user", "zzt");
		hikariConfig.addDataSourceProperty("password", "zzt");
		hikariConfig.addDataSourceProperty("url", "jdbc:oracle:thin:@1.1.1.9:1521/prodpdb1:dedicated");
		hikariConfig.setMaximumPoolSize(1); // 设置数据库层的session数
		hikariConfig.setAutoCommit(false); // 默认自动提交为开启状态
		hikariConfig.setConnectionTimeout(5000);
		HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
		Connection connection = null;
		for (int i = 0; i < 5; i++) {
			System.out.println("#############");
			try {
				connection = hikariDataSource.getConnection();
				Statement st1 = connection.createStatement();
				st1.executeUpdate("insert into zzt.gtt values(1)");
				Statement st2 = connection.createStatement();
				st2.executeUpdate("commit");
				Statement st = connection.createStatement();
				ResultSet rs = st.executeQuery("select count(*) cn from zzt.gtt");
				while (rs.next()) {
					System.out.println("【count is:】" + rs.getString("cn"));
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				if (connection != null) {
					try {
						connection.close(); // 断开的是Java和hikari应用池的连接,而非HikariCP和数据库的连接
					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
			}
		}
		hikariDataSource.close(); // 断开HikariCP和数据库之间的连接
		System.out.println("【ALL END】");
	}
}


※ 如果您觉得文章写的还不错, 别忘了在文末给作者点个赞哦 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/862267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

风口来临,你真的了解什么是嵌入式吗?

什么是嵌入式&#xff1f; 书本上的定义是这样的&#xff1a; 嵌入式&#xff08;Embedded&#xff09;是指将计算机系统嵌入到被控制对象中的一种技术。它不同于传统的个人电脑或服务器&#xff0c;而是专门设计用来执行特定功能的计算机系统。嵌入式系统通常被用于控制、监测…

【1289. 下降路径最小和 II】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 grid 数组中的每一行选择一个数字&#xff0c;且按顺序选出来的数…

odoo 开发入门教程系列-模块交互

模块交互 在上一章中&#xff0c;我们使用继承来修改模块的行为。在我们的房地产场景中&#xff0c;我们希望更进一步&#xff0c;能够为客户生成发票。Odoo提供了一个开发票模块&#xff0c;因此直接从我们的房地产模块创建发票是很简单的&#xff0c;也就是说&#xff0c;一…

比较 Java 中的 ModelMapper 和 MapStruct:自动映射器的强大功能

了解如何在自动映射器 ModelMapper 和 MapStruct 之间进行选择&#xff0c;以提高生产力和可维护性&#xff0c;并减少数据映射中的错误。 在 Java 应用程序中&#xff0c; 数据映射 是一项常见任务&#xff0c;涉及将对象从一种类型转换为另一种类型。这个过程可能会变得复杂而…

浅谈Spring与字节码生成技术

概要 今天来谈一谈我们熟知的Spring框架和字节码技术有什么联系。 Java程序员几乎都了解Spring。 它的IoC&#xff08;依赖反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;功能非常强大、易用。而它背后的字节码生成技术&#xff08;在运行时&#xff0c;根据需要…

Linu学习笔记——常用命令

Linux 常用命令全拼&#xff1a; Linux 常用命令全拼 | 菜鸟教程 一、切换root用户 1.给root用户设置密码 sudo passwd root 2.输入密码&#xff0c;并确认密码 3.切换到root用户 su&#xff1a;Swith user(切换用户) su root 二、切换目录 目录结构&#xff1a;Linux 系…

APP外包开发的H5开发框架

跨平台移动应用开发框架允许开发者使用一套代码在多个操作系统上构建应用程序&#xff0c;从而节省时间和资源。以下是一些常见的跨平台移动应用开发框架以及它们的特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0…

再论态势感知中的几个问题

1、态势中的状态信息与趋势信息有何不同 在分析和决策过程中&#xff0c;态势是指当前的情境、环境或状况。状态信息和趋势信息是对态势的不同方面进行描述和分析的方式。 状态信息是关于当前态势的实时或静态描述。它提供的是当前的数据、指标或状态的具体数值或描述。例如&am…

使用python-magic和wxPython识别文档类型

以下是一篇关于使用python-magic模块和wxPython库识别文档类型的相关博客文章的示例&#xff1a; 摘要&#xff1a; 本文介绍了如何使用python-magic模块和wxPython库创建一个简单的文件列表应用程序&#xff0c;该应用程序可以显示所选文件夹中文件的类型。 介绍&#xff1…

【三维重建】【深度学习】instant-nsr-pl代码Pytorch实现--训练自己的数据集

【三维重建】【深度学习】instant-nsr-pl代码Pytorch实现–训练自己的数据集 基于Instant-NGP的神经表面重建&#xff1a;该存储库包含 NeRF 和 NeuS 的简洁且可扩展的实现&#xff0c;用于基于 Instant-NGP 和 Pytorch-Lightning 框架的神经表面重建&#xff0c;旨在为基于 Ne…

ACM Journals的Word模板使用心得

按照说明一步一步按照顺序调整格式&#xff0c;体力活&#xff0c;考验耐心细心。 两个模板&#xff0c;第一个是 Submission Template投稿用的&#xff0c;第二个是Primary Article Template接收后用的。 及时保存备份&#xff0c;以便恢复到最初满意的状态。 格式确定后&a…

CSDN到底要多少积分才有排名(图解)

2016年8月16日的截图&#xff1a; 2016年8月17日的截图&#xff1a; CSDN的排名是完全按照积分排的&#xff0c;只隔了22分而已&#xff0c;千里之外和2万名的差别就是卡在这个地方。 2016年10月18日的截图&#xff1a; 这是刚刚进入前7000名&#xff0c;刚好访问也是刚刚突破4…

Linux系统调试课:Linux Kernel Printk

🚀返回专栏总目录 文章目录 0、printk 说明1、printk 日志等级设置2、屏蔽等级日志控制机制3、printk打印常用方式4、printk打印格式0、printk 说明 在开发Linux device Driver或者跟踪调试内核行为的时候经常要通过Log API来trace整个过程,Kernel API printk()是整个Kern…

Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL

导航&#xff1a; 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式面试题汇总源码_vincewm的博客-CSDN博客 目录 一、基本区别 1.1 基本特性 1.2 Oracle和MySQL如何做技术选型&#xff1f; 1.3 RDBM…

图解java.util.concurrent并发包源码系列——深入理解ReentrantReadWriteLock读写锁,看完可以吊打面试官

图解java.util.concurrent并发包源码系列——深入理解ReentrantReadWriteLock读写锁&#xff0c;看完可以吊打面试官 ReentrantReadWriteLock的作用ReentrantReadWriteLock的原理ReentrantReadWriteLock源码解析构造方法获取写锁和读锁对象计算读锁被持有数和写锁被持有数的位移…

爆笑,打地鼠的极限,PyAutoGUI的开始~

游戏地址&#xff1a;http://www.4399.com/flash/178030_3.htm 视频教程地址&#xff1a;https://www.bilibili.com/video/BV1gm4y1x7QW/ 介绍 当提到自动化控制鼠标和键盘的Python库时&#xff0c;pyautogui是一个不可忽视的工具。它为用户提供了简单而强大的功能&#xff…

【JAVA基础】- 同步非阻塞模式NIO详解

【JAVA基础】- 同步非阻塞模式NIO详解 文章目录 【JAVA基础】- 同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现 五、同步非阻塞NIO总结 一、概述 NIO&#xff08;Non-Blocking IO&#xff09;是同步非阻塞方式来处理IO数据。…

主题模型分析-【LDA】

主题模型能够自动将文本语料库编码为一组具有实质性意义的类别。这些类别称为主题。 主题模型分析的典型代表就是本篇文章将要介绍的隐含迪利克雷分布&#xff0c;也就是LDA。 假设我们有一个文档或者新闻的集合&#xff0c;我们想将他们分类为主题。 我们设置好主题数量后&am…

Java中创建对象的方式

文章目录 一、使用new关键字二、使用反射机制三、使用clone方法四、使用反序列化 一、使用new关键字 下面是使用 new 关键字创建对象的示例代码&#xff0c;同时演示了如何调用不同构造函数的方式&#xff1a; public class Person {private String name;private int age;pub…

超人PDF解密助手:pdf怎么解除编辑权限

PDF文件带有编辑权限&#xff0c;想要取消PDF文件的限制&#xff0c;该如何操作&#xff1f; 打开PDF编辑器&#xff0c;点击工具栏中的文件&#xff0c;选择属性按钮&#xff0c;进入到熟悉感界面之后&#xff0c;点击安全&#xff0c;然后我们点击权限下拉框&#xff0c;选择…