在多线程应用程序中使用多个语句对象

时间:2011-07-08 11:17:19

标签: java mysql multithreading jdbc

开发一个多线程应用程序,其中需要不同的线程来同时更新数据库。因此,我在创建它时向每个线程传递了一个新的语句对象(以避免锁定,如果我发送一个对象)。我的怀疑是:

  1. 是否可以从单个jdbc连接获取的语句对象数量有限制?如果我创建了太多语句对象,数据库连接会失败吗?

  2. 如果我在线程终止之前正确关闭了语句,那么一次可以生成的线程数是多少(在具有512Mb RAM的系统上)?

  3. 无论我使用多少语句对象并行更新数据库,驱动程序是否会在保持数据一致的同时更新数据库?我使用mysql。

3 个答案:

答案 0 :(得分:2)

  1. 实际上,您可以创建的语句对象数量应该足以满足您的需求。那么,你的案子中有多少“太多”了?
  2. 可以创建的线程数取决于 lot 因素。要意识到你创建的这些线程将是“操作系统级别”线程而不是真正的线程(假设你有一个双核系统,如果有超线程可用则会产生2个硬件线程或4个) 。分析您在此处确定在系统减速到爬行之前可以创建多少个线程的重要性。
  3. 这取决于数据库使用的锁定机制。你的目标是什么;高完整性还是高性能?阅读this
  4. IMO,你最好从每个线程中的连接池中查找Connection对象,而不是试图传递“statement”对象。

答案 1 :(得分:2)

虽然我不是java程序员,但在多个线程之间共享一个连接是一个坏主意。当2个线程试图在同一个套接字上写入时会发生什么? - 所以 - 每个线程必须有自己的数据库连接

是的,如果许多线程同时写入数据,数据应该在数据库中保持一致 - 无论如何,您必须注意正确管理事务的代码 - 当然,使用InnoDB作为存储引擎MySQL因为MyISAM不允许交易

答案 2 :(得分:1)

  1. 这可能取决于jdbc实现,但总的来说,几乎所有内容都有限制。
  2. 谁知道。实际上,可能有数千人。但是,许多人可能不会提高你的表现。
  3. 是的,你应该能够在多个线程之间共享1个连接,但是,在这种情况下,许多jdbc实现表现不佳。最好每个线程有一个连接(对于一些合理数量的连接/线程)。