Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 jdbc vs CLOB: замедление  [new]
неугомонный оптимизатор
Member

Откуда: Moscow
Сообщений: 79
есть простейший скрипт на java для выгрузки CLOB из Oracle 11
+
import java.sql.*;
import oracle.jdbc.*;

public class jclob {

  public static void main(String[] args) throws ClassNotFoundException, SQLException
  {

    Class.forName("oracle.jdbc.driver.OracleDriver");
    
    OracleConnection conn = (OracleConnection)DriverManager.getConnection("jdbc:oracle:thin:@//servername:1521/xe","username","password");

    conn.setDefaultRowPrefetch(100);    

    OracleStatement stmt = (OracleStatement)conn.createStatement();

    stmt.setLobPrefetchSize(32000) ;

    ResultSet rset = stmt.executeQuery("select clob_column from clob_view");
    
    long start=System.currentTimeMillis();

    for(long i=0;rset.next();i++)
    {         
      System.out.println (rset.getString(1));         
      if (i % 1000 == 0) System.err.println("from "+(i-1000)+" to "+i+":"+(System.currentTimeMillis()-start)+" ms");
      start=System.currentTimeMillis();
    }
  }
}

при выгрузке наблюдаю явное _замедление_ процесса со временем:
+
from -1000 to 0:0 ms
from 0 to 1000:32 ms
from 1000 to 2000:37 ms
from 2000 to 3000:52 ms
from 3000 to 4000:68 ms
from 4000 to 5000:84 ms
from 5000 to 6000:100 ms
from 6000 to 7000:109 ms
from 7000 to 8000:132 ms
from 8000 to 9000:139 ms
from 9000 to 10000:164 ms
from 10000 to 11000:159 ms
from 11000 to 12000:194 ms
from 12000 to 13000:194 ms
from 13000 to 14000:206 ms
from 14000 to 15000:233 ms
from 15000 to 16000:229 ms
from 16000 to 17000:244 ms
from 17000 to 18000:263 ms
from 18000 to 19000:272 ms
from 19000 to 20000:290 ms
from 20000 to 21000:290 ms
from 21000 to 22000:302 ms
from 22000 to 23000:318 ms
from 23000 to 24000:324 ms
from 24000 to 25000:329 ms
from 25000 to 26000:353 ms
from 26000 to 27000:347 ms
from 27000 to 28000:408 ms
from 28000 to 29000:429 ms
from 29000 to 30000:426 ms
from 30000 to 31000:437 ms
from 31000 to 32000:431 ms
from 32000 to 33000:421 ms
from 33000 to 34000:455 ms
from 34000 to 35000:468 ms
from 35000 to 36000:473 ms
from 36000 to 37000:481 ms
from 37000 to 38000:495 ms
from 38000 to 39000:465 ms
from 39000 to 40000:482 ms
from 40000 to 41000:482 ms
from 41000 to 42000:506 ms

WTF?
17 дек 12, 19:08    [13645350]     Ответить | Цитировать Сообщить модератору
 Re: jdbc vs CLOB: замедление  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51796

неугомонный оптимизатор
WTF?

Какой-то чудак использовал для экспорта кэширующий датасет, жаба жрёт память.

Posted via ActualForum NNTP Server 1.5

17 дек 12, 19:17    [13645385]     Ответить | Цитировать Сообщить модератору
 Re: jdbc vs CLOB: замедление  [new]
неугомонный оптимизатор
Member

Откуда: Moscow
Сообщений: 79
Dimitry Sibiryakov
Какой-то чудак использовал для экспорта кэширующий датасет, жаба жрёт память.
ResultSet? кэширующий?
17 дек 12, 19:23    [13645405]     Ответить | Цитировать Сообщить модератору
 Re: jdbc vs CLOB: замедление  [new]
неугомонный оптимизатор
Member

Откуда: Moscow
Сообщений: 79
Dimitry Sibiryakov,

переписал на некеширующий
OracleStatement stmt = (OracleStatement)conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
эффекта нет
17 дек 12, 19:45    [13645514]     Ответить | Цитировать Сообщить модератору
 Re: jdbc vs CLOB: замедление  [new]
мимоjdbc
Guest
бага?
17 дек 12, 22:53    [13646108]     Ответить | Цитировать Сообщить модератору
 Re: jdbc vs CLOB: замедление  [new]
OldBoyOdeSu
Member

Откуда: и куда?
Сообщений: 202
когда то работал с Java и использовал потоки для этих целей, для блоб примерно так (для клоб аналогичная логика только типы другие)

        OraclePreparedStatement stmt = SELECT BINARYDATA FROM TABLE WHERE ...

        ResultSet rs = null;
        try{
            rs = stmt.executeQuery();
            if(rs.next()){
                ...
		t.setBinarydata((BLOB)rs.getBlob(4));    // Get LOB locators into Java wrapper classes.  oracle.sql.BLOB
            	...
            }
        }finally{


    private static byte[] BlobToByteArray(BLOB binaryData)throws Exception{
        if(binaryData == null)
            return null;
        ByteArrayOutputStream out = null;
        InputStream in = null;
        byte[] buf = new byte[1000000]; //1M
        try{
            out = new ByteArrayOutputStream();
            in = binaryData.getBinaryStream();
            int cnt;
            while ((cnt = in.read(buf))>=0) 
                out.write(buf, 0, cnt);

            return out.toByteArray();
        }finally{
            if(in!=null){
                in.close();
                in = null;
            }  
            if(out!=null){
                out.close();
                out = null;
            }  
        }
    }
18 дек 12, 06:49    [13646606]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить