数据库实验小结 Resource Manager
程序内容:写一个本地资源管理器(Resource Manager),模拟数据库的功能,维护几张表。这个RM开放几个函数接口。客户端程序通过调用一些函数,可以查询表的内容,也可以往表插入、删除操作。同一时间可以有多个客户端并发访问,注意并发控制。
要是从前的我,拿到这个题目,肯定二话不说打开eclipse就从基本的类开始写起。毕竟现在境界有了一点点提升了吗。在动手写代码之前,我先宏观构思了一下这个程序会是怎么样子的。从开工到结束,共花了整整4天时间。前面两天调研可能会碰到的知识,后面两个火热的开工。
day1~2 : 调研阶段。自从在微软上过软件工程课之后,我喜欢在软件开发之前,多投入一些规划的时间。对于这个小程序,我主要规划三个方面:(1)程序框架会是怎么样 (2)会遇到的技术难点有哪些 (3)工作时间分配,专业一点说,就是精确到小时的workitems
我主要谈谈第二点吧。对于java程序写的很少的我,很多简单的问题对我来说都可能是阻碍。于是,花了些时间熟悉java的多线程(见我前一篇博客),熟悉java的rmi调用机制(http://www.cnblogs.com/ninahan0419/archive/2009/06/25/javarmi.html 这个入门例子不错),熟悉常用的java数据结构例如LinkedList,ConcurrentHashMap等; 然后复习了一下数据库实现机制,例如ACID性质。查资料是非常耗时间的,有可能一个问题会找一个下午。
day3~4:写代码。要用到的知识基本都熟悉了,框架也基本确定了,写代码就快多了,这里主要谈谈我的实现方式。
1 原子性。一个事务包含很多操作,最终,这些操作要么都提交,要么都不提交。例如当这个事务执行到一半的时候出bug,那么前面的操作也要撤销。
我为每个事务都建立一个日志列表,记录每一个会对数据库有影响的操作。事务在提交(commit)前,没有把改变的内容写入数据库中;一旦执行commit操作,就一次性把所有操作都写入数据库中。当然写的时候要锁定数据库,以保证每次只有一个事务在写数据库,这也是shadow方式的前提。其中数据库是用内存来模拟的,采用shadow方式,内存中保存同一个表的两个样本。如果更新失败,则直接丢弃正在更新的样本,并把另一个样本复制一份;如果更新成功,那么把旧的样本也替换成新的样本。
2 独立性 。 这就涉及到为每个事务申请不同的锁。锁有两种:read和write。锁是采用现成的代码包,我只管用就行了。如果遇到了死锁,那么就要撤销事务的执行。锁的分配按照两阶段分配方式。当事务结束,才释放所有的锁。
3 持久性。每次事务成功执行,就要把更新过的表保存到磁盘上。当数据库启动的时候,也要从磁盘上加载表的内容。
4 资源清理。如果某个客户端申请了锁,但是它故意一直sleep,不进行任何操作,那么它就是在恶意操控资源。为了杀掉这样的病毒,RM每隔固定的时间检查一下是否存在僵尸事务。如果存在一个事务在很长时间都没有继续操作,就把它强制撤销。
完成:最终实现了一个简易数据库的模拟。同一时间,可以有多个不同的客户端,从不同的主机访问我的resource manager,进行查询、插入、删除操作。
posted on 2012-12-16 02:25 leavingseason 阅读(2232) 评论(0) 编辑 收藏 举报