这段时间,我在更改各省的datasource.xml 发现花样百出,缺乏统一的规范和标准。
后面要做的是,就是建立规范,监督执行,和持续改进。
规范的标准
连接oracle数据库工厂要用c3p0
连接sybase数据库工厂要用 direct
有ref应用,再写明细就没有用了
<SYCHWORKFLOW type = "oracle" ref="Default">
<property name = "driver">oracle.jdbc.driver.OracleDriver</property >
<property name = "url"><![CDATA[jdbc:oracle:thin:aaa/aaa@255.255.255.255:1521:sid]]></property>
</SYCHWORKFLOW>
以上这个例子就是错误的,用了ref 引用了default ,后面的东西就有用了
用ref 引用前面的说明的时候 需要添加pool ,复用原来的链接池。
<SYCHWORKFLOW ref="pool:Default"/> </SYCHWORKFLOW>
这样做的好处是,可以有效降低 数据库服务进程数量。减少服务器的内存开销。
在研究oracle相关技术文档后,我发现这样的做法,可以提高 不解析的 百分比。这点太重要了。
不解析,比软解析和硬解析不仅仅是快的问题,对数据库的性能消耗也少,带来的性能提升效果是链式的。
内存释放出来以后,可以分配更多的pga 和sga,在目前数据没有高效的存储前提下,只有通过
sga,pga 来改善磁盘IO了.一张RPT表几条记录,64K空间,不用索引,全表扫描,2次IO,很奢侈。性能
就是这样被一点一点消耗的。
前面说了,datasource.xml的引用和池问题。下面重点关注一下
<property name = "url"><![CDATA[jdbc:oracle:thin:aaa/aaa@255.255.255.255:1521:sid]]></property>
在rac 环境下,如何写好上面这句话呢?我们先简单的了解一下 几个专用名词和rac 的架构。
数据库名: 用户数据,和数据库服务器数据的集合。
举个例子, 电影文件是数据吧。
老爸老妈罗曼史 是一个数据库
仙剑奇侠传3 是一个数据库
实例名:正在运行的数据库服务器程序的名称
举个例子:(正在运行的)(((暴风影音程序的)进程的)名字)
定语 定语 定语
定语太多了,我打括号
开两个暴风影音的窗口 ,就是两个暴风影音实例
开三个wps文档程序,就是 三个wps文档实例
两台小型机各运行一个数据库服务器程序,就是两个数据库实例
服务名:9i以后提出了服务的概念。服务的概念类似于现在很热的云。客户不需要知道具体是哪个实例提供数据库服务的,只要使用这个服务就可以了。就像现在用的电,你只要从电网交钱取电就可以,而不需要知道你现在用的电是从哪个煤电厂或者核电厂,风电厂发出来的。
具体到数据库,数据库实例提供了一种访问数据库的方法,同时也提供了访问数据库的服务,一个实例可以提供多个服务,也可以用多个实例捆绑成一个服务。
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string oralab
SQL> alter system set service_names=oralab,ysyf,gl,zjgc,rpt,zjgk,zcgl,tmszc,khhs,xmhs,tmsfzwf;
service_names 是服务器动态参数。可以随时更改。
这样在监听程序里面:
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xiaomxruntoocm)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.4.0 - Production
启动日期 14-5月 -2011 11:01:16
正常运行时间 0 天 0 小时 9 分 9 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
监听程序日志文件 D:/oracle/product/10.2.0/db_1/network/log/listener.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xiaomxruntoocm)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xiaomxruntoocm)(PORT=15210)))
服务摘要..
服务 "GL" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "KHHS" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "RPT" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "TMSFZWF" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "TMSZC" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "XMHS" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "YSYF" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ZCGL" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ZJGC" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ZJGK" 包含 1 个例程。
例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
这是一个实例 提供了多个服务,包括:管理, KH核算,报表,TMS辅助流程,TMS资产,项目核算,
应收应付,资产管理,在建工程,资金管控 这些服务。
再来看一下 tnsname.ora 服务名配置的 例子
ORALAB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 15200))
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 25200))
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 25200))
(LOAD_BALANCE = yes)
)
(CONNECT_DATA =
(SERVICE_NAME = oralab)
)
)
用netmgr 编辑以上的 服务名,会发现旁边有一个高级按钮,点击出来一个 地址列表选项窗口。
按顺序尝试每个地址,直到有一个地址成功 failover 故障转移 ,
但tnsnames.ora里面没有写任何failover=yes的选项
随机尝试每个地址,直到成功 均衡负载,加故障转移
(LOAD_BALANCE = yes),没有写任何failover=yes的选项
随机选择尝试一个地址 负载均衡,但不故障转移
(LOAD_BALANCE = yes)(FAILOVER = false)
按顺序使用每个地址,直至到达目标 (SOURCE_ROUTE = yes)(FAILOVER = false)
只使用第一个地址 不故障转移(FAILOVER = false)
failover 只有在flase 的时候才会写出来。负载均衡只有在yes的时候才会写出来
RAC特性: