我发现 SQL CE 不是线程安全的:
SQL CE 对象不是线程安全的,也不是线程亲和的。如果 SqlCeConnection 或 SqlCeTransaction 的实例在线程间共享而没有确保线程安全,则可能导致访问冲突异常。)
我确实需要共享连接,因为有很多客户端实例,每个实例都同时读取/写入数据库。
另外,为了保持速度,我不想使用锁定,我想我需要使用标准 SQL 服务器,对吗?谢谢
答案1
不管你往上爬多高,没有数据库产品会让你在线程之间同时共享连接和事务。你总是必须序列化对事务/连接的访问。你提出的要求毫无意义。一个线程会提交另一个线程刚刚回滚的内容吗?有许多产品支持成千上万的客户端同时读写数据库。线程之间永远没有“共享”连接。
为了实现高可扩展性,你应该做和其他人一样的事情:
- 使用连接池来分摊登录握手的成本
- 在服务请求期间将连接与请求关联起来
- 使用短期交易
- 优化访问路径以避免读取不必要的数据(消除所有扫描)
- 使用适当的锁定粒度
如果负载是读取密集型的,那么您可以考虑使用版本隔离模型,例如 SQL Server 中的读取已提交快照。如果负载是更新密集型的,那么您必须遵循 OLTP 原则并使用短小的细粒度锁来执行任何更新,同时避免对来自不同事务的相关项目进行操作以降低死锁概率。
答案2
如果 SQL CE 具有您需要的功能,您应该查看 sql express 而不是购买标准版,但是这两种产品都没有像 sql 标准版及以上版本那样针对多用户访问进行优化。
答案3
您说得对,SQL CE 不支持多个连接进入单个数据库。您需要将连接链向上移动到更大的连接链。
SQL Express将是下一步,并且绝对适用于多用户场景。最重要的是,它是免费的。因此,只要限制放在上面不会阻止你完成工作,使用它会给你带来更好的效果。
此外,当需要从 Express 升级到 Standard 时,这实际上是一个就地升级。