有一个用例,其中需要维护对数据库开放的连接,以便定期执行查询。
建议在执行查询后关闭连接,然后在句点间隔(10分钟)后重新打开它。我猜不会,因为打开与数据库的连接很昂贵。
连接汇集了替代方案并继续使用连接吗?
答案 0 :(得分:6)
您应该使用连接池。编写应用程序代码以从池请求连接,使用连接,然后将连接返回池。这样可以保持代码清洁。然后,您依赖池实现来确定管理连接的最有效方法(例如,保持它们打开与关闭它们)。
通常,打开连接“昂贵”,通常是由于设置TCP / IP连接,身份验证等的开销。但是,保持连接打开“太长”也很昂贵,因为数据库(可能)已预留了连接使用的资源(如内存)。因此,保持连接打开可以占用这些资源。
您不希望污染管理这些类型的效率权衡的应用程序代码,因此请使用连接池。
答案 1 :(得分:1)
是的,连接池是另一种选择。每次打开连接(就代码而言)并尽快关闭它。连接池将以适当有效的方式处理物理连接(包括所需的任何Keepalive,偶尔的“活跃”测试等)。
我不知道当前的技术水平是什么,但我非常成功地使用c3p0来完成我上一个涉及JDBC的Java项目(很久以前)。
答案 2 :(得分:1)
这里的答案实际上取决于应用程序。如果同一个应用程序中同一个数据库同时使用其他连接,那么池肯定是您的答案。
如果您的所有应用程序都在查询数据库,请等待10分钟,然后再次查询,然后只需连接并重新连接即可。连接被认为是一项昂贵的操作,但所有事情都是相对的。如果你每10分钟只做一次就不贵了。如果应用程序如此简单,请不要引入不必要的复杂性。
注意: 好的,复杂性也是相对的,所以如果已经使用像Spring这样的东西并且已经知道如何使用它的池化机制,那么就应用它来解决这个问题。如果不是这样,请保持简单。
答案 3 :(得分:0)
连接池将是您的选择。然后,您可以保留代码,包括打开和关闭连接。连接池将关心连接。如果关闭池的连接,它将不会关闭,而是再次在池中可用。如果在关闭之后打开连接,如果池中有打开的连接,则池将返回此连接。因此,在应用程序服务器中,您可以使用内置连接池。对于简单的Java应用程序,大多数JDBC驱动程序还包括池驱动程序。
答案 4 :(得分:0)
在打开和关闭连接时有很多很多权衡,保持它们是开放的,确保当你再次开始使用它们时,“保持活动”的连接仍然是“有效的”,使得被破坏的连接无效等等这些复杂的权衡使得为特定情况实施“最佳”连接管理策略变得困难(但肯定不是不可能)。 “最安全”的方法是打开连接,使用它,然后关闭它。但是,正如您已经意识到的那样,这根本不是最有效的方法。如果你管理自己的连接,那么当你做一些事情来提高你的策略效率时,复杂性会很快上升(特别是在存在任何不太完美的JDBC驱动程序的情况下,其中有很多。)
有许多可用的连接池库可以以极其可配置的方式为您处理所有这些(它们几乎总是为最典型的情况预先配置开箱即用,直到您在你正在进行高负荷活动的时候,你可能不必担心所有这些可配置性 - 但如果你扩大规模,你会很乐意拥有它!)总是如此,图书馆他们自己的质量可能不同。
我已成功使用C3P0和Apache DBCP。如果我今天再次选择,我可能会选择DBCP。