使用预处理语句的池JDBC连接应该是短期的还是长期的?

使用预处理语句的池JDBC连接应该是短期的还是长期的?,jdbc,prepared-statement,connection-pooling,c3p0,Jdbc,Prepared Statement,Connection Pooling,C3p0,如果连接不是物理连接,而是来自ConnectionPoolDataSource的抽象,那么最好将连接紧密地包装在SQL操作周围,还是让连接在应用程序中持久化?(我使用c3p0作为记录。) 等价地(我想):如果我为每个应用程序获取一次connection(),c3p0会使它看起来像一个稳定的连接,即使底层的物理连接消失并恢复正常,它也不会消失吗 如果我想让连接变得短暂,我该如何用持久的准备语句来编程呢 那么,这又回到了最初的问题——如果有很多连接,我如何在连接之间共享一个PreparedState

如果连接不是物理连接,而是来自ConnectionPoolDataSource的抽象,那么最好将连接紧密地包装在SQL操作周围,还是让连接在应用程序中持久化?(我使用c3p0作为记录。)

等价地(我想):如果我为每个应用程序获取一次connection(),c3p0会使它看起来像一个稳定的连接,即使底层的物理连接消失并恢复正常,它也不会消失吗

如果我想让连接变得短暂,我该如何用持久的准备语句来编程呢

那么,这又回到了最初的问题——如果有很多连接,我如何在连接之间共享一个PreparedStatement?我认为连接创造了自己的预备语句

如果这是你唯一的问题——老实说,这在你最初的问题中并不清楚——那么你根本不需要担心这个问题。JDBC驱动程序和DB将在适用和必要时缓存它们。那不是你的责任。按照正常的JDBC习惯用法,只需在尽可能短的范围内获取并关闭数据库资源


或者,如果它是一个Java EE web应用程序,请查看JPA以将JDBC样板文件简化为一行程序,并查看EJB以将事务处理完全委托给容器,这样您就不需要处理(自动)提交和回滚。

当您说“每个应用程序一次”时,这是一个单线程应用程序吗?多线程应用程序。目前,所有线程都有一个原始连接,可以正常工作——我引入了一个CPD来处理连接中断时恢复连接的问题。对于桌面还是web?如果是web和JavaEE,只需使用EJB/JPA即可。这样,您就不必担心连接、池、事务等问题。容器将为您完成所有这些。顺便说一下,如果被多个用户使用,所有线程的单个连接都会导致灾难。@djechlin:在线程之间共享连接是一个非常糟糕的主意。如果它对你有用,那是幸运的巧合。JDBC不是线程安全的。@skaffman在实际查询周围使用互斥锁,因此应该可以。