ODBC 通过网络访问 *.mdb
ODBC access over network to *.mdb
我有一个关于带有 *.mdb 的 ODBC 如何工作的一般性问题。
根据我的理解,无论我是否使用odbc,当访问存储在另一台计算机(即NAS)上的MS Access数据库(*.mdb)时,如果我错了请指正,我的电脑首先需要加载完整的 *.mdb 文件,然后才能对其进行任何操作,无论它们多么简单。与 SQL 服务器不同,它只是将结果发送回查询。
如果你能证实这一点,那么我有几个关于通过 odbc 访问 mdb 的多用户环境的相关问题:
- 文件保存回存储(即 NAS)的频率如何?是否有某种 "idle" 超时或类似的?我正在尝试计算出较大文件所产生的网络流量。
- 一个用户多快可以看到另一个用户对同一文件所做的更改?
- 这种文件访问如何在多用户环境中工作而不经常导致数据损坏?
请注意,我确实知道更好、更有效的解决方案,我真的只对这种特定情况的内部运作感兴趣。
谢谢
In my understanding, and please correct me if I'm wrong, no matter if I use odbc or not, when accessing an MS Access database (*.mdb) that is stored on another computer, i.e. a NAS, my computer first needs to load the full *.mdb file before it can do any operations on it, no matter how simple they are.
你错了。打开数据库时,整个 .mdb(或 .accdb)文件将不会 通过网络拉取。如果可以使用索引来识别相关行,即使对特定 table 的操作也不一定会通过网络拉取整个 table。对于使用 Wireshark 执行的实际测量,请参阅我的回答 here。
How often is the file saved back to the store (i.e. the NAS)? Is there some kind of "idle" timeout or similar? I am trying to figure out the network traffic this generates with larger files.
Access 数据库引擎可能会在提交更新之前缓冲几秒钟。这样做可能是为了减少对数据库文件的争用。当更新 提交时,Access 数据库引擎仅通过网络发回修改后的页面;它不会重写整个 table(或文件)。
How quickly can one user see the changes made by another on the same file?
我 运行 不久前进行了一些测试,发现一个用户(连接)所做的更改通常在大约五 (5) 秒后可用于其他连接。详情请看我的回答here。
How can this kind of file access work in a multiuser environment without constantly leading to corrupted data?
每个用户都有自己的 Access 数据库引擎实例来操作共享数据库文件,但各个实例相互合作以管理 record/page 锁定。请注意,当在 "shared mode" 中打开 Access 数据库文件(.accdb 或 .mdb)时,会在同一文件夹中创建一个锁定文件(.laccdb 或 .ldb)。 Access 数据库引擎的各种实例使用此锁定文件来管理多用户访问。
示例:网络流量
我刚刚使用 Wireshark 捕获由使用 ODBC 的 VBScript 生成的网络流量 运行
SELECT COUNT(*) AS n FROM TestData WHERE ID=1
针对驻留在网络共享上的 84.3 MB Access 数据库文件。该文件由一 (1) 个 table 组成,其中包含一百万 (1,000,000) 行,并将长整型 [ID] 字段作为其主键。
产生的总网络流量
- 正在打开与数据库文件的 ODBC 连接,
- 运行正在查询,
- 返回结果,
- 关闭连接
为 110 KB。
你问得好,我答不上来!
但是:
如果您正在与多个用户一起使用和访问前端和数据,MS 推荐:
您将数据库拆分为两个文件。一个有表格,另一个有其他一切(即前端文件)
每个用户都有一个前端文件的副本(这有时是必不可少的,但你可以不这样做就逃脱,但这是不可取的,因为有些代码会把多个用户搞砸!)
所以只有数据被推送,而不是表单和报告定义。
这里有一些有趣的页面here
简而言之:
如果您使用 Microsoft Jet (.mdb) 数据库,使用 DAO 类 比使用 Microsoft Access ODBC 驱动程序更有效。
我有一个关于带有 *.mdb 的 ODBC 如何工作的一般性问题。
根据我的理解,无论我是否使用odbc,当访问存储在另一台计算机(即NAS)上的MS Access数据库(*.mdb)时,如果我错了请指正,我的电脑首先需要加载完整的 *.mdb 文件,然后才能对其进行任何操作,无论它们多么简单。与 SQL 服务器不同,它只是将结果发送回查询。
如果你能证实这一点,那么我有几个关于通过 odbc 访问 mdb 的多用户环境的相关问题:
- 文件保存回存储(即 NAS)的频率如何?是否有某种 "idle" 超时或类似的?我正在尝试计算出较大文件所产生的网络流量。
- 一个用户多快可以看到另一个用户对同一文件所做的更改?
- 这种文件访问如何在多用户环境中工作而不经常导致数据损坏?
请注意,我确实知道更好、更有效的解决方案,我真的只对这种特定情况的内部运作感兴趣。
谢谢
In my understanding, and please correct me if I'm wrong, no matter if I use odbc or not, when accessing an MS Access database (*.mdb) that is stored on another computer, i.e. a NAS, my computer first needs to load the full *.mdb file before it can do any operations on it, no matter how simple they are.
你错了。打开数据库时,整个 .mdb(或 .accdb)文件将不会 通过网络拉取。如果可以使用索引来识别相关行,即使对特定 table 的操作也不一定会通过网络拉取整个 table。对于使用 Wireshark 执行的实际测量,请参阅我的回答 here。
How often is the file saved back to the store (i.e. the NAS)? Is there some kind of "idle" timeout or similar? I am trying to figure out the network traffic this generates with larger files.
Access 数据库引擎可能会在提交更新之前缓冲几秒钟。这样做可能是为了减少对数据库文件的争用。当更新 提交时,Access 数据库引擎仅通过网络发回修改后的页面;它不会重写整个 table(或文件)。
How quickly can one user see the changes made by another on the same file?
我 运行 不久前进行了一些测试,发现一个用户(连接)所做的更改通常在大约五 (5) 秒后可用于其他连接。详情请看我的回答here。
How can this kind of file access work in a multiuser environment without constantly leading to corrupted data?
每个用户都有自己的 Access 数据库引擎实例来操作共享数据库文件,但各个实例相互合作以管理 record/page 锁定。请注意,当在 "shared mode" 中打开 Access 数据库文件(.accdb 或 .mdb)时,会在同一文件夹中创建一个锁定文件(.laccdb 或 .ldb)。 Access 数据库引擎的各种实例使用此锁定文件来管理多用户访问。
示例:网络流量
我刚刚使用 Wireshark 捕获由使用 ODBC 的 VBScript 生成的网络流量 运行
SELECT COUNT(*) AS n FROM TestData WHERE ID=1
针对驻留在网络共享上的 84.3 MB Access 数据库文件。该文件由一 (1) 个 table 组成,其中包含一百万 (1,000,000) 行,并将长整型 [ID] 字段作为其主键。
产生的总网络流量- 正在打开与数据库文件的 ODBC 连接,
- 运行正在查询,
- 返回结果,
- 关闭连接
为 110 KB。
你问得好,我答不上来!
但是:
如果您正在与多个用户一起使用和访问前端和数据,MS 推荐:
您将数据库拆分为两个文件。一个有表格,另一个有其他一切(即前端文件)
每个用户都有一个前端文件的副本(这有时是必不可少的,但你可以不这样做就逃脱,但这是不可取的,因为有些代码会把多个用户搞砸!)
所以只有数据被推送,而不是表单和报告定义。
这里有一些有趣的页面here
简而言之:
如果您使用 Microsoft Jet (.mdb) 数据库,使用 DAO 类 比使用 Microsoft Access ODBC 驱动程序更有效。