日期:2014-05-16 浏览次数:20455 次
本文试图对数据库异步操作进行一个入门式的介绍,并且对在应用中常遇到的简单的问题给出方案建议.
文档结构:
1.数据库的异步和同步
?? ?通常我们使用DB的方式都是同步的:连接上DB后,我们发起一个sql操作请求,等待操作结束和结果返回后,继续下一步操作。这个等待的过程会导致:
1.之后的操作在结果返回前不会被执行;
2.等待导致被动阻塞,被动阻塞甚至不会释放相关资源,从而进一步造成资源闲置。因此,同步方式的缺点在于并发能力随着sql操作请求耗时的增加而急剧降低,尤其当某一步sql操作耗时较大时
?? ?我们也可以选择使用异步的方式来操作DB:连接上DB后,我们发起一个sql操作请求,同时定义一个该sql操作完成后被触发执行的方法,然后程序不进行任何等待,直接做下一步的操作。真正的sql操作在另一个时刻被单独执行,完成后调用我们定义好的方法。由于DB操作通常是最耗费时间的,因此在异步操作中,常常是程序的主流程很快的被执行完成,而大部分的DB操作甚至还没有开始,他们会在随后开始运行,但此时已不再有被堵塞的线程了——就像一个蓄水池,把过量的河水拦住,避免洪水泛滥。
?? ?异步操作常常依赖于回调的方式,从而把原本顺序的连贯的逻辑拆开来放在不同的地方,复杂情况下就有点四分五裂的感觉了.考虑到容错和异常处理的话,在代码组织和维护上就需要大大的费神了。对于异步操作的简化需要语言级别的支持,而对于常见的js和java而言,缺乏更加强大的机制,因此回调是唯一选择
?? ?当然,对于DB本身而言,都是同步的。不存在一个叫‘异步数据库’的产品。
?
2.WebSQL
?? ?在.net平台上,提供了这种异步操作DB的方式,并且支持的相当优雅。而Java用户可以参考ADBCJ。本文则要谈的是另一个平台:浏览器上的类似产品,相对前者而言有些简陋的WebSQL。
?? ?WebSQL包括一个sqlite3数据库和一个同时支持同步和异步方式的API,支持这个WebSQL的浏览器有chrome,safari和opera。原本WebSQL是被当做HTML5的一部分被推广的,但是最近'有关部门'停止了维护,在将来会由‘indexedDB’所取代,同样的,‘indexedDB’也支持异步的方式。
?? ?WebSQL主要用于在客户端存储一些较为复杂的关系型数据,这些数据需要能够按照多种条件组合被查询出来;如果仅仅是通过key/id来查询数据的,可以适用简单的支持更广泛的localStorage。
?? ?对于支持WebSQL的浏览器,可以通过db = openDatabase(‘WebDB’, '1.0', 'db on client side', 1 * 1024 * 1024) 获取数据库的连接,如果指定的数据库不存在,在浏览器端创建一个名为WebDB,版本为1.0, 大小1M的数据库。
----WebSQL的基本使用
?? ?上文中,获取到的db是一个js对象,里面封装了异步使用数据库的方法。
?? ?假设DB中有表blogs{id, title, gmtCreate}, 页面依赖了jQuery ? ?
var lastId = 10; db.transaction() { function(t) { t.executeSql('select * from blogs where id > ? limit 5 order by id asc', [lastId], function(t, result){ $('.blogs').append('' + result.title + ''); }) } }?