使用JNDI进行数据库连接

时间:2009-11-24 21:53:48

标签: java database jdbc jndi

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

的信息
  

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

并且教程使用JNDI数据源。

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

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

4 个答案:

答案 0 :(得分:4)

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

修改:回复您的评论:

  

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

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

  

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

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

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

答案 1 :(得分:2)

  

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

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

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

有关详细信息和代码示例,请查看c3p0的documentation,这很清楚。

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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

P.S。在我的多线程测试中没有看到DBCP锁定。