没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
































1
根据上文 OracleObject 定义,也就是说,会有一张 Trade 表,一张 Product
表,一张 Account 表。其中通过 Trade_ID 的关联实现了数据层级表现
这样做目的是不希望数据库的表设计与 OracleObject 太过紧密绑定,以免
将来有数据库更换的需求或数据迁移的过程中,遇到不可估计的难度。虽然说没
有完全用到 OracleObject 提供优势,可以在列上使用自定义的数据类型,方便
存储和查询,但这里使用了一种折中的方案,放弃了一些性能上和编码上的便利,
换来了系统今后升级的空间,而且性能的表现也完全在可接受范围内
在 V2 版本中,所有 Datasheet 的保存都是在保存过程的基础上完成的,而
OracleObject 特性中允许用户自定义类型,因此我们运用 OracleObject 来保存
和访问 Datasheet。理由很简单,既然定义和使用了 OracleObject,就可以在存
储过程中充分使用其面向对象的特性,可以轻易的使用其属性和各种方法。举个
例子来看,假设我们定义了 INSERT_TRADE,即“插入一笔交易”这个类的保存
过程,该类的参数是 Trade_Object 即交易数据,我们用该类的返回参数替代了
返回列表。而操纵 Trade_Object 就和使用 Java 对象一样。例如需要使用
Trade_id,只需要调用 OracleObjectPOB_TRADE 中的属性 Trade_id 就可以了,
如 POB_TRADE.Trade_id。而对于一个有层级结构对象的查修也非常方便,只需
要 把 相 应 的 表 做 关 联 , 并 把 关 联 表 中 的 属 性 作 为 参 数 传 入 与 之 对 应 的
OracleObject 的构造器内,就可以构建出 Oracle 对象。但是对于数组形式的属
性,却不能像以上的方法设置,如 ACCOUNT_LIST。对于数组我们只有重新定义
其保存过程一种方法,如 PKG_ACCOUNT.GET_ACCOUNT_LIST(POB_LIST_ID)这个类,
其返回值是一个数组,我们必须定义一个外部数组变量作为过渡的变量,利用给
该变量赋值将数组中的元素移出,将该变量与 ACCOUNT_LIST 建立连接。接着根
据 ACCOUNT_LIST 的返 回值, 将外 部数 组 变量 里的 元素 按顺序 逐一 复制 进
ACCOUNT_LIST 里的对象,最后移除该外部变量,释放空间,就完成了操作
在完成了数据库方面设计和实现后,需要在 Java 端进行调用。首先需要利
用 OracleJPublisher 生成相应 Java 类 TradeObject,TradeObjectRef 等与数据
库对象一一对应的类后,就可以使用 JavaJDBC 的操纵这些类以 OracleObject 的
方式进行调用了。首先定义 ParamValuePairList,是传入 SQL 语句或者存储过
程的参数的集合包括 SqlInParameter,SqlOutParameter。如果没有

2
OracleObject,当需要将数据插入到数据表中,特别当表的字段比较多时,SQL
语句会变得非常长难以维护并且需要非常仔细的定义每个列顺序和保证每个数
据类型是否一致;如果使用存储过程,将会有定义一系列参数,一般而言参数数
量将会和表字段数一致。当数据表需要增加新字段或修改原有字段时,SQL 或存
储过程的维护都会变得非常困难。在引入 OracleObject 后,存储过程参数就一
目了然,当插入数据到 Trade 表中,只需要传入 TradeObject 这个由 JPublisher
生成出来的 Java 对象。同时在完成插入操作后,需要通过查询数据表返回最新
TradeObject,用来确保数据一致性。所以在 ParamValuePairList 里定义了
SqlOutParameter 是 TradeObject.class,
而 SqlInParameter 则是 TradeObject 对象,轻易的就把 Trade_Object 传递给了
存储过程。(这里的存储过程 INSERT_TRADE_OBJECT 就是上文代码中提及的
PROCEDUREINSERT_TRADE)
当然为了支持 OracleObject,还需要在原生的存储过程调用方法上进行一些
改进。当存储过程的返回值是 OracleObject 时,原生的 JDBC 方法是不支持的。
所以首先判断 ParamValuePairList 是否定义 ORASqlOutParameter,如果存在,
说明存储过程返回值是一个 OracleObject。这样就需要返回值 Class 类型,调
用其 create 方法去创建出这个 OracleObject 对象
以上代码就是在 V2 版本中使用 OracleObject 主要流程。其主要作用是取代
了 Hibernate 在 V1 版本中对于自定义数据存储实现,利用 OracleObject 面向对
象特性,构建出与真实世界业务对象类似结构,类似于 JavaPOJO 操作,在存储
过程中用 OracleObject,这样在数据操纵和查询过程中利用 Oracle 自身优化引
擎对存储过程中使用 SQL 优化,抛弃了由 Hibernate 生成 HSQL,提高效率。根
据测试结果,在 20000 条数据情况下,性能基本可提升一倍。不仅如此,在实际
开发过程中,从某种程度上讲,它的开发效率并不比 Hibernate 差,甚至更好。
但是不可否认,使用 OracleObject 后,也就意味系统和 Oracle 数据库有着紧耦
合,并不利于将来有可能的重构,所以在系统中,多增加一个数据转换层。简单
说就是业务数据模型还是使用 JavaPOJO 对象,而不直接使用 OracleObject,仅
仅数据存储层使用 OracleObject,这样就需要增加个 JavaPOJO 和 OracleObject
数据存储间数据转换,带来好处就是若将来不在使用 Oracle 数据库,将不需要

3
重构业务代码,只要替换相对应数据存储层即可
4.3 设计
根据上文提及 V1 版本主要问题之一是大数据量查询以及数据在网络上传输
问题,这样在 V2 版本系统中需要一种可以作为 Cache 存储空间以及有类似数据
存储功能策略,这样就可减少数据库查询次数,从而加快速度。在解决这个问题
上,考虑使用技术是 Gemfire 和 ApacheCassandra。Gemfire 可提供高度可扩展,
弹性数据管理解决方案,确保企业和云解决方案的快速和可靠的数据访问,是种
NoSQL 基于 Key-Value 的技术。而 ApacheCassandra 则是基于列 Key-Value 第二
代分布式数据库技术,而底层实现也是用 JAVA 实现。虽然二者可提供类似技术
功能,但 Gemfire 是要付费,而 Cassandra 则是基于 Apachelicense 免费。而且
由于系统都是基于 JAVA 语言设计实现,所以这里就选择 ApacheCassandra 作为
系统解决大数据查询与传输问题主要技术。系统数据查询及数据通信都会使用
Cassandra 作中间媒介,当前数据更改不仅保存在数据库中,在 Cassandra 中也
会保存。这种结构的优点在于系统主要对当前数据进行查询和操作,如果数据仅
保存在数据库内,就会造成系统中各个模块会频繁查询数据库,进行多表查询及
网络传输。由于各计算模块对于数据格式要求不同,需要对数据进行处理,造成
性能瓶颈。而 Cassandra 多节点部署可及时响应各模块请求。若其中一个节点故
障,其他有着相同数据备份节点可以继续为系统服务,而对于数据库来说如果数
据库的连接被全部占有或是网络出现故障,系统将不得不停止服务。不仅如此,
Cassandra 可以部署在任何的机器上,当然也可在系统运行机器上,这样从某种
程度上将减少了网络传输增加系统运行速度
风险估值计算模块主要对用户提交风险计算请求作出业务处理,用户在客户
端做任何风险计算业务操作请求,提交到后台风险估值计算模块对应方法中,后
台服务会根据接收到的数据及相关的度量方法参数配置,会调用数据验证模块做
相关联的数据验证,然后将交易数据传输到 Cassandra 里,而仅仅把运算唯一标
示符和相关计算参数发送给计算引擎,最后把计算结果进行数据转化保存在
Cassandra 内,为系统的报表模块服务

4
4.3.1 查询
对于 Cassandra 使用,首先需要定义 Cassandra 服务端信息,如名字,节点
信息。接着需要通过 Cassandra 的命令行预先定义 KeySpace 和 ColumnFamily,
或者通过客户端在运行时动态的创建 KeySpace 和 ColumnFamily。接下来就可以
使用客户端去连接 Cassandra 其中的某一个节点然后存放读取数据了
首先需要定义 Cassandra 的服务端信息(只列出一些比较关键属性)例如
cluster_name:Cassandra 集群名字。主要用于防止在一个逻辑集群里的机器在
加入其他的集群
Partitioner:分区的机制。在一个集群里,负责把行根据 Key 分配到节点上。
其中 RandomPartitioner 是根据 MD5 的形式进行分配的,也是 Cassandra 建议的
一种分配方式
seed_provider:提供一个节点列表的接口。默认类是 SimpleSeedProvider,需
要以逗号为分隔的节点信息
Seeds:节点 IP 地址,作为 Cassandra 与外界交互的连接点。该选项可以设置多
个值,即 Cassandra 集群中有多个种子节点。集群中所有的服务器在启动的时候,
都将于 seed 节点进行通信,从而获取集群的相关信息。如果某一台服务器被设
置为 seed 节点,那么在启动的时候,将自动加入集群,并且不会执行 Bootstrap
的操作,即无法从集群的其他节点中获取相应数据
在完成定义 Cassandra 的集群名字,节点信息后,需要在 Cassandra 服务端
预先定义 KeySpace 和 ColumnFamily 的配置信息和其他一些辅助信息(类似于
TableSchema 和 Table),本系统中是通过系统运行时动态加载
其中分别使用 CreateKey_Space 和 CreateColumnFamily 去创建 KeySpace
和定义 ColumnFamily 后,就可使用 KeySpace 进行操作。就如第二章介绍,
KeySpace 有 点 类 似 于 数 据 库 Schema, 而 Cassandra 里 所 有 操 作 都 是 基 于
KeySpace,不同 KeySpace 数据也是不同的。这里使用 Astyanax1.56.37 作为客
户端工具
根据上述代码,可以清晰的看到客户端将会使用 Cassandra 的配置建立一个
上下文,接着调用 start 方法启动 Cassandra。当 Cassandra 启动后,就可以利
用上下文获取 KeySpace 的,这样就可以使用这个 KeySpace 而获取数据了。如果
剩余15页未读,继续阅读
资源评论


SlumberingPerson
- 粉丝: 3
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- AC#implementationoftheOpenID,OAuthprotocols.zip
- ArduinoLowPowerlibraryforSTM32.zip
- AutomatedCItoolchaintoproduceprecompiledopencv-python,opencv-python-headl.zip
- APythonwrapperaroundtheTwitterAPI..zip
- C++librarytodevelopcompetitiveprogrammingproblems.zip
- ChocolateDoomporttoSTM32F429evaluationboard.zip
- C++onlinecourse.ModulesaboutmodernC++features.C++11,C++14,C++17andC+.zip
- windows环境下安装anaconda教程.md
- ExamplesofprogramswritteninPythononpythonicway.comblog.zip
- ds18b20libraryforstm32hal.zip
- FreePythonGames.zip
- GitPythonisapythonlibraryusedtointeractwithGitrepositories..zip
- LaTeXsourceandsupportingcodeforThinkPython,2ndedition,byAllenDowney..zip
- KagglePythondockerimage.zip
- MainfirmwareoftheHuebnerinverterproject.zip
- OrocosKinematicsandDynamicsC++library.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
