2016-04-06 14 views
0

Oracle'da bir tablonun bazı satırlarını okuyan ve daha sonra alınan her satır için bir web hizmetini çağıran bir Java uygulaması yaptım.
Bu işlem beklenenden daha uzun sürüyor. Saniyede yaklaşık 4 satır çalıştırılıyor, saniyede yaklaşık 50 satır beklerim.
Web servisine erişmek için dosyaları oluşturmak için wsimport aracını kullandım. Tüm süreç kütüphaneler slf4j ve Log4j ile kaydediliyor.

Tüm sürecin hızını artırmak için ne yapabilirim?
Bu durumda çok iş parçacığı yardımı olabilir mi? Satır işleme bağımsız olmasıdırWeb servisini çağırmak ve tüm süreci kaydetmek için Java kodunun hızı nasıl geliştirilir?

query = "select * from table name where to_char(DATE, 'hh24:mi:ss') >= '"+tMin+"' and to_char(DATE, 'hh24:mi:ss') < '"+tMax+"'"; 

Class.forName("oracle.jdbc.driver.OracleDriver"); 
con = DriverManager.getConnection("jdbc:oracle:thin:"+connection_string); 
stmt = con.createStatement(); 
rs = stmt.executeQuery(query); 

while(rs.next()){ 

    SomeBean n = new SomeBean(); 
    n.setColumn1(rs.getString("Column1")); 
    n.setColumn2(rs.getString("Column2")); 
    n.setColumn3(rs.getString("Column3")); 
    n.setColumn4(rs.getString("Column4")); 
    n.setColumn5(rs.getString("Column5")); 
    v.add(n); 

} 

for(SomeBean s : v) 
{ 

    String Column1 = s.getColumn1); 
    String Column2 = s.getColumn2(); 
    String Column3 = s.getColumn3(); 
    String Column4 = s.getColumn4(); 
    String Column5 = s.getColumn5(); 


    someInfo1.setColumn1(Integer.parseInt(Column1)); 
    someInfo1.setColumn2(Column2); 
    someInfo1.setColumn3(Column3); 

    someInfo2.setColumn4(Column4); 
    someInfo2.setColumn5(Integer.parseInt(Column5)); 

    try 
    {      
     Result resultws = Webservice.webservice(someInfo1, someInfo2); 
    } 
    catch (Exception e) 
    { 
     //catch exception 
    } 
} 

VisualVM - CPU sample

+1

Eğer darboğaz tanımlamak için JProfiler veya JVisualVM gibi bir profilleyici denediniz mi? –

+0

Evet, VisualVM kullandım ama nereye bakacağımı ve bununla ilgili ne yapacağımı bilmiyorum. Bir ekran görüntüsü yayınladım. – Rodrick

cevap

1

Çoklu iş parçacığı burada beacause yardımcı olabilir:

Bu

benim kod kısadır. Birçok yaklaşım var. Bir web servis çağrısı ( ExecutorService) gönderdiğiniz bir ThreadPool oluşturacak olan java'dan ExecutorService'i kullanmanızı öneririm. Ama en basit çözüm gibi Runnable içinde web hizmeti çağrısı sarmak için bu

new Thread(
      new Runnable() { 

       @Override 
       public void run() { 
        Result resultws = Webservice.webservice(someInfo1, someInfo2); 
       } 
      } 
    ).start(); 
İlgili konular