370 likes | 690 Views
Oracle Database 12c 中针对 Java 的新增内容. Kuassi Mensah 产品管理总监. 以下内容旨在概述产品的总体发展方向 。 该内容仅供参考,不可纳入任何合同 。 其内容不构成提供任何材料、代码或功能的承诺,并且不应该作为制定购买决策的依据 。 此处所述有关 Oracle 产品的任何特性或功能的开发、 发布以及相应的 演讲议题 均由 Oracle 自行决定 。. 我的 讲座. Oracle In-Database MapReduce(动手实践 ) 2013 年 7 月 24 日,17:15 — 18:15,411/412 室
E N D
Oracle Database 12c 中针对Java 的新增内容 KuassiMensah产品管理总监
以下内容旨在概述产品的总体发展方向。该内容仅供参考,不可纳入任何合同。其内容不构成提供任何材料、代码或功能的承诺,并且不应该作为制定购买决策的依据。此处所述有关 Oracle 产品的任何特性或功能的开发、发布以及相应的演讲议题均由Oracle 自行决定。
我的讲座 • Oracle In-Database MapReduce(动手实践) • 2013 年 7 月 24 日,17:15 — 18:15,411/412 室 • 通过 Oracle database 12c 最大化应用程序的可用性 • 2013 年 7 月 25 日,09:00 — 10:00,429 室 • Oracle In-Database MapReduce:Hadoop 与 Exadata • 2013 年 7 月 25 日,12:00 — 13:00,431 室
演讲议题 • 对 Java 标准的支持 • 多租户架构和全新SQL 数据类型 • Java 性能和可伸缩性 • Java 可用性 • 适用于 Java 的全局数据服务 • 安全性和已弃用的/取消支持的特性
JDBC/UCP 对 JDK 7 和 JDBC 4.1 的支持 对 JDBC 4.1 的支持 • Java SE 7、ojdbc7.jar、ucp.jar • setClientInfo() 和 getClientInfo() • getObject() • try with resources • java.sql.Connection
数据库中的 Java • 多个 Java SE:JDK 6 & JDK 7;JNDI、Logging • 性能:存储过程和函数 • 重用技能和库 • 集成Lucene、Solr、Hadoop与数据库 • 实现图像转换和格式转换(GIF、PNG、JPEG 等) • 实现针对不同文件类型(txt、zip、xml、二进制)的解析器 • 调用外部系统 • HTTP 调用、JDBC调用、Web服务调用
数据库中的 Java在创建数据库时安装 JDK 7 • 运行下面的 Perl 脚本 perl $ORACLE_HOME/javavm/install/update_javavm_binaries.pl 7 • 在非 Windows 平台上重新链接 Oracle cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk ioracle • 继续进行数据库创建步骤
演讲议题 • Java 标准 • 多租户架构和全新SQL 数据类型 • Java 性能和可伸缩性 • Java 可用性 • 适用于 Java 的全局数据服务 • 安全性和已弃用的/取消支持的特性
JDBC/UCP 对多租户架构的支持 • Net 服务透明 • SET CONTAINER <container> • 通过 UCP 连接标签和回调实现跨容器的通用池
JDBC 对新 SQL 数据类型的支持 • 32K VARCHAR、NVARCHAR 和 RAW • 不可见或隐藏列 • 隐式结果集 • 自动递增列(IDENTITY 列) • 作为参数的 PL/SQL 包类型
32K VARCHAR、NVARCHAR 和 RAW • VARCHAR2、NVARCHAR2 和 RAW 从 4,000 增加到 32,767 字节 • 凡大小小于 32k 的数据,Java应用程序无需再将其转换为大型对象 (LOB) • 可以在这些列上构建索引 • 先决条件 (DBA) • 将 COMPATIBLE初始化参数设置为12.0.0.0。 • 将 MAX_STRING_SIZE初始化参数设施为EXTENDED。 • 运行rdbms/admin/utl32k.sql脚本。
不可见或隐藏列易于升级 • 使用 INVISIBLE SQL 关键字创建的列 • 在常规访问时不显示不可见列,例如“SELECT * FROM table”或“DESCRIBE table” • JDBC 提供isColumnInvisible() 以检查列是否不可见/隐藏。 OracleResultSetMetaDatarsmd = (OracleResultSetMetaData)rset.getMetaData(); System.out.println("Visibility:"+ rsmd.isColumnInvisible(2));
隐式结果集 • 待解决问题:从不使用RefCursor的第三方 RDBMS 迁移 Java 应用程序。 • 隐式结果:使用DBMS_SQL.RETURN_RESULT直接检索存储过程(PL/SQL、Java)的返回内容。 • 使用dbms_sql.return_result() 的存储过程示例 create or replace procedure p_imres asresult sys_refcursor; begin open result for select * from tab;dbms_sql.return_result(result);end;
隐式结果集 • 新的 Oracle JDBC 方法 getMoreResults() 或getMoreResults(int)int参数可以拥有以下一个值:KEEP_CURRENT_RESULT、CLOSE_ALL_RESULTS、CLOSE_CURRENT_RESULT getResultSet():反复检索每个隐式结果 • 在 Oracle 中也可以使用以下外部 Java 代码 CallableStatementcstmt = null;ResultSetrs = null;cstmt = conn.prepareCall(“{call p_imres()}”);cstmt.execute();booleanresultsAvailable = cstmt.getMoreResults();
JDBC 对自动递增列的支持 • 待解决问题:重用构建于外部 RDBMS 之上且使用自动递增列的应用程序 • Oracle database 12c使用 SQL 关键字 IDENTITY 实现自动递增的 ANSI 兼容列。CREATE TABLE t1 (c1 NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, c2 VARCHAR2(10)); • 无需新的 JDBC API
作为参数的 PL/SQL 包类型 • 待解决问题:在不创建 PLSQL 包装器的情况下以 Java 数组形式访问 PL/SQL 类型 • 使用方法 按照以下方式指定类型名称 <package name>.<type name> 或 <schema name>.<package name>.<type name> 1) 使用%ROWTYPE CREATE OR REPLACE PACKAGE pack1 AS TYPE employee_rowtype_array IS A TABLE OF Employee%ROWTYPE; END; /
作为参数的 PL/SQL 包类型 2) 以 java.sql.Struct的 java.sql.Array的形式获取行 CallableStatementcstmt = connection.prepareCall( “BEGIN SELECT * INTO :1 FROM EMPLOYEE; END;”); cstmt.registerOutParameter(1, OracleTypes.ARRAY, “PACK1.EMPLOYEE_ROWTYPE_ARRAY”); cstmt.execute(); Array employeeArray = cstmt.getArray(1); 此特性能够轻松以 Java Array 或 Struct的形式获取查询结果,从而简化对象关系映射。
使用 JDBC 对每个数组 DML 的行进行计数 期待已久 • 使用 Oracle JDBC 驱动程序的 Java 应用程序现在可以检索数组 DML 语句(例如,数组INSERT、UPDATE、DELETE)的每次迭代所影响的行数。 … intrcount[] = stmt.executeBatch();
演讲议题 • 对 Java 标准的支持 • 多租户架构和全新SQL 数据类型 • Java 性能和可伸缩性 • Java 可用性 • 适用于 Java 的全局数据服务 • 安全性和已弃用的/取消支持的特性
Java 应用程序性能和可伸缩性 全新性能和可伸缩性特性 • 新的内存管理 • 对数据库驻留连接池的 JDBC/UCP 支持 • 超大型网络缓冲区 (SDU)
通过 DRCP 实现极高的可伸缩性支持成千上万的并发用户 POC:5000 个用户;DRCP 池规模为 100
在 RDBMS 端配置 DRCP • DRCP 池必须由 DBA 使用DBMS_CONNECTION_POOL 包显式创建、启动和停止。 sqlplus /nolog connect / as sysdba execute dbms_connection_pool.start_pool(); ... execute DBMS_CONNECTION_POOL.CONFIGURE_POOL (session_cached_cursors=>50); ... execute dbms_connection_pool.stop_pool();
超大型网络缓冲区 (SDU) 控制 SQL*Net 包的大小 默认值:8K 最大值:2MB (12c),64K (11.2),32K (11.2 之前的版本) 设置位置 sqlnet.ora:DEFAULT_SDU_SIZE tnsnames.ora:地址中的 SDU 连接字符串 大 SDU 可实现 更高的网络吞吐量 更少的系统调用来发送和接收数据 更少的 CPU 使用量 — 系统和用户 大 SDU 的副作用:网络缓冲区占用更多的内存 配置位置 客户端:URL sqlnet.ora 和/或 tnsnames.ora 或 LDAP 服务器:sqlnet.ora
演讲议题 • 对 Java 标准和全新 SQL 类型的支持 • Java 对多租户可拔插数据库的支持 • Java 性能和可伸缩性 • Java 可用性 • 适用于 Java 的全局数据服务 • 安全性和已弃用的/取消支持的特性
针对 Java 的应用程序连续性 待解决问题 应用程序面临的四个数据库中断问题 • 挂起 • 错误和连接处理 • 进行中工作的结果 • 进行中工作的重新提交 更多详细信息请参加讲座“最高应用程序可用性”2013 年 7 月 25 日,09:00 - 10:00,429 室
RAC 数据库 实例 1 实例 2 实例 3 代理 1 代理 2 连接 重放上下文 应用程序连续性的实际应用 Oracle JDBC 驱动程序 调用 1 调用 2 应用程序
演讲议题 • 对 Java 标准的支持 • 多租户架构和全新SQL 数据类型 • Java 性能和可伸缩性 • Java 可用性 • 适用于 Java 的全局数据服务 • 安全性和已弃用的/取消支持的特性
复制环境中的数据库挑战/要求 • 没有一种无缝方式可以高效使用所有数据库 • 无自动负载平衡和容错 备用数据库 主数据库 备用数据库 GoldenGate
全局数据服务 复制数据库的负载平衡和服务故障切换 • 将 RAC 式服务故障切换、负载平衡和可管理性扩展至一组复制数据库 • 考虑网络延迟、复制延迟和服务布置策略 • 提高可用性、改善可管理性并最大限度提高性能 全局数据服务
UCP 针对全局数据服务的支持 • 透明地支持已有快速连接故障切换 (FCF)、运行时负载平衡 (RLB)、数据库亲和性 • 在连接 URL 中指定全局服务名称和地区名 (DESCRIPTION= (ADDRESS_LIST= (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS=(GDS_protocol_address_information)) (ADDRESS=(GDS_protocol_address_information)) ) (CONNECT_DATA= (SERVICE_NAME=global_service_name) (REGION=region_name)))
演讲议题 • 对 Java 标准的支持 • 多租户架构和全新SQL 数据类型 • Java 性能和可伸缩性 • Java 可用性 • 适用于 Java 的全局数据服务 • 安全性和已弃用的/取消支持的特性
高级安全增强功能 • JDBC 现在支持 SHA-2 散列算法:SHA-256、SHA-384 和 SHA-512 prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES, "( MD5, SHA1, SHA256, SHA384 or SHA512 )"); prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL, "REQUIRED");
已弃用和取消支持的特性 • 已弃用特性 • 具体类型 oracle.sql.CLOB、oracle.sql.BLOB、oracle.sql.BFILE、oracle.sql.STRUCT、oracle.sql.ARRAY、oracle.sql.OPAQUE:使用 Java 和 Oracle 接口 • Oracle 样式批处理:使用 Java 标准批处理 pstmt.setInt(1, 1234);pstmt.setString(2, “Product #1”); pstmt.addBatch(); int [] batchCount = pstmt.executeBatch(); • 端到端标准 API:使用 Java 标准 setClientInfo() • 取消支持的特性 • JDK 5 在 12.1 中不受支持:JDK 6 和 JDK 7 受支持 • 隐式连接缓存:使用 UCP 作为替代