2013-06-20 4 views
-1

Я хочу вставить данные с помощью JDBC. я пишу этот код:Как вставить данные с помощью потока в jdbc?

// Я хочу, чтобы начать темы здесь

 while(stmt_ver.next()){ 
     stmt_ver.setString(i, "test"+...); 
     stmt_ver.executeBatch(); 
     connection_ver.commit(); 
} 

// Я хочу закончить темы здесь

Как я могу сделать это с резьбой?

+0

Что вы пытаетесь сделать? Похож на маленький вздор для меня - без обид. Но я уверен, что этот код не то, что вы хотите. – Fildor

+0

Я хочу вставить данные в JDBC. Но я хочу сделать это нитями ни одной нити –

+0

Это ** работает ** с одной нитью? Держу пари, что нет. – Fildor

ответ

1

Здесь вы идете. Обновленный ответ с кодом

нитка классом

public class MyThreadedClass extends Thread{ 

    //Do what I need here on a thread 
    public void run(){ 
     //Do what I need here 
    } 
} 

Main

//Main class 
public static class MyProgramMain{ 

//Program main 
public static void main(String[] args) { 


       //Send 10 threads 
     for (int i=0; i<10; i++){ 

        //Init class (threaded) 
        MyThreadedClass threadedClass = new MyThreadedClass(); 

        //Execute code in the class run() method 
        threadedClass.start(); 
      } 
    } 
} 
+0

спасибо за ответ. Пойми это: для int i ... 100, но я хочу создать 10 thread.so, как это сделать –

+0

Так как класс IS является потоком, в любое время вы создаете экземпляр класса и вызывая метод .start(), вы создаете новый поток. Помимо этого, вам нужно сделать это 10 раз (возможно, в цикле for и т. Д.) –

+0

Хотите узнать, почему downvote? Это правильно –

1
new Thread(new Runnable(){ 
@Override public void run(){ 
//enter code here 
    } 
}).start(); 

EDIT Вы хотите вставить с большим количеством нитей параллельно ...

Есть много различных возможностей.

Вы должны прочитать: Параллели (параллельные коллекции) и Исполнители.

EDIT 2 Я согласен с Томасом Уригом, что введение потоков может быть более вредным, чем благословение здесь. Почему вы думаете, что это было бы полезно?

+0

если я напишу свой код там, сколько потоков будет существовать –

+0

One. О, я вижу. Вы хотите делать вставки со многими потоками параллельно? – Fildor

+0

да, я хочу сделать вставки со многими потоками –

1

Ваш вопрос трудно ответить. Вы очень расплывчаты. Старайтесь быть ясными. Опубликуйте весь необходимый код. Попытайтесь объяснить, что вы сделали и что вы хотели бы сделать.

Вот вам какой-то намек. Он не будет работать, если вы копируете и мимо него, но я думаю, что это должно быть четко указано, что вы можете попробовать:

int i = 0; 
while(i < columnCount){ 

    // make a new statement 
    Statement stmt_ver = new Statement(); 

    // set your data and make the statement ready 
    stmt_ver.set... 

    // make a new thread that executes your data 
    // and let it run 
    new Thread(){ 

     public void run(){ 

      stmt_ver.addBatch(); 
      stmt_ver.executeBatch(); 
      connection_ver.commit(); 
     } 
    }.start(); 

    i++; 
} 

Это очень простое решение. Он запустит поток на каждой итерации. Поскольку процесс ввода-вывода обычно занимает некоторое время, это может улучшить время выполнения вашего кода. Но имейте в виду - нарезание резьбы непросто. Это очень простое, наивное решение. Это может вызвать больше проблем, чем решает. Если вы не знакомы с потоками (и, похоже, вы этого не сделали), не делайте этого!

+0

И я уверен, что итерация не будет делать то, что хочет OP. Увеличивая i на 1, он установит String в значение, указанное в последней итерации. Плюс индексы в заявлении будут увеличены ??? Если это работает, когда он выполняет его, то фактический код должен выглядеть совсем по-другому ... – Fildor

+0

да, я согласен. Все stmt_ver.set ... выглядят очень странно. Но так как он не публикует больше кода, и поскольку он говорит, что он работает в одном потоке, я не могу сделать ничего, кроме как просто переписать свой собственный код. –

+0

спасибо за ответ. Например, я хочу сделать 10 потоков. Как я могу сделать это, как ваш код? –

0
public class MockCommonDao { 

    ArrayList<ArrayList> listOlists = new ArrayList<ArrayList>(); 

    public List CommonInsert(List<Object> example) 
     { 
     List<Future<Object>> listOlists = null; 
     ExecutorService executor = Executors.newFixedThreadPool(example.size()); 
     List<TransactionImpl> callingList = new ArrayList<MockCommonDao.TransactionImpl>(); 
     for (int i = 0; i < example.size(); i++) { 
      TransactionImpl localImpl = new TransactionImpl(example.get(i)); 
      callingList.add(localImpl); 
     } 
     try { 

      listOlists = executor.invokeAll(callingList); 

     } catch (InterruptedException e) { 

     } 
     return listOlists; 





     } 
private class TransactionImpl implements Callable<Object>{ 
      private Object example; 


      TransactionImpl(Object Criteria) { 
       this.example = Criteria; 

      } 


      @Override 
      public Object call() throws Exception { 

      private class TransactionImpl implements Callable<Object>{ 
      private Object example; 


      TransactionImpl(Object Criteria) { 
       this.example = Criteria; 

      } 


      @Override 
      public Object call() throws Exception { 

      while(stmt_ver.next()){ 
     stmt_ver.setString(i, "test"+...); 
     stmt_ver.executeBatch(); 
     connection_ver.commit(); 
} 
     } 
     }} 
     } 

Этот код будет делать simualtaneous вставки в зависимости от стоимости ваших нитей вы хотите создать для insert.example.size() определяет количество операций вставки, которые вы хотите выполнить. Надеюсь, вы имеете в виду это.

Смежные вопросы