Java 使用JNDI进行数据库连接

Java 使用JNDI进行数据库连接,java,database,jdbc,jndi,Java,Database,Jdbc,Jndi,这听起来像是一个noob问题,但这是我第一次涉足数据库领域。 从我得到的信息 最有效的实施方法 服务器和服务器之间的通信 数据库就是建立一个数据库 连接池。创建新的 可以为每个客户机请求创建连接 非常耗时,尤其是对于 连续接收的应用程序 大量的请求 本教程使用JNDI数据源 我的应用程序也很类似(但我不会使用Tomcat,只使用套接字),我的服务器会收到来自多个客户端的请求,但我不明白为什么要使用JNDI数据源,为什么服务器不能与数据库保持一个打开的连接,当客户端请求到达时,它将处理该请求并将数

这听起来像是一个noob问题,但这是我第一次涉足数据库领域。
从我得到的信息

最有效的实施方法 服务器和服务器之间的通信 数据库就是建立一个数据库 连接池。创建新的 可以为每个客户机请求创建连接 非常耗时,尤其是对于 连续接收的应用程序 大量的请求

本教程使用JNDI数据源

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


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

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

编辑:回复您的评论:


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

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


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

首先,连接池打开一个连接,并将其保持打开状态,直到配置的超时为止。连接池使用自己的实现包装/恢复连接。连接池可以同时打开和保持配置数量的连接。当您调用
getConnection()
时,它将立即为您提供一个已打开的连接。在连接上调用
close()
时,它会将连接放回池中,以备将来的请求。因此,这意味着您仍然必须以通常的方式编写JDBC代码:获取并关闭
连接
语句
结果集
,在最短的范围内。在
finally
块中将它们全部关闭。如果您的JDBC代码已经编写得很好,实际上只需要更换
DriverManager#getConnection()
。由于您应该在同一个方法块中打开和关闭
连接
,因此它通常会在同一个线程中运行。连接池将担心
连接
不会同时被其他线程获取,直到您的代码调用
连接上的
关闭()

您可以找到一篇很好的文章来了解连接池在幕后是如何工作的(注意:不要将其用于生产,也不要将其进一步家庭化,这只是为了了解整个想法)。对于实际工作,请使用现有的全面开发和健壮的连接池框架

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

嗯,你可以。但是,如果您有多个客户机,并且必须为并发请求提供服务,该怎么办?当然,您可以为每个客户机保持一个打开的连接,但这并不能很好地扩展(在您的上下文中这可能不是问题)。不过,解决这一问题的传统方法是使用连接池(并从额外服务中获益,例如连接验证、连接续订),然后使用它“按需”获得连接

如果您不在J2EE容器上下文中,请使用独立的连接池实现,例如(宁愿使用c3p0而不是DBCP,后者被认为是过时的,在负载下不那么健壮)和忘记JNDI(这只是在J2EE容器中运行时获取连接池句柄的标准方法)


查看c3p0以了解更多详细信息和代码示例,这一点非常清楚。

JNDI for database connections解决了应用程序开发人员不负责管理数据库连接的情况

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

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


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

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


另外,在我的多线程测试中也没有看到DBCP被锁定。

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