Java中的锁主要包括synchronized锁和JUC包中的锁,这些锁都是针对单个JVM实例上的锁,对于分布式环境如果我们需要加锁就显得无能为力。在单个JVM实例上,锁的竞争者通常是一些不同的线程,而在分布式环境中,锁的竞争者通常是一些不同的线程或者进程。如何实现在分布式环境中对一个对象进行加锁呢?答案就是分布式锁。
目前分布式锁的实现方案主要包括三种:
基于数据库实现分布式锁主要是利用数据库的唯一索引来实现,唯一索引天然具有排他性,这刚好符合我们对锁的要求:同一时刻只能允许一个竞争者获取锁。加锁时我们在数据库中插入一条锁记录,利用业务id进行防重。当第一个竞争者加锁成功后,第二个竞争者再来加锁就会抛出唯一索引冲突,如果抛出这个异常,我们就判定当前竞争者加锁失败。防重业务id需要我们自己来定义,例如我们的锁对象是一个方法,则我们的业务防重id就是这个方法的名字,如果锁定的对象是一个类,则业务防重id就是这个类名。
基于缓存实现分布式锁:理论上来说使用缓存来实现分布式锁的效率最高,加锁速度最快,因为Redis几乎都是纯内存 *** 作,而基于数据库的方案和基于Zookeeper的方案都会涉及到磁盘文件IO,效率相对低下。一般使用Redis来实现分布式锁都是利用Redis的 SETNX key value 这个命令,只有当key不存在时才会执行成功,如果key已经存在则命令执行失败。
基于Zookeeper:Zookeeper一般用作配置中心,其实现分布式锁的原理和Redis类似,我们在Zookeeper中创建瞬时节点,利用节点不能重复创建的特性来保证排他性。
在实现分布式锁的时候我们需要考虑一些问题,例如:分布式锁是否可重入,分布式锁的释放时机,分布式锁服务端是否有单点问题等。
上面已经分析了基于数据库实现分布式锁的基本原理:通过唯一索引保持排他性,加锁时插入一条记录,解锁是删除这条记录。下面我们就简要实现一下基于数据库的分布式锁。
id字段是数据库的自增id,unique_mutex字段就是我们的防重id,也就是加锁的对象,此对象唯一。在这张表上我们加了一个唯一索引,保证unique_mutex唯一性。holder_id代表竞争到锁的持有者id。
如果当前sql执行成功代表加锁成功,如果抛出唯一索引异常(DuplicatedKeyException)则代表加锁失败,当前锁已经被其他竞争者获取。
解锁很简单,直接删除此条记录即可。
是否可重入 :就以上的方案来说,我们实现的分布式锁是不可重入的,即是是同一个竞争者,在获取锁后未释放锁之前再来加锁,一样会加锁失败,因此是不可重入的。解决不可重入问题也很简单:加锁时判断记录中是否存在unique_mutex的记录,如果存在且holder_id和当前竞争者id相同,则加锁成功。这样就可以解决不可重入问题。
锁释放时机 :设想如果一个竞争者获取锁时候,进程挂了,此时distributed_lock表中的这条记录就会一直存在,其他竞争者无法加锁。为了解决这个问题,每次加锁之前我们先判断已经存在的记录的创建时间和当前系统时间之间的差是否已经超过超时时间,如果已经超过则先删除这条记录,再插入新的记录。另外在解锁时,必须是锁的持有者来解锁,其他竞争者无法解锁。这点可以通过holder_id字段来判定。
数据库单点问题 :单个数据库容易产生单点问题:如果数据库挂了,我们的锁服务就挂了。对于这个问题,可以考虑实现数据库的高可用方案,例如MySQL的MHA高可用解决方案。
使用Jedis来和Redis通信。
可以看到,我们加锁就一行代码:
jedis.set(String key, String value, String nxxx, String expx, int time)
这个set()方法一共五个形参:
第一个为key,我们使用key来当锁,因为key是唯一的。
第二个为value,这里写的是锁竞争者的id,在解锁时,我们需要判断当前解锁的竞争者id是否为锁持有者。
第三个为nxxx,这个参数我们填的是NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set *** 作;若key已经存在,则不做任何 *** 作。
第四个为expx,这个参数我们传的是PX,意思是我们要给这个key加一个过期时间的设置,具体时间由第五个参数决定;
第五个参数为time,与第四个参数相呼应,代表key的过期时间。
总的来说,执行上面的set()方法就只会导致两种结果:1.当前没有锁(key不存在),那么久进行加锁 *** 作,并对锁设置一个有效期,同时value表示加锁的客户端。2.已经有锁存在,不做任何 *** 作。
上述解锁请求中, SET_IF_NOT_EXIST (不存在则执行)保证了加锁请求的排他性,缓存超时机制保证了即使一个竞争者加锁之后挂了,也不会产生死锁问题:超时之后其他竞争者依然可以获取锁。通过设置value为竞争者的id,保证了只有锁的持有者才能来解锁,否则任何竞争者都能解锁,那岂不是乱套了。
解锁的步骤:
注意到这里解锁其实是分为2个步骤,涉及到解锁 *** 作的一个原子性 *** 作问题。这也是为什么我们解锁的时候用Lua脚本来实现,因为Lua脚本可以保证 *** 作的原子性。那么这里为什么需要保证这两个步骤的 *** 作是原子 *** 作呢?
设想:假设当前锁的持有者是竞争者1,竞争者1来解锁,成功执行第1步,判断自己就是锁持有者,这是还未执行第2步。这是锁过期了,然后竞争者2对这个key进行了加锁。加锁完成后,竞争者1又来执行第2步,此时错误产生了:竞争者1解锁了不属于自己持有的锁。可能会有人问为什么竞争者1执行完第1步之后突然停止了呢?这个问题其实很好回答,例如竞争者1所在的JVM发生了GC停顿,导致竞争者1的线程停顿。这样的情况发生的概率很低,但是请记住即使只有万分之一的概率,在线上环境中完全可能发生。因此必须保证这两个步骤的 *** 作是原子 *** 作。
是否可重入 :以上实现的锁是不可重入的,如果需要实现可重入,在 SET_IF_NOT_EXIST 之后,再判断key对应的value是否为当前竞争者id,如果是返回加锁成功,否则失败。
锁释放时机 :加锁时我们设置了key的超时,当超时后,如果还未解锁,则自动删除key达到解锁的目的。如果一个竞争者获取锁之后挂了,我们的锁服务最多也就在超时时间的这段时间之内不可用。
Redis单点问题 :如果需要保证锁服务的高可用,可以对Redis做高可用方案:Redis集群+主从切换。目前都有比较成熟的解决方案。
利用Zookeeper创建临时有序节点来实现分布式锁:
其基本思想类似于AQS中的等待队列,将请求排队处理。其流程图如下:
解决不可重入 :客户端加锁时将主机和线程信息写入锁中,下一次再来加锁时直接和序列最小的节点对比,如果相同,则加锁成功,锁重入。
锁释放时机 :由于我们创建的节点是顺序临时节点,当客户端获取锁成功之后突然session会话断开,ZK会自动删除这个临时节点。
单点问题 :ZK是集群部署的,主要一半以上的机器存活,就可以保证服务可用性。
Zookeeper第三方客户端curator中已经实现了基于Zookeeper的分布式锁。利用curator加锁和解锁的代码如下:
*** 作系统(英语:Operating System,简称OS)是一管理电脑硬件与电脑软件资源的程序,同时也是计算机系统的核心与基石。 *** 作系统身负诸如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、 *** 作网络与管理文件系统等基本事务。 *** 作系统也提供一个让用户与系统交互的 *** 作接口。*** 作系统的型态非常多样,不同机器安装的 *** 作系统可从简单到复杂,可从手机的嵌入式系统到超级电脑的大型 *** 作系统。许多 *** 作系统制造者对它涵盖范畴的定义也不尽一致,例如有些 *** 作系统集成了图形化用户界面,而有些仅使用文字接口,而将图形接口视为一种非必要的应用程序。
*** 作系统理论在计算机科学中,为历史悠久而又活跃的分支;而 *** 作系统的设计与实现则是软件工业的基础与核心。
现代 *** 作系统通常都有一个使用的绘图设备的图形化用户界面,并附加如鼠标或触控面版等有别于键盘的输入设备。旧的OS或效能导向的服务器通常不会有如此亲切的接口,而是以命令行接口(CLI)加上键盘为输入设备。以上两种接口其实都是所谓的壳,其功能为接受并处理用户的指令(例如按下一按钮,或在命令提示列上键入指令)。
选择要安装的 *** 作系统通常与其硬件架构有很大关系,只有Linux与BSD几乎可在所有硬件架构上运行,而Windows NT仅移植到了DEC Alpha与MIPS Magnum。在1990年代早期,个人电脑的选择就已被局限在Windows家族、类Unix家族以及Linux上,而以Linux及Mac OS X为最主要的另类选择,直至今日。
大型机与嵌入式系统使用很多样化的 *** 作系统。大型主机近期有许多开始支持Java及Linux以便共享其他平台的资源。嵌入式系统近期百家争鸣,从给Sensor Networks用的Berkeley Tiny OS到可以 *** 作Microsoft Office的Windows CE都有。
个人电脑: Apple Macintosh - Mac OS X,Windows(仅Intel平台),Linux、BSD。
IBM兼容PC - Windows、Linux、BSD、Mac OS X(非正式支持)。
大型机: Burroughs MCP-- B5000, IBM OS/360 -- IBM System/360, UNIVAC EXEC 8 -- UNIVAC 1108
嵌入式系统: 嵌入式系统使用非常广泛的 *** 作系统(如VxWorks、eCos、Symbian OS及Palm OS)以及某些功能缩减版本的Linux或者其他 *** 作系统。某些情况下,OS指称的是一个内置了固定应用软件的巨大泛用程序。在许多最简单的嵌入式系统中,所谓的OS就是指其上唯一的应用程序。
类Unix系统: 所谓的类Unix家族指的是一族种类繁多的OS,此族包含了System V、BSD与Linux。由于Unix是The Open Group的注册商标,特指遵守此公司定义的行为的 *** 作系统。而类Unix通常指的是比原先的Unix包含更多特征的OS。
Unix系统可在非常多的处理器架构下运行,在服务器系统上有很高的使用率,例如大专院校或工程应用的工作站。自由软件Unix变种,例如Linux与BSD近来越来越受欢迎,它们也在个人桌面电脑市场上大有斩获,例如Ubuntu系统。
某些Unix变种,例如HP的HP-UX以及IBM的AIX仅设计用于自家的硬件产品上,而SUN的Solaris可安装于自家的硬件或x86电脑上。苹果电脑的Mac OS X是一个从NeXTSTEP、Mach以及FreeBSD共同派生出来的微核心BSD系统,此OS取代了苹果电脑早期非Unix家族的Mac OS。
经历数年的披荆斩棘,自由开源的Unix系统逐渐蚕食以往专利软件的专业领域,例如以往电脑动画运算巨擘——SGI的IRIX系统已被Linux家族及贝尔实验室研发小组设计的九号计划与Inferno系统取代,皆用于分散表达式环境。它们并不像其他Unix系统,而是选择内置图形化用户界面。九号计划原先并不普及,因为它刚推出时并非自由软件。后来改在自由及开源软件许可证Lucent Public License释出后,便开始拥有广大的用户及社区。Inferno已被售予Vita Nuova并以GPL/MIT许可证释出。
当前,计算机按照计算能力排名世界500强中472台使用Linux,6台使用Windows,其余为各类BSD等Unix。
微软Windows: Microsoft Windows系列 *** 作系统是在微软给IBM机器设计的MS-DOS的基础上设计的图形 *** 作系统。现在的Windows系统,如Windows 2000、Windows XP皆是创建于现代的Windows NT核心。NT核心是由OS/2和OpenVMS等系统上借用来的。Windows可以在32位和64位的Intel和AMD的处理器上运行,但是早期的版本也可以在DEC Alpha、MIPS与PowerPC架构上运行。 虽然由于人们对于开放源代码作业系统兴趣的提升,Windows的市场占有率有所下降,但是到2004年为止,Windows *** 作系统在世界范围内占据了桌面 *** 作系统90%的市场。[3]
Windows系统也被用在低级和中阶服务器上,并且支持网页服务的数据库服务等一些功能。最近微软花费了很大研究与开发的经费用于使Windows拥有能运行企业的大型程序的能力。
苹果Mac OS: Mac OS是一套运行于苹果Macintosh系列电脑上的 *** 作系统。Mac OS是首个在商用领域成功的图形用户界面。
Chrome OS: Google Chrome OS是一项Google的轻型电脑 *** 作系统计划,其基于Google的浏览器Chrome的Linux内核。
进程管理: 不管是常驻程序或者应用程序,他们都以进程为标准运行单位。当年运用冯·诺伊曼结构建造电脑时,每个中央处理器最多只能同时运行一个进程。早期的OS(例如DOS)也不允许任何程序打破这个限制,且DOS同时只有运行一个进程(虽然DOS自己宣称他们拥有终止并等待驻留(TSR)能力,可以部分且艰难地解决这问题)。现代的 *** 作系统,即使只拥有一个CPU,也可以利用多进程(multitask)功能同时运行复数进程。进程管理指的是 *** 作系统调整复数进程的功能。
由于大部分的电脑只包含一颗中央处理器,在单核心(Core)的情况下多进程只是简单迅速地切换各进程,让每个进程都能够运行,在多核心或多处理器的情况下,所有进程通过许多协同技术在各处理器或核心上转换。越多进程同时运行,每个进程能分配到的时间比率就越小。很多OS在遇到此问题时会出现诸如音效断续或鼠标跳格的情况(称做崩溃(Thrashing),一种OS只能不停运行自己的管理程序并耗尽系统资源的状态,其他用户或硬件的程序皆无法运行)。进程管理通常实践了分时的概念,大部分的OS可以利用指定不同的特权等级(priority),为每个进程改变所占的分时比例。特权越高的进程,运行优先级越高,单位时间内占的比例也越高。交互式OS也提供某种程度的回馈机制,让直接与用户交互的进程拥有较高的特权值。
除了进程管理之外,OS尚有担负起进程间通信(IPC)、进程异常终止处理以及死锁(Dead Lock)侦测及处理等较为艰深的问题。
在进程之下尚有运行绪的问题,但是大部分的OS并不会处理运行绪所遭遇的问题,通常OS仅止于提供一组API让用户自行 *** 作或通过虚拟机的管理机制控制运行绪之间的交互。
存储器管理: 根据帕金森定律:“你给程序再多存储器,程序也会想尽办法耗光”,因此程序员通常希望系统给他无限量且无限快的存储器。大部分的现代电脑存储器架构都是层次结构式的,最快且数量最少的暂存器为首,然后是高速缓存、存储器以及最慢的磁盘存储设备。而OS的存储器管理提供查找可用的记忆空间、配置与释放记忆空间以及交换存储器和低速存储设备的内含物……等功能。此类又被称做虚拟内存管理的功能大幅增加每个进程可获得的记忆空间(通常是4GB,既使实际上RAM的数量远少于这数目)。然而这也带来了微幅降低运行效率的缺点,严重时甚至也会导致进程崩溃。
存储器管理的另一个重点活动就是借由CPU的帮助来管理虚拟位置。如果同时有许多进程存储于记忆设备上, *** 作系统必须防止它们互相干扰对方的存储器内容(除非通过某些协议在可控制的范围下 *** 作,并限制可访问的存储器范围)。分区存储器空间可以达成目标。每个进程只会看到整个存储器空间(从0到存储器空间的最大上限)被配置给它自己(当然,有些位置被OS保留而禁止访问)。CPU事先存了几个表以比对虚拟位置与实际存储器位置,这种方法称为标签页(paging)配置。
借由对每个进程产生分开独立的位置空间,OS也可以轻易地一次释放某进程所占据的所有存储器。如果这个进程不释放存储器,OS可以退出进程并将存储器自动释放。
磁盘与文件系统: 所谓的文件系统,通常指称管理磁盘数据的系统,可将数据以目录或文件的型式存储。每个文件系统都有自己的特殊格式与功能,例如日志管理或不需磁盘重整。
OS拥有许多种内置文件系统。例如Linux拥有非常广泛的内置文件系统,如ext2、ext3、ext4、ReiserFS、Reiser4、GFS、GFS2、OCFS、OCFS2、NILFS与Google文件系统。Linux也支持非本地文件系统,例如XFS、JFS、FAT家族与NTFS。另一方面,Windows能支持的文件系统只有FAT12、FAT16、FAT32与NTFS。NTFS系统是Windows上最可靠与最有效率的文件系统。其他的FAT家族都比NTFS老旧,且对于文件长度与分区磁盘能力都有很大限制,因此造成很多问题。而UNIX的文件系统多半是UFS,而UNIX中的一个分支Solaris最近则开始支持一种新式的ZFS
大部份上述的文件系统都有两种建置方法。系统可以以日志式(Journaling file system)或非日志式建置。日志式文件系统可以以较安全的手法运行系统回复。如果一个没有日志式建置的文件系统遇上突然的系统崩溃,导致数据创建在一半时停顿,则此系统需要特殊的文件系统检查工具才能撤消;日志式则可自动回复。微软的NTFS与Linux的ext3、ext4、reiserFS与JFS都是日志式文件系统。
每个文件系统都实现相似的目录/子目录架构,但在相似之下也有许多不同点。微软使用“\”符号以创建目录/子目录关系,且文件名称忽略其大小写差异;UNIX系统则是以“/”创建目录架构,且文件名称大小写有差异。
网络: 许多现代的OS都具备 *** 作主流网络通信协议TCP/IP的能力。也就是说这样的 *** 作系统可以进入网络世界,并且与其他系统分享诸如文件、打印机与扫描仪等资源。
许多OS也支持多个过去网络启蒙时代的各路网络通信协议,例如IBM创建的SNA、DEC在它所生产的系统所设置的DECnet架构与微软为Windows制作的特殊通信协议。还有许多为了特殊功能而研发的通信协议,例如可以在网络上提供文件访问功能的NFS系统。现今大量用于影音流(Streaming media)及游戏消息传送的UDP协议等。
安全: 大多数OS都含有某种程度的信息安全机制。信息安全机制主要基于两大理念:
OS提供外界直接或间接访问数种资源的管道,例如本地端磁盘驱动器的文件、受保护的特权系统调用(System call)、用户的隐私数据与系统运行的程序所提供的服务。
OS有能力认证(Authorization)资源访问的请求。允许通过认证的请求并拒绝无法通过的非法请求,并将适当的权力授权(Authentication)给此请求。有些系统的认证机制仅简略地把资源分为特权或非特权,且每个请求都有独特的身份辨识号码,例如用户名称。资源请求通常分成两大种类:
内部来源:通常是一个正在运行的程序发出的资源请求。在某些系统上,一个程序一旦可运行就可做任何事情(例如DOS时代的病毒),但通常OS会给程序一个识别代号,并且在此程序发出请求时,检查其代号与所需资源的访问权限关系。
外部来源:从非本地端电脑而来的资源请求,例如远程登录本机电脑或某些网络连接请求(FTP或HTTP)。为了识别这些外部请求,系统也许会对此请求提出认证要求。通常是请求输入用户名称以及相对应的密码。系统有时也会应用诸如磁卡或生物识别数据的它种认证方法。在某些例子,例如网络通信上,通常不需通过认证即可访问资源(例如匿名访问的FTP服务器或P2P服务)。
除了允许/拒绝形式的安全机制,一个高安全等级的系统也会提供记录选项,允许记录各种请求对资源访问的行为(例如“谁曾经读了这个文件?”)。
肇因于军方与商业组织将敏感数据记录在电脑上,安全机制在OS历史上是一个被长久关注与讨论的问题。美国国防部(DoD)便创立了《可信赖之计算机系统评鉴程序》(TCSEC),此手册确立了评鉴安全机制成效的基本原则。这对OS作者来说非常重要,因为TCSEC是用于评鉴、分类与选拔出用于处理、存储与获取敏感或机密数据的电脑系统的标准程序。
内部信息安全: 内部信息安全可视为防止正在运行的程序任意访问系统资源的手段。大多OS让普通程序可直接 *** 作电脑的CPU,所以产生了一些问题,例如怎样把可如OS一样处理事务、运行同样特殊指令的程序强迫停止,毕竟在此情境下,OS也只是另一个平起平坐的程序。为通用OS所生产的CPU通常于硬件层级上实践了一定程度的特殊指令保护概念。通常特权层级较低的程序想要运行某些特殊指令时会被阻断,例如直接访问像是硬盘之类的外部设备。因此,程序必须得经由询问OS,让OS运行特殊指令来访问磁盘。因此OS就有机会检查此程序的识别身份,并依此接受或拒绝它的请求。
在不支持特殊指令架构的硬件上,另一个也是唯一的保护方法,则是OS并不直接利用CPU运行用户的程序,而是借由模拟一个CPU或提供一p-Code系统(伪代码运行机),像是Java一样让程序在虚拟机上运行。
内部安全机制在多用户电脑上特别重要:它允许每个系统用户拥有自己个人的文件与目录,且其他用户不能任意访问或删除。因为任何程序都可能绕过OS的监控,更有可能绕过侧录程序的监控,拥有强制力的内部安全机制在侧录启动时也非常重要。
外部信息安全: 通常一个 *** 作系统会为其他网络上的电脑或用户提供(主持)各种服务。这些服务通常借由端口或OS网络地址后的数字访问点提供。通常此服务包括提供文件共享(NTFS)、打印共享、电子邮件、网页服务与文件传输协议(FTP)。 外部信息安全的最前线,是诸如防火墙等的硬件设备。在OS内部也常设置许多种类的软件防火墙。软件防火墙可设置接受或拒绝在OS上运行的服务与外界的连接。因此任何人都可以安装并运行某些不安全的网络服务,例如Telnet或FTP,并且设置除了某些自用通道之外阻挡其他所有连接,以达成防堵不良连接的机制。
用户界面: 今日大部分的OS都包含图形化用户界面。有几类较旧的OS将图形化用户界面与核心紧密结合,例如最早的Windows与Mac OS实现产品。此种手法可提供较快速的图形回应能力,且实现时不需切割模块因而较为省工,但是会有强烈副作用,例如图形系统崩溃将导致整个系统崩溃,例如死亡蓝屏幕。许多近代的OS已模块化,将图形接口的副系统与核心分开(已知Linux与Mac OS X原先就是如此设计,而某些扩充版本的Windows终于也采用此手法)。
许多OS允许用户安装或创造任何他们喜欢的图形接口[6]。大部分的Unix与Unix派生系统(BSD、Linux与Minix)通常会安装X Window系统配合GNOME或KDE桌面环境。而某些OS就没有这么d性的图形化用户界面,例如Windows。这类的OS只能通过外加的程序来改变其图形化用户界面,甚或根本只能改变诸如菜单风格或颜色配置等部分[来源请求]。
图形化用户界面与时并进,例如Windows在每次新版本上市时就会将其图形化用户界面改头换面,而Mac OS的GUI也在Mac OS X上市时出现重大转变。
驱动程序: 所谓的驱动程序(Device driver)是指某类设计来与硬件交互的电脑软件。通常是一设计完善的设备交互接口,利用与此硬件连接的电脑汇排流或通信子系统,提供对此设备下令与接收信息的功能;以及最终目的,将消息提供给OS或应用程序。驱动程序是针对特定硬件与特定OS设计的软件,通常以 *** 作系统核心模块、应用软件包或普通电脑程序的形式在OS核心底下运行,以达到通透顺畅地与硬件交互的效果,且提供硬件在处理异步的时间依赖性接口(asynchronous time-dependent hardware interface)时所需的中断处理程序(Interrupt handler)。
设计驱动程序的主要目的在于 *** 作抽象化,任何硬件模块,既使是同一类的设备,在硬件设计面上也有巨大差异。厂商推出的较新模块通常更可靠更有效率,控制方法也会有所不同。电脑与其OS每每不能预期那些现有与新设备的变异之处,因此无法知道其 *** 作方法。为解决此问题OS通常会主动制订每种设备该有的 *** 作方式,而驱动程序功能则是将那些OS制订的行为描述,转译为可让设备了解的自定义 *** 作手法。
理论上适合的驱动程序一旦安装,相对应的新设备就可以无误地运行。此新驱动程序可以让此设备完美地切合在OS中,让用户察觉不到这是OS原本没有的功能。
我用的是建筑工程ABCD比如===============ABCD资料软件===================
2004-3-31版本:
=========================================
1、改正了上一版本的Ctr+Enter换行问题
2、改正了上一版本的偶尔烂表问题;
3、支持打印比例的永久设置;
4、支持显示比例的永久设置;
5、支持签名防复制;
6、增加全部已填资料的过滤(F7);
7、修改配置,建立新文件不采用文件复制方式。
=========================================
2004-4-13版本:
=========================================
1、改正撤消和重做功能;
2、改正烂表问题;
3、模版升级;
=========================================
2004-7-20版本:
=========================================
新增功能和功能增强:
1、USB锁版本增加了节点查询与节点分批加载的功能、节点查询加载功能。
2、支持资料夹功能:资料夹创建、添加资料、删除资料夹所包含的资料;
3、检验批汇总功能增强:可设置汇总选项,根据汇总选项汇总、生成汇总报告;
4、公章制作、盖章、认证;
5、资料文件的修复和压缩工具
6、可修改多单元字体参数;
7、数理统计表类的Cv=mfcu/fcuk自动计算;
8、印签确认书图片尺寸修改
9、加一页功能:改为复制当前页
10、复制表页后,不会复制表格中签名和公章信息;
11、手写签名不再受到表页放大缩小比例影响;
12、单元可插入Modify软件所生成的win3x格式的图片插入 以及emf图片、Aldus wmf图片
(以前版本实际只唯一支持Aldus wmf图片,而插入其他格式的wmf图片会导致程序出错)。
13、关于表格和Excel文件相互转换功能。在以前版本中,只可以转换到Excel2000,而且很多格式转换不完整。
当前版本采用直接分析Excel文件格式,分读Excel文件(把Excel文件转换成Cll文件)和写Excel文件(把Cll文件)两个过程。
目前读可以支持Excel任何版本(包含XP、2003)写支持Excel97、2000、XP、2003版本。
需要说明的是文字格式可以完全转换,但部分公式(Cll和excel公式名称不一样的公式)、图表、图片目前仍然不能转换,
我们会继续努力解决。
14、支持表格内部的内源性文本与外部软件(如word)的外源性文本的复制粘贴,方法:内源性文本粘贴优先,如果需要,
先执行"编辑"菜单中的"清空表格剪贴板"命令,然后可切换到外源性文本的复制粘贴;
15、同一模板下面两个资料夹资料的相互拖动功能;
16、链接文档下可以增加附件。
17、要求用户备份文件(说明)文件尽量控制在1GB以内,新版本文件最大可以达到2GB(如超过2GB,数据库就有可能崩溃或丢失),但文件太大会影响到性能
错误修改:
1、F7,F8,F11可重入问题已改正。
2、因 *** 作不当所导致的只读单元修改问题已经获得改正;
3、导致空表的 *** 作(删除当前页)已经被屏蔽;
4、单元输入时间格式数字或文本后,该单元被自动认定为“日期格式”单元格,再也不能输入其他格式的数据,当前版本在
“单元”中新增两个子菜单“数字格式” 和“字符串格式”菜单来按需要恢复单元输入格式: *** 作时,应先删除单元内容,
再选用上述两个菜单命令之一。
5、因 *** 作不当,目录区资料名称会修改的问题已经改正;
6、导出节点发邮件,文件名会检测并在必要时增加后缀,已防止了节点文件不能打开的问题;
7、锁定单元可插入图片、符号、合并、拆分等问题已经修改;
8、更正了其他某些问题。
9、修改了文件归档后再次释放到新的文件位置可能出现的问题等。
功能需加强以及发现的其他尚未解决的问题:
1、导入导出类问题:例如表格附件附件导入导出
2、土建"D-11-7主体结构"中表0201-1与0201-2中未包含可以汇总的信息,因此这两张表不应进行汇总,
应提请市质检总站修改表格体系的设计。
=========================================
2005-1-1版本
=========================================
1、建筑工程和桩基工程的C-3、C-7、C-8、C-11、C-12等表式为了满足有大量试块组数的要求而进行了适当扩充,但新版本的以上几张表式因为表格发生变更而不能兼容以前的版本。版本更新后对以前版本所做的建筑工程和桩基工程的C-3、C-7、C-8、C-11、C-12表式可以查看,但某些单元格则不能修改。如要修改则最好用新版本重新填写以上表式。
2、词组库扩充了较多常用符号。
3、文件排序方式增加了“下级节点名称序号”、“按名称序号升序”两种排序方式。
4、增加“添加文件夹”功能,用户能按自己要求将文件放入文件夹中。
5、链接文档支持添加附件功能,链接文档和附件也支持导入导出功能。
6、在已填表格中按鼠标右键有“查看示例”,可以查看次表格填写样表。在帮助中也可以查看填写的表格示例。
7、分项、分部汇总排序。在填写模式中先选取至少2行,点取单元菜单中的“矩阵文本排序”,可在“序号”一栏中自己设置排列顺序(对数字的连续性没有特殊的要求,以数字的大小设置排序顺序)。
8、增加“加盖公章”功能,并能修改印签和公章密码。
9、支持双击文件名可以直接用软件打开的功能。
10、目前软件支持单个文件最大为1GB。因为文件太大会给软件的使用的带来速度和性能上的下降;如果单个文件的大小超过了1GB,就可能造成数据库的丢失或崩溃。在软件的使用过程中,用户要养成经常备份文件资料的习惯。
=========================================
2005-5-15版本
=========================================
新增功能:
1、自由导入导出表格文件附件、非表格文档、文件夹,完善导入导出归档报告。
2、自由导入导出用户自定义模板,完善导入导出归档报告。
3、导入导出签名公章
4、制作公章可使用图片
修订问题:
1、修改复制后盖章会把前张表格公章部分会在新表中出现的问题
2、屏蔽非表格文档下增加附件问题。(原可增加,现不能增加)
3、修改在编辑状态下进行其他 *** 作会强退问题。
4、屏蔽制作数字印模时使用印模和使用图片功能,制作完成后不提示印模图片生成位置。
5、修改制作模板后的“表单”菜单出现的问题。
6、修改复制表格后,表样格式混乱问题。
7、修改由于自定义模板过多出现的刷新问题。
8、完善查看示例的功能(主要是增加A、C两册的示例)。
9、修改全部删除自定义模板会出现模板母节点会被删除的问题
10、数字印签制作对话框屏蔽“使用印模”和“使用图片”按钮
11、增加附件、非表格文档过大提示(超过200k提示)
12、电子签名、加盖公章使用分开
13、电子签名透明化
14、屏蔽制作电子公章时的“直接手写”按钮
15、自由选择盖章位置(原为在单元格盖章),盖章前有浮动半透明虚框
=========================================
2005-10-12版本
=========================================
错误修改:
1、签名覆盖及覆盖后的认证。
2、关于打印:连表的打印问题;一般表格的大小不统一。
3、关于资料夹: ①表格无法排序;
②加载超过100张表格,有些表格显示不出的问题,已经增加分批显示。
4、建筑工程C-7混凝土试块数理统计评定表22行D列的单元格,打不进去数字。
5、使用“复制当前表格”这个功能后,文字格式不能复制。
6、非表格实例的查询问题。
7、数字印签制作:如果忘记点“直接手写”而直接点“制作”,就会跳出“运行时错误‘5’ 无效的过程调用或参数”。
8、特殊符号及常用词组的直接插入。
新增功能:
1、工程文件备份、还原。
2、提交档案馆以及工程单位自保留所需内容的浏览。
3、新增绿化工程资料表格。
4、新增监理资料(GB50319-2000)。
=========================================
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)