2016-02-04 5 views
0

Я использовал метод reader() и reader2(), используя два разных потока и используя основной поток.Доступ к базам данных с использованием разных потоков - java

После проверки времени для двух случаев я понял, что существенных различий не было.

Мое сомнение: доступ к основам оракула через данные JDBC, возможно только сделать запрос за раз?

спасибо.

public class ReadingTime { 

public static void main(String[] args) throws InterruptedException { 

    //reader("pessoas"); 
    //reader("pessoas_dw"); 

    Thread t1 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      reader("pessoas"); 
     } 
    }); 

    Thread t2 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      reader2("PESSOAS_DW"); 
     } 
    }); 

    t1.start(); 
    t2.start(); 

    t1.join(); 
    t2.join(); 

} 

public static void reader(String s){ 
    long tempoInicial = System.currentTimeMillis(); 
    MyConnection conn = new MyConnection("oracle", "localhost", "1521", "orcl", "username1", "password1"); 
    conn.openConnection(); 
    Statement st = conn.createStatement(); 
    ResultSet tabela1 = conn.executeQuery(st, "select * from "+s); 
    int i = 1; 
    try { 
     while(tabela1.next()){ 
      i++; 
     } 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("Thread 1"); 
    System.out.println(i); 
    long tempoFinal = System.currentTimeMillis(); 
    System.out.println(tempoFinal - tempoInicial); 
    System.out.println("____________________________"); 

} 

public static void reader2(String s){ 
    long tempoInicial = System.currentTimeMillis(); 
    MyConnection conn = new MyConnection("oracle", "localhost", "1521", "orcl", "username2", "password2"); 
    conn.openConnection(); 
    Statement st = conn.createStatement(); 
    ResultSet tabela1 = conn.executeQuery(st, "select * from "+s); 
    int i = 1; 
    try { 
     while(tabela1.next()){ 
      i++; 
     } 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("Thread 2"); 
    System.out.println(i); 
    long tempoFinal = System.currentTimeMillis(); 
    System.out.println(tempoFinal - tempoInicial); 
    System.out.println("__________________________"); 

} 
+0

Как долго длится запрос? Если это происходит довольно медленно, то одновременное выполнение двух запросов параллельно (при условии, что сама база данных подходит) может быть быстрее. Если это очень быстро, вы не заметите разницы. – Thilo

+0

Oracle может иметь столько одновременных обращений к базе данных, сколько есть связей. Oracle имеет многопоточные механизмы, которые позволяют вам определять политики параллелизма для таких сред. Кроме того, СУРБД имеет механизмы для «выхода на пенсию» отказов жизнедеятельности в случае возникновения взаимоблокировок. Таким образом, нет ... Oracle и многие другие СУБД с многопоточным доступом допускают более одного запроса за раз. – scottb

+0

В соответствии с принципом «I» в ACID вы можете запускать столько одновременных запросов, сколько база данных поддерживает (зависит от вашей БД), и результат должен быть последовательным в конце. – Kon

ответ

0

Я собираюсь угадать здесь. Вы не закрываете набор результатов, ни инструкцию, ни соединение (в частности, не закрывая соединение).

Мое предположение, что MyConnection (которое мы не можем видеть) может повторно использовать предыдущее соединение, когда оно находится на одном и том же (основном) потоке.

Итак, если время установления соединения намного больше, чем итерация результатов, это имеет смысл.

Попытайтесь закрыть rs, st и conn, чтобы узнать, не имеет значения.

+0

нормально Я попробую –

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