Connection可以同时执行多项操作吗?

时间:2014-10-15 01:23:13

标签: java mysql jdbc

我一直在阅读JDBC,我有一个问题;

  1. 为什么最好有多个连接(连接池)而不是只有1个连接?

  2. 连接一次只能做一件事吗?

  3. 如果是这样,如果您要求连接在已经执行其他操作时执行某项操作会发生什么?

1 个答案:

答案 0 :(得分:0)

  1. 连接池不适用于单个进程/应用程序以利用多个连接。根据维基百科:

      

    连接池是维护的数据库连接的缓存,以便在将来需要对数据库的请求时可以重用连接。

    当有大量进程/应用程序在运行时,将使用连接池。如果每个进程/应用程序要在每个请求周期的开始创建一个新的数据库连接(并在每个请求周期结束时关闭它),那么开销就会很大。

    相反,您可以维护固定数量的打开连接(可能在服务器启动时),并在进程/应用程序需要查询数据库时重用它们。打开和关闭连接的开销将不再存在。

  2. 连接可能是shared by multiple threads,但最终将在给定时间仅提供一个请求。开发人员encouraged to use synchronization并确保不会出现race conditions

  3. 如果您这样做,可能会发生大量不良后果。有pitfalls of sharing a connection among multiple threads

      
        
    • 提交或回滚事务会关闭所有打开的ResultSet个对象,并且当前正在执行Statements,除非您使用的是持有游标。

           

      如果一个线程提交,它将使用相同的连接关闭所有其他线程的StatementsResultSets

    •   
    • 执行Statement会自动关闭之前执行该ResultSet所产生的任何现有开放Statement

           

      如果线程共享Statements,则一个线程可以关闭另一个线程ResultSet

    •   

    same page列出了一些避免不良行为的做法:

      
        
    • 避免在帖子中共享Statements(以及他们的ResultSets)。
    •   
    • 每次线程执行Statement时,它应该在放弃Connection之前处理结果。
    •   
    • 每次线程访问Connection时,都应该一致地提交或不提交,具体取决于应用程序协议。
    •   
    • 让一个线程成为应该处理更高级别任务的“管理”数据库Connection线程,例如建立Connection,提交,回滚,更改Connection属性等as auto-commit,关闭Connection,关闭数据库(在嵌入式环境中),等等。
    •   
    • 关闭不再需要的ResultSetsStatements以释放资源。
    •