在 Java 中,数据库连接始终使用 JDBC 驱动程序。据我所知,没有任何数据库允许同时在单个连接上运行多个 SQL 命令,因此如果您的应用程序可以同时运行多个 SQL 命令(即Web 服务器的常见情况,数百名用户可以同时与数据库交互)。
更新:我的意思是:您可以通过单个连接轻松地菊花链命令(如UPDATE ... ; COMMIT),但您不能同时发送两个UPDATE 命令时间——您总是必须等待第一个命令完成才能发送下一个命令。一些数据库允许在单个查询中发送多个命令,但它们一个接一个执行,而不是同时执行。想一想:如果您可以通过单个连接同时运行多个命令,您如何知道它们的执行顺序?
最重要的是,对于大多数数据库来说,创建数据库连接的成本很高。因此,它们是在应用程序启动期间提前创建并保存在池中的。一旦您使用池化 JDBC 驱动程序“连接”到数据库,它就会从池中选择一个未使用的连接并将其返回。这(几乎)不需要时间。当您“关闭”连接时,它会返回到池中。
另一个好处是,池可以使连接保持活动状态。因此,当您需要新连接时(当然,只要数据库正在运行),您就无需担心连接错误。
从应用程序方面来看,这要么是透明的(现在大多数 JDBC 驱动程序要么在内部进行池化,要么具有池化 API)。如果您的 JDBC 驱动程序没有,您始终可以使用 DBCP 之类的池。池处理所有令人讨厌的细节,您可以针对池 API 编写应用程序,而不是直接使用 JDBC。文档会告诉你怎么做。
Hibernate 如何与众不同。 Hibernate 是 JDBC 之上的一个层,可以将 POJO 转换为 SQL 并返回。
所以不要说INSERT INTO data(ID, VALUE) values (?, ?),你可以说
class Pojo { long id; String value; }
Pojo demo = new Pojo();
demo.value = "Test";
session.persist(demo);
Hibernate 将为您创建 SQL 并将其发送到数据库。在这个阶段,它不会让你的生活更轻松。当您更换 Pojo 时,Hibernate 开始发光:
class Pojo { long id; String value;
String name; // Oops ... forget the name
}
Pojo demo = new Pojo();
demo.name = "John";
demo.value = "Test";
session.persist(demo);
Hibernate 将相应地更改 DB 定义并更新加载和保存对象所需的所有 SQL 命令。