多线程的JDBC问题

时间:2015-08-14 04:11:37

标签: java multithreading jdbc

我想在不同的线程上运行新的Connections和它的查询执行。我想通过初始化/连接到Connection来启动线程,然后等待查询并在同一个线程中运行它们。我的尝试是启动线程并初始化连接,然后暂停线程,只在我调用execute时才恢复。

private static synchronized boolean isActive()
{
    return active;
}

private static synchronized void makeActive()
{
    active = true;
}

    public void run()
    {  
        try
        {
            if(conn == null) 
            {
                onConnect();
            }

            synchronized(this)
            {
               while(!isActive())
                {
                    System.out.println(isActive());
                    wait();
                }

                System.out.println("exec");
                onExecute();
            }
        }



        catch(InterruptedException | SQLException e)
        {
                System.out.println("exception " + e.getMessage());
        }
}

onConnect创建我的Connection并调用onExecute来执行查询。我在课外调用了一个查询:

    public void execute(PreparedStatement statement, String query) throws SQLException
    {
        activeQuery               =   statement;
        makeActive();
}

目前,当我启动线程时,如果我不使用join(),我的onConnect()将被跳过,当我确实执行onConnect时,while(!isActive())之后的块不执行所以我认为它总是在等待......

在此上下文中是否有更好的方法在JDBC中使用多个线程,或者此代码中是否存在任何明显错误?

1 个答案:

答案 0 :(得分:1)

看起来像经典的等待/通知对:

public void execute(PreparedStatement statement, String query) throws SQLException
{
    synchronized(this){
        activeQuery = statement;
        this.notify();
    }
}

和内部运行方法:

  while( some_finish_cond ) {
      synchronized(this){
         while(activeQuery==null){
             this.wait();
         }
         System.out.println("exec");
         onExecute();
         activeQuery = null;
      }                  
  }