【问题标题】:Database connection pool and database connection?数据库连接池和数据库连接?
【发布时间】:2011-03-01 08:10:37
【问题描述】:

我已经创建了一个桌面应用程序,并通过数据库连接(bean/类)将它连接到 MySQL 数据库,并且可以进行 CRUD。我在 NetBeans 网站上看到他们在 Web 应用程序上创建了一个连接池。

连接池是否与桌面应用程序上的类/bean 相同?

这是否意味着我创建了一个 bean/类,例如与 DB 模型(MVC)连接的桌面应用程序,还是我必须做其他事情?

在 Glassfish 服务器上,您可以使用向导创建连接池;在 Apache 上你没有。我是否必须为 Apache 创建数据库连接 bean?

将数据库连接到 Web 应用程序的做法是什么(bean 或其他?)?

我也读过 Hibernate,但我不明白它的用法。 hibernate 在哪里可以提供帮助?我的意思是,它是 ORM,但是 Hibernate 可以为我做什么,以便我的代码更简单?我想我错过了 ORM 的重点

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    Hibernate 将帮助您进行事务管理。它将使您能够打开与数据库的多个不同连接,并在您使用不可用对象(例如从不同线程中拉入的 bean)时向您发出警告。

    当您查询数据库时,Hibernate 的 ORM 将使您的代码更容易的一个具体示例是。您可以使用Criteria-queries,而不是将标准 SQL 查询编写为字符串。

    【讨论】:

      【解决方案2】:

      在 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 命令。

      【讨论】:

      • 连接池是否与桌面连接上的类/bean 相同?这是否意味着他们创建了一个 bean/类,例如连接到模型中的数据库 (MVC) 的桌面应用程序,还是他们有其他东西?在 Glassfish 服务器上,您可以使用向导创建连接池;在 Apache 上你没有。我是否必须为 Apache 创建数据库连接 bean?将数据库连接到 Web 应用程序的做法是什么(bean 或其他?)?
      • Apache 是一整套包含多个 Web 服务器的项目,所以我不确定您所说的“Apache”是什么意思。还有什么是“桌面连接”?正如我所说,要么您的 JDBC 驱动程序进行池化;在这种情况下,您需要选择正确的驱动程序类。或者您需要一个完全不同的池化框架。涉及到 bean,但我不明白你在说哪个 bean。
      • 这很难解释。当我创建桌面 api 时,如果我想连接数据库,我会创建一个带有“usr pss 驱动程序等”的类,好吗?如果我想创建一个 web api,我会这样做吗?一个带有“usr,pss,driver”的类,或者我可以用另一种方式来做吗。例如,没有一个类。
      • @giorgo:是的,基本原理是一样的。由于几乎所有的 Web 应用程序都需要一个 DB,所有的 Web 服务器(Tomcat、JBoss AS 等)都有内置的连接池,它们会为你做所有的脏活(所以你只需要请求一个连接,容器就会创建并为您关闭它)。不过,您没有必须 使用它。您仍然可以创建自己的连接并自行管理它们。
      • """因为几乎所有的 Web 应用程序都需要一个 DB,所以所有的 Web 服务器(Tomcat、JBoss AS 等)都有内置的连接池,它们会为您完成所有繁琐的工作(所以您只需需要请求连接,容器将为您创建并关闭它)。“”“”“是的,谢谢你,这就是我所要求的,1 现在想清楚了。我怎么能要求连接?以 Apache 为例。
      猜你喜欢
      • 1970-01-01
      • 2014-04-09
      • 2010-10-23
      • 2014-01-05
      • 1970-01-01
      • 2015-08-09
      • 2012-08-03
      • 2013-01-09
      • 2010-12-14
      相关资源
      最近更新 更多