日期:2014-05-16  浏览次数:20435 次

[转]异步使用DB,websql

本文试图对数据库异步操作进行一个入门式的介绍,并且对在应用中常遇到的简单的问题给出方案建议.

文档结构:

  1. 数据库的同步和异步
  2. websql
  3. 异步下的一些状况和方案

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 + '');
			})
		}
	}
?