【问题标题】:Using multiple statement objects in a multi-threaded application在多线程应用程序中使用多个语句对象
【发布时间】:2011-07-08 11:17:19
【问题描述】:

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

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

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

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

【问题讨论】:

  • 谨慎的做法是不要与多个线程共享单个连接。这似乎是在自找麻烦,例如事务边界。可以使用具有多个连接的连接池吗?
  • 我可能会调查一下。你会推荐哪一个? dbcp /bonecp/c3po ?

标签: java mysql multithreading jdbc


【解决方案1】:
  1. 实际上,您能够创建的语句对象的数量应该足以满足您的需要。再说一次,在您的情况下“太多”是多少?
  2. 可以创建的线程数取决于很多 因素。请意识到您创建的这些线程将是“操作系统级别”线程而不是真正的线程(假设您有一个双核系统,如果超线程可用,这将使其成为 2 个硬件线程或 4 个) .在此,分析您将非常重要,以确定在您的系统慢下来之前可以创建多少线程。
  3. 这取决于数据库使用的锁定机制。你的目标是什么;高完整性还是高性能?阅读this

IMO,您最好从每个线程中的连接池中查找 Connection 对象,而不是尝试传递“语句”对象。

【讨论】:

  • 1.大约 100~200 ? 2. 在典型的双核服务器上,多少线程是正确的?线程是轻量级的,可以做一些事情,比如更新表并将一些数据传递给服务器。 3. 我试图在高性能和最大完整性之间找到最佳平衡点。任何帮助表示赞赏:)
  • 我需要更多的上下文来给出具体的答案。这是一个什么样的应用程序?它是访问数据库的服务器应用程序还是客户端 UI?此外,为给定系统找到最佳位置需要进行一些试验和研究。我敢肯定这里没有人能给出答案。
  • 它是一个服务器应用程序,做一些数据库更新。就像更新数据库中的一行,处理它并再次更新该行。
【解决方案2】:

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

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

【讨论】:

  • +1。不要在线程之间共享连接。另见:stackoverflow.com/questions/1182163/multithreaded-jdbc
  • 实际上,连接应该是线程安全的。不知道你从哪里得到这个想法。
  • JDBC 和多线程 "Oracle JDBC 驱动程序为使用 Java 多线程的应用程序提供全面支持并对其进行了高度优化。对连接的受控串行访问,例如连接缓存提供的连接,既是必要和鼓励。但是,Oracle 强烈反对在多个线程之间共享数据库连接。避免允许多个线程同时访问一个连接。如果多个线程必须共享一个连接,请使用规范的开始使用/结束使用协议。”跨度>
  • @Tudor - 正是我的观点。分享会很好,它可能不是最有效的。您的回答听起来好像无法正常工作。
  • 好吧 - 我猜(正常工作)取决于线程访问策略的实现
【解决方案3】:
  1. 这可能取决于 jdbc 实现,但总的来说,几乎所有东西都有限制。
  2. 谁知道呢。在实践中,可能有数千个。但是,这么多可能不会提高您的表现。
  3. 是的,您应该能够跨多个线程共享 1 个连接,但是,许多 jdbc 实现在这种情况下表现不佳。最好每个线程都有一个连接(对于一些合理数量的连接/线程)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多