我一直在阅读JDBC
,我有一个问题;
为什么最好有多个连接(连接池)而不是只有1个连接?
连接一次只能做一件事吗?
如果是这样,如果您要求连接在已经执行其他操作时执行某项操作会发生什么?
答案 0 :(得分:0)
连接池不适用于单个进程/应用程序以利用多个连接。根据维基百科:
连接池是维护的数据库连接的缓存,以便在将来需要对数据库的请求时可以重用连接。
当有大量进程/应用程序在运行时,将使用连接池。如果每个进程/应用程序要在每个请求周期的开始创建一个新的数据库连接(并在每个请求周期结束时关闭它),那么开销就会很大。
相反,您可以维护固定数量的打开连接(可能在服务器启动时),并在进程/应用程序需要查询数据库时重用它们。打开和关闭连接的开销将不再存在。
连接可能是shared by multiple threads,但最终将在给定时间仅提供一个请求。开发人员encouraged to use synchronization并确保不会出现race conditions。
如果您这样做,可能会发生大量不良后果。有pitfalls of sharing a connection among multiple threads。
提交或回滚事务会关闭所有打开的
ResultSet
个对象,并且当前正在执行Statements
,除非您使用的是持有游标。如果一个线程提交,它将使用相同的连接关闭所有其他线程的
Statements
和ResultSets
。执行
Statement
会自动关闭之前执行该ResultSet
所产生的任何现有开放Statement
。如果线程共享
Statements
,则一个线程可以关闭另一个线程ResultSet
。
same page列出了一些避免不良行为的做法:
- 避免在帖子中共享
Statements
(以及他们的ResultSets
)。- 每次线程执行
Statement
时,它应该在放弃Connection
之前处理结果。- 每次线程访问
Connection
时,都应该一致地提交或不提交,具体取决于应用程序协议。- 让一个线程成为应该处理更高级别任务的“管理”数据库
Connection
线程,例如建立Connection
,提交,回滚,更改Connection
属性等as auto-commit,关闭Connection
,关闭数据库(在嵌入式环境中),等等。- 关闭不再需要的
ResultSets
和Statements
以释放资源。