使用JNDI进行数据库连接

这可能听起来像一个菜鸟问题,但这是我第一次踏入数据库领域。
从这里我得到了信息

在服务器和数据库之间实现通信的最有效方法是设置数据库连接池。 为每个客户端请求创建新连接可能非常耗时,尤其是对于持续接收大量请求的应用程序。

本教程使用JNDI数据源。

我的应用程序也类似(但我不会使用Tomcat,只是套接字),我的服务器将收到来自多个客户端的请求,但我不明白为什么我应该使用JNDI数据源,为什么服务器不能维护一个打开与数据库的连接,当客户端请求到达时,它将处理请求并将数据提供给客户端。

在最坏的情况下,如果我需要一个JNDI,我怎么能用我的服务器应用程序实现它?

那么,它是一个客户端应用程序? 应用程序和数据库通常使用DriverManager#getConnection()获得的连接相互通信? 如果是这样,那么您不一定需要JNDI来使连接池工作。 单独的连接池框架已经足够了。 例如C3P0或Apache Commons DBCP (我建议使用C3P0; DBCP是单线程的)。 只需用它替换DriverManager#getConnection()

编辑:回复您的评论:

服务器将与数据库通信,客户端连接到服务器,因此我不知道是否将其称为客户端应用程序。

我的意思是,一个普通的Java应用程序,它不在Java EE容器中运行。 帕斯卡的措辞更好。

实际上我对连接池如何工作有点困惑,每个连接是否都在自己的线程中运行? 是否有任何文件/书籍可以帮助我更好地理解这些概念与非汇集连接?

首先,只要达到配置的超时,连接池就会打开一个连接并保持打开状态。 连接池使用自己的实现来包装/ 修饰连接。 连接池可以同时打开并保持配置数量的连接。 当你调用getConnection() ,它会立即给你一个已打开的连接。 当您在连接上调用close()时,它会将连接放回池中以供将来请求使用。 这意味着您仍然必须以通常的方式编写JDBC代码:在尽可能的范围内获取并关闭ConnectionStatementResultSet 。 在finally块中关闭它们。 如果您的JDBC代码已经写得很好,实际上需要替换DriverManager#getConnection() 。 由于您应该在同一个方法块中打开和关闭Connection ,它通常会在同一个线程中运行。 连接池将担心同时没有其他线程获取Connection ,直到您的代码在Connection上调用close()

你可以在这里找到一篇很好的文章来了解连接池如何在引擎盖下工作(注意:不要将它用于生产,不要进一步生成它,只是为了得到完整的想法)。 对于实际工作,请使用现有的彻底开发且强大的连接池框架。

我的应用程序也类似(但我不会使用Tomcat,只是套接字),我的服务器将收到来自多个客户端的请求,但我不明白为什么我应该使用JNDI数据源,为什么服务器不能维护一个打开与数据库的连接,当客户端请求到达时,它将处理请求并将数据提供给客户端。

好吧,你可以。 但是,如果您有多个客户端并且必须提供并发请求,该怎么办? 当然,您可以为每个客户端维护一个连接,但这不能很好地扩展(这可能不是您的上下文中的问题)。 仍然,解决此问题的传统方法是使用连接池(并从额外服务中受益,例如连接validation,连接更新)并使用它来“按需”获得连接。

如果您不在J2EE容器上下文中,请使用独立的连接池实现,例如c3p0 (更喜欢c3p0而不是DBCP,它被认为是过时的并且在加载时不太健壮)并且忘记JNDI(这只是获取的标准方法)在J2EE容器内运行时连接池上的句柄。

有关更多详细信息和代码示例,请查看c3p0的文档 ,非常清楚。

用于数据库连接的JNDI解决了应用程序开发人员不是管理与数据库的连接的情况。

因此,应用程序开发人员可以指定其应用程序需要多少个并发连接。 然后,服务器管理员将定义数据库连接池。 该应用程序查找池。

应用程序和应用程序开发人员都不需要知道连接到数据库所需的凭据。 此外,服务器管理员可以根据部署环境将连接池定义为不同的大小,并且应用程序不会知道这些差异。

由于您的应用程序服务器本身,因此应用程序负责定义和管理数据库的连接。

抛出另一个到另一个连接池的链接:BoneCP( http://jolbox.com )。 基准测试表明它比C3P0 / DBCP更快。

PS在我的multithreading测试中没有看到DBCP锁定。