关于JDBC编码的几个问题:
我知道对close()的调用会释放资源。但是如果我们知道我们稍后会使用它,为什么要释放它然后再请求它呢?
多客户端应用程序怎么样?我们需要连接池,所以我们每次都需要创建和关闭Connection,Statement和PreparedStatement吗?
感谢,
答案 0 :(得分:14)
就个人而言,我会使用一个池,因为这将为您处理所有资源管理。如果您的连接要求发生变化,则可以轻松修改池配置。有了池,您可以根据best-practice打开/关闭连接和准备好的语句,并将资源管理留在池中。
通常,使用游泳池时:
此外 - 根据池实现 - 它可能能够在资源泄漏时通知您,从而更容易识别代码中的这些类型的问题。
看看像DBCP这样的示例实现的来源 - 看看它们是如何工作的很有趣。
答案 1 :(得分:2)
1。即使您拥有单个客户端,连接池仍可能是有益的。连接到数据库可能需要很长时间,因此经常这样做可能会使网络请求速度变慢,从而降低应用程序的速度。此外,正如@teabot所解释的那样,池可以帮助识别是否有任何连接未被关闭。
2。打开连接并永久打开它有两个原因,这不是一个好主意。首先,如果存在临时网络中断,则连接可能会中断。它打开的时间越长,在需要时就越有可能死亡。其次,失败的交易可能使连接处于不适合继续操作的状态。最好的方法是打开一些连接,重复使用5到10分钟,然后再回收它们。
3。根据数据库和驱动程序的不同,连接可能具有预准备语句缓存。即使使用不同的连接,RDBMS通常也会缓存包含它的参数完全相同的语句。因此SELECT * FROM表WHERE值=?因为准备好的语句将跨连接缓存,但如果指定参数值,如SELECT * FROM table WHERE value =' your_data'那么可能它不会被缓存在服务器端。
4. 如3中所述,取决于RDBMS的实现,做一个基准测试。
5. 无需关闭并再次准备将使用不同参数重复使用的语句。只需再次设置参数并执行。
对于多个客户端,数据库将始终具有并发连接限制,通常不是任何大数字。如果所有客户端都通过webapp,那么像DBCP这样的池就可以了。但显然,为每个客户创建一个永久打开多个连接的池是不可取的。