在DB2 9.5版本中,数据库引擎由基于过程模式转变为线程模式,这将意味着整个数据库引擎都在一个地址空间下(任何代码段都可以访问任何全局变量)。这自然是有利也有弊。其中一个有利的方面是线程比过程更“轻”,这表示DB2的性能更好。有人做过测试显示DB2 9.5的性能在负荷运行情况下比相同状态下的DB2 9.1提升了2%到5%。
而不利的方面是,在任何与缓冲池无关的任何db2代码路径中的任何db2错误都有可能会破坏数据页。此外,和db2共享相同地址空间的非保护模式下的用户自定义函数(unfenced UDF)也有可能会破坏内存页。而后,这些不正确数据页就会在毫不察觉的情况下被写入磁盘里,而你很可能永远都不会知道这些数据已经出现了不一致。线程模式还会产生与非保护模式下的用户自定义函数相关的安全问题,因为线程模式在潜在情况下会允许恶意用户代码在没有得到授权的情况下读写数据页。如果在保护(fensed)模式下运行用户自定义函数,这些问题就都不成问题,用户代码会通过一个子过程执行并且会通过IPC与DB2进行交流,唯一的问题就是这样做比在非保护模式下运行要慢很多。
在IBM的Power6 CPU上市的时候,也带来了一项用于内存保护的新技术就是用户级别存储键技术。这里不是说的内核级别存储键,这个已经存在了一段时间,而用户级别的存储键则是个新东西。存储键能够使应用程序锁定内存页,防止对其进行任何形式的读写组合操作。
必须支持CPU上的存储键是因为内存访问的速度非常之快(达到纳秒级),在软件水平是无法做到的。存储键使在用户空间执行的DB2引擎能够防止代码段对缓冲池数据页进行无授权的读写操作。当然,如果你是在AIX上运行Power6处理器,那这只是其中一个可选的保护措施。启动该功能需要5%到6%的性能开销。用下面的语句启动该功能:
以下是引用片段:
db2set DB2_MEMORY_PROTECT=yes
RESTART YOUR INSTANCE
你需要运行AIX 5.3 ML6(或更高版本)或AIX 6.1版操作系统。
假如你还在AIX上开发c或c++代码,而且并不适用Java的话,你可以选择使用ukey_protect( address, size, UKEY_PRIVATE)函数来协助保护数据内存结构。