2012-07-17 52 views
0

我试图找到各种留言板的解决我的问题多线程。但是,我正在跑进墙壁。我试图在Mysql INNODB表中重新创建我们的数据库“LockWait Timeout”上发生的问题。 (有关我正在尝试解决的问题的信息,请转到:http://bugs.mysql.com/bug.php?id=10641)我缩小了问题范围,并且我有一个解决方案。但是我不能在测试环境中重新创建问题,所以我可以测试我的解决方案。创建一个访问数据库的同时

这里是我的代码:

public static void main(String[] args) {   

    System.out.println("Programm Starting"); 

    int numberOfthreads = 2; 

    for(int x = 1; x <= numberOfthreads; x++){ 
     //Create the object UpdateClass 


     // Create the Runable object 
     Runnable r = new Runnable() { 
      // Start the Runnable 
      public void run() { 
        System.out.println("Running"); 
      } 
     }; 

     Thread thr = new Thread(r); 
     System.out.println("Thread object created"); 

     thr.start(); 
     final UpdateClass session = new UpdateClass(x); 
     System.out.println("Thread object started"); 

     try { 
      System.out.println("Starting UpdateClass.runProcess()"); 
      session.runProcess(); 
      Thread.sleep(1); 
     } 
     catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     thr.stop(); 

     System.out.println("Thread stopped"); 
    } 
} 

基本上,我试图复制同步更新到MySQL创建表的锁等待超时问题。

我班UpdateClass工作,我需要它的方式,但我不能重新创建同时发生的事件来调用类。

问题:如何更改我的代码以增加生成导致超时的条件的概率?

+0

会发生什么,当你增加线程超时或许5000毫秒甚至更高?我假设在你的代码中,你正在使用一个事务(关闭自动提交)来删除/更新表中的信息,但让你的线程长时间地休眠以触发锁定超时。我还假设您共享的论坛帖子具有与您在测试环境中运行的相同的MySQL版本/修补程序。 – 2012-07-17 02:25:15

+0

你还可以分享你的mysql.cnf文件 - 特别是innodb_lock_wait_timeout。您的锁定超时时间应该超过此限制以重现问题。 – 2012-07-17 02:31:37

+0

对您有帮助? – 2012-07-17 20:27:57

回答

0

一些事情你可以尝试复制的问题测试:

  1. 变化innodb_lock_wait_timeout在mysqlcnf一个小的时间间隔或增加线程睡眠时间(如果你改变了CNF文件,则需要重新启动数据库服务器)
  2. 确保您持有到一个锁(并没有公布它)的线程进入睡眠状态(你可能实现与网络断开/ DB连接下去,而锁具有相同的前没有被释放,但不完全确定)。

我假设你的MySQL版本是相同的生产。

+0

更改数据库中的时间间隔并不是我需要做的。默认是足够的。 Iam遇到的问题是同时创建数据库查询。这是一个编程的事情。我想我需要在多个线程同时运行的情况下实现某种类型的递归。我的代码现在工作是一个线程工作完成,然后另一个线程开始....等等...这不是我想要的。我尝试了许多不同的循环配置,但无济于事。 – 2012-07-19 18:22:08

+0

除非我误解 - 您试图在测试中复制产品问题。问题是你在使用MySQL时遇到lock_wait_timeout。如果您需要复制的问题(lock_wait_timeout),您可以重复上述步骤(在你的代码,你似乎是睡你的线程1毫秒,增加其配置MySQL的lock_time以上,确保你不放锁并且不要放弃它) - 你应该能够复制超时。 – 2012-07-19 19:34:48

+0

是否能够复制该问题? – 2012-07-24 01:15:37

相关问题