Sqlite连接列表

时间:2011-09-19 11:36:26

标签: java jdbc sqlite

我使用JDBC驱动程序与SQlite连接。我想从SQLite命令提示符检查数据库引擎中打开了多少个连接。谁能告诉我怎么做呢?

2 个答案:

答案 0 :(得分:1)

SQLiteembedded database - 访问数据库文件的每个进程本身都有自己的数据库引擎。单独引擎之间唯一的交互是通过底层操作系统的文件锁定工具,这可以确保在尝试更新DB文件时各种进程不会互相踩踏。

由于这种设计,就SQLite而言,没有单一的控制点。 sqlite3 shell实用程序本质上包含SQLite数据库引擎本身的副本,它是如何处理数据库文件的 - 它不会“连接”到另一个应用程序。实际上,SQLite文档中的术语“连接”只是(错误地)使用,因为它对DB工程师很熟悉 - 实际上它只不过是打开一两个文件。

因此,sqlite3实用程序无法知道其他应用程序正在执行的操作,除非在另一个进程正在修改数据库时偶尔遇到锁定的文件。

如果你想知道你的应用程序在底层数据库中做了什么,你将不得不在基础SQLite3库周围找到/编写一个包装器,它将执行你需要的任何额外的簿记 - 可能提供一个控制接口。基础SQLite库本身没有任何此类工具,因为它们被认为超出了其范围。

包装器方法的问题在于,您的应用程序仍然不知道其他进程正在做什么。您可能能够让所有使用包装器的进程在中央访问点(文件/网络服务/ ...)收集数据,但这就是它 - 任何其他进程(例如sqlite3 shell)都会仍然直接访问DB文件。

但是,如果您只需要知道数据库文件的“连接”数量,则可能存在(绝对不可移植)方式:每个“连接”都会导致数据库文件被打开,因此您可能会能够使用特定于平台的实用程序来找出每个时刻打开文件的进程。例如,在Linux上,您可以使用lsof实用程序。

顺便说一句,如果您从应用程序的单个实例多次打开相同的DB文件,您可能需要重新考虑您的体系结构 - 与传统的数据库服务器相反,打开与单个SQLite数据库文件的多个“连接”没有性能优势,如果你不小心,甚至可能导致应用程序死锁。

答案 1 :(得分:0)

java.sql包中没有API可以执行此操作。您必须在您身边这样做,例如使用Singleton类,以便您创建连接并跟踪此类创建的连接的数量。

PS:当然这只会计算底层运行的JVM实例中的连接数