Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么数据库连接对象或连接池需要单独设置?_Java_Database_Jakarta Ee_Connection_Singleton - Fatal编程技术网

Java 为什么数据库连接对象或连接池需要单独设置?

Java 为什么数据库连接对象或连接池需要单独设置?,java,database,jakarta-ee,connection,singleton,Java,Database,Jakarta Ee,Connection,Singleton,我已经阅读了两篇关于singleton示例的文章。我可以看到,开发人员有时将数据库连接对象或连接管理器作为单例实现。在一些帖子中甚至建议使用数据库连接池。 Singleton意味着创建一个实例,所以基本上我们限制了访问。e、 g.打印机或硬件访问,记录器访问,我们试图限制用户使用singleton一次只能访问一个。但是,在DB连接对象中使用单例的目的是什么? 若我能正确理解,将数据库连接创建为singleton意味着AppServer将只有一个实例。这是否意味着只有一个用户可以访问数据库连接,而

我已经阅读了两篇关于singleton示例的文章。我可以看到,开发人员有时将数据库连接对象或连接管理器作为单例实现。在一些帖子中甚至建议使用数据库连接池。 Singleton意味着创建一个实例,所以基本上我们限制了访问。e、 g.打印机或硬件访问,记录器访问,我们试图限制用户使用singleton一次只能访问一个。但是,在DB连接对象中使用单例的目的是什么? 若我能正确理解,将数据库连接创建为singleton意味着AppServer将只有一个实例。这是否意味着只有一个用户可以访问数据库连接,而下一个用户必须等待连接关闭?
请告知。

我认为您正确理解了将连接本身作为单例的含义。一般来说,这不是一个好主意(尽管在某些非常特殊的情况下,这可能是有意义的)

将连接管理器或连接池设置为单例是完全不同的。池本身将处理一组连接,它可以根据需要创建新的连接(达到一定的限制),或者重新使用已经使用和丢弃的连接

同时拥有多个连接池将失去池的优势:

  • 控制打开的连接总数将更加困难
  • 一个池可能正在创建连接,而另一个池可能有可用的连接
希望这有助于澄清问题。您可能想阅读更多关于连接池的内容。

Q:“但是,在DB连接对象中使用单例的目的是什么?”
答:几乎总是没有。所以你的想法是正确的。

Q:“这是否意味着只有一个用户可以访问数据库连接,而下一个用户必须等待连接关闭?”

答:取决于(第一部分)和否(在“和”之后的第二部分)

在单线程应用程序中,一次只有一个用户将使用数据库,另一个用户将等待,直到第一个用户的分派结束,但不是在连接关闭时。一旦连接关闭,您需要创建另一个连接来使用数据库

在多线程应用程序中,许多线程可能使用相同的连接实例,结果实际上取决于供应商的实现:可能会阻止调度(有效地将应用程序转换为单线程应用程序)或引发异常,甚至是其他情况。然而,在我看来,多线程应用程序中的这种设计是程序员的错误。

值得注意的一点是,连接池成为“逻辑单例”(即每个DB/用户只有一个实例)是很好的,原因正是这里描述的。但是作为一个单例实现通常是一个坏主意(实际上只有一个单例),因为这样很难对诸如单元测试之类的事情进行模拟。感谢您的快速响应。回答得很中肯。非常感谢。还有一个问题-将连接池对象设置为singleton有什么好处?从您的描述来看,如果我们将连接对象设为单例,则一个用户一次可以使用该连接。所以这似乎不是很有益。如果访问应用程序的用户不多,或者用户试图下载大文件等,则可能会使用此选项。但是,我想知道如果我们将ConnectionPool设置为singleton,会有什么好处?答案提到了两个问题,即可能会有多个连接池。让它成为单身汉可以避免这些问题。直截了当的回答。非常感谢。还有一个问题-将连接池对象设置为singleton有什么好处?从您的描述来看,如果我们将连接对象设为单例,则一个用户一次可以使用该连接。所以这似乎不是很有益。如果访问应用程序的用户不多,或者用户试图下载大文件等,则可能会使用此选项。但是,我想知道如果我们将ConnectionPool设置为singleton,会有什么好处?