似乎使用JDBC处理事务的经典方法是将auto-commit设置为false。这将创建一个新事务,并且每次提交的调用都将标记下一个事务的开始。
在多线程应用程序上,我了解为每个线程打开一个新的连接是一种常见的做法。
我正在编写一个基于RMI的多客户端服务器应用程序,因此基本上我的服务器为每个新连接无缝地产生了一个线程。
为了正确处理事务,我应该为每个线程创建一个新的连接吗?
这样的架构的成本不高吗?
最佳答案
是的,通常您需要为每个线程创建一个新的连接。您无法控制操作系统如何对线程的执行进行时间片划分(尽管定义了自己的关键部分),因此您可能会无意中有多个线程试图沿着该管道发送数据。
注意,这同样适用于任何网络通信。例如,如果您有两个线程试图通过HTTP连接共享一个套接字。
如果将所有事务包装在关键部分中,并因此在整个开始/提交周期中锁定所有其他线程,那么您也许能够在线程之间共享数据库连接。但是,除非您确实具有JDBC协议(protocol)的先天知识,否则即使那样我也不会这样做。
如果大多数线程很少需要数据库连接(或根本不需要),则可以指定一个线程来完成数据库工作,并让其他线程将他们的请求排队到该线程。这将减少许多连接的开销。但是,您必须弄清楚如何管理环境中每个线程的连接(或在StackOverflow上询问有关此问题的另一个特定问题)。
更新:为了在评论中回答您的问题,大多数数据库品牌不支持单个连接上的多个并发事务(InterBase/Firebird是我所知道的唯一异常(exception))。
最好有一个单独的事务对象,并且每个连接能够启动和提交多个事务。但是供应商根本不支持它。
同样,标准的独立于供应商的API(如JDBC和ODBC)做出相同的假设,即事务状态只是连接对象的属性。
关于multithreading - JDBC:我可以在多线程应用程序中共享连接并享受良好的交易吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/289029/