首先,我知道SQLite可能不是高并发需求的最合适的DBMS,但目前至少对于我来说,使用客户端/服务器DBMS不是一个选项。
我正在开发的应用程序可能会从不同的线程生成大量的查询和更新。它们不会是非常繁重或复杂的更新,可能大多数是小型且快速的,但是由于它们依赖于从网络上的客户端获得的信息,因此具有极其不可预测性的并发性。据我所知,SQLite目前能够支持许多并发读取,但每次只能更新一个。当它进行写入时,需要获取排他锁,并在写入时如果其他内容正在被写入,则返回异常。
为了解决这个问题,我想应该对更新操作进行队列化(从而使其串行化),并同时从数据库中读取。这对我来说应该足够了。但是我一无所知,我真的不知道该怎么做,因为我一直在使用Zentus JDBC驱动程序,而它似乎不足以满足我现在尝试做的事情。
这就是我的问题,您认为我应该如何做?哪种包装器是实现这一点的适当选择?
提前致谢!
关于SQLite并发性,在他们的网页上说:
“(…)只要连接没有持有任何fcntl()锁,就可以安全地将连接句柄移动到线程之间。如果没有挂起事务并且所有语句都已完成,则可以安全地假定不持有任何锁。”
还有:
“多个进程可以同时打开相同的数据库。多个进程可以同时执行SELECT。但是在任何时刻只能有一个进程对数据库进行更改。”
当SQLite尝试访问被其他进程锁定的文件时,默认行为是返回SQLITE_BUSY。
希望这可以帮助:)
我正在开发的应用程序可能会从不同的线程生成大量的查询和更新。它们不会是非常繁重或复杂的更新,可能大多数是小型且快速的,但是由于它们依赖于从网络上的客户端获得的信息,因此具有极其不可预测性的并发性。据我所知,SQLite目前能够支持许多并发读取,但每次只能更新一个。当它进行写入时,需要获取排他锁,并在写入时如果其他内容正在被写入,则返回异常。
为了解决这个问题,我想应该对更新操作进行队列化(从而使其串行化),并同时从数据库中读取。这对我来说应该足够了。但是我一无所知,我真的不知道该怎么做,因为我一直在使用Zentus JDBC驱动程序,而它似乎不足以满足我现在尝试做的事情。
这就是我的问题,您认为我应该如何做?哪种包装器是实现这一点的适当选择?
提前致谢!
关于SQLite并发性,在他们的网页上说:
“(…)只要连接没有持有任何fcntl()锁,就可以安全地将连接句柄移动到线程之间。如果没有挂起事务并且所有语句都已完成,则可以安全地假定不持有任何锁。”
还有:
“多个进程可以同时打开相同的数据库。多个进程可以同时执行SELECT。但是在任何时刻只能有一个进程对数据库进行更改。”
当SQLite尝试访问被其他进程锁定的文件时,默认行为是返回SQLITE_BUSY。
希望这可以帮助:)