Rafal Szulc

Rafal Szulc rozwiazuje problemy,
optymalizuje
procesy, 2G/3G DB
confi...

Temat: Problem z BlazeDS/AMF

Witam,

Mam problem z konfiguracja BlazeDS, cos mi sie wydaje ze nie dziala tak jak powinno :/

Kodu byloby duzo do wklejania wiec postaram sie strescic:

Mam BlazeDS + Glassfish + Oracle 9.2 . W DB 3 tabele, powiedzmy 'A','B','C'.

By stworzyc pewien widok musze pobrac dane z kazdej z tych tabel.
Zapytania 'Select' sa bardzo podobne, roznica wlasciwie tylko w ilosci danych.W 'A' jest malo danych, w 'B' srednio, a w 'C' bardzo duzo.

Tak wiec user klika na Button, ten uruchamia funkcje:
//
private function makeGraph(a:String,b:String,c:String,d:String):void
{
roA.getA(a,b,c); roB.getB(a,b); roC.getC(a,b,c,d);
// zapis czasu startu:
timeStats = "\n"+ 'makeGraph: ' +(new Date()).toTimeString();
}
//
Kazdy z roA/roB/roC jest RemoteObject'em o podobnej strukturze:

<mx:RemoteObject id="roA" destination="aero-amf"
result="resultHandlerA(event)"
fault="faultHandler(event)"
/>
kazdy ma to samo 'destination' (funkcje wywolywane znajduja sie w tym samym pliku .java), kazdy ma swoj osobny resultHandler (A/B/C), przykladowo:
//
private function resultHandlerA(event:ResultEvent):void
{
var rowsA:ArrayCollection = event.result as ArrayCollection;
... // some parsing of results
timeStats += "\n"+ 'resultHandlerA: ' +(new Date()).toTimeString();
readyA = true;
checkIfAllReady(readyA ,readyB ,readyC);
}
//
funkcja sprawdzajaca czy wszystkie RO skonczyly:
private function checkIfAllReady(rA:Boolean,rB:Boolean,rc:Boolean):void
{
if(rA && rB && rC){
... // czyli wszystko sie wczytalo, mozna zmienic view
timeStats += "\n"+ 'checkIfAllReady: ' +(new Date()).toTimeString();
Alert.show(timeStats, 'end');
}
}
//

Poniewaz predkosc dzialania nie powala chcialem zbadac ktory RO jest tak powolny ze reszta 'czeka' na niego. Dodalem zmienna 'timeStats'.
Przykladowy rezultat Alertu z funkcji 'checkIfAllReady':
//
makeGraph: 15:21:23 GMT+0000
resultHandlerA: 15:22:06 GMT+0000
resultHandlerB: 15:22:06 GMT+0000
resultHandlerC: 15:22:06 GMT+0000
checkIfAllReady: 15:22:07 GMT+0000
//
A teoretycznie tylko resultHandlerC powinien spowalniac (najwiecej danych z selecta), a tymczasem wszystkie handlery zwracaja ten sam czas zakonczenia.

Ktos ma jakis pomysl ?Rafal Szulc edytował(a) ten post dnia 09.03.11 o godzinie 17:30
Stanislaw Żółkiewski

Stanislaw Żółkiewski Looking for an
excellent job

Temat: Problem z BlazeDS/AMF

Napisałeś, że wszystkie RO korzystają z tego samego destination. Sprawdziłbym, czy metody po stronie serwera nie czekają na jakąś wspólna inicjalizację - np. stworzenia instancji obiektu DAO / Repository (z nawiązaniem połączenia do bazy), z których później korzystasz w wystawionych metodach.

Hmm... sprawdziłbym również, czy faktycznie zwracane są różne wielkości metod getA, getB i getC.
Rafal Szulc

Rafal Szulc rozwiazuje problemy,
optymalizuje
procesy, 2G/3G DB
confi...

Temat: Problem z BlazeDS/AMF

Hmm... Moje metody z zapytaniami znajduja sie w tej samej public class DAO. Ale czy z kazdym requestem do RemoteObjectu nie bedzie tworzony osobny obiekt DAO? Jesli requesty sa asynchroniczne to to chyba logiczne ze tak bedzie? Expertem od Javy nie jestem :/

destination z remoting-config.xml:

<destination id="aero-amf">
<properties>
<source>tut.Aero_nodeDAO</source>
</properties>
</destination>


Ponizej wycinek z Aero_nodeDAO z jednym z zapytan (pozostale bardzo podobne, tylko na innych tabelach):

package tut;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import flex.samples.DAOException;
import flex.samples.OracleConnectionHelper2;
import tutorial.Aero_node;
import tutorial.Aero_edge;

public class Aero_nodeDAO {

...
public List getA(String date, String netact, String rnc, String wbts, String newest) throws SQLException{
List list = new ArrayList();
Connection c = null;
String tablePrefix = "AERO";
String searchDate = "node_date = '" + date + "' AND " ;
try {
c = OracleConnectionHelper2.getConnection();
if(newest.equals("new")){
tablePrefix = "A";
searchDate = "";
}
Statement s = c.createStatement();
String query = "SELECT * FROM AERO."+tablePrefix+"_WCEL_NODE WHERE " +
searchDate + //date
"aero_netact='" + netact + "' AND " +
"aero_rnc='" + rnc + "'" ;
if(!wbts.equals("*")){
query += " AND aero_wbts='" + wbts + "'";
}
ResultSet rs = s.executeQuery(query);

while (rs.next()) {
Aero_node aero_node = new Aero_node();
aero_node.setNodeLink(rs.getString("node_link"));
aero_node.setNodeName(rs.getString("node_name"));
aero_node.setNodeType(rs.getString("node_type"));
aero_node.setNodeDesc(rs.getString("node_desc"));
aero_node.setNodeDate(rs.getString("node_date"));
aero_node.setNodeNetact(rs.getString("aero_netact"));
aero_node.setNodeRnc(rs.getString("aero_rnc"));
aero_node.setNodeWbts(rs.getString("aero_wbts"));
aero_node.setNodeGid(rs.getString("aero_gid"));
aero_node.setNodeAtm(rs.getString("aero_atm"));
aero_node.setNodeNE("wcel");
list.add(aero_node); }
} catch (SQLException e) {
e.printStackTrace();
throw new DAOException(e);
} finally {
c.close();
}
return list;
}


...

}

Przykladowe statystyki zapytan do tabel:
A: ~150 rows, select zwraca 1 row
B: ~15000 rows, select zwraca ~400 rows
C: ~140000 rows, select zwraca ~7000 rows

Czyli rozdzielenie metod dla A/B/C na rozne obiekty DAO powinno rozwiazac problem ?
Tomasz Morawski

Tomasz Morawski człowiek
orkiestra...

Temat: Problem z BlazeDS/AMF

spróbuj zdebugować kod Javy, powstawiaj tam jakieś timestampy i zobacz kiedy metody kończą, to pozwoli ocenić czy problem jest po stronie Javy czy samego remote'a. no i warto spróbować z innymi DAO a tym samym innymi destinations. a tak w ogóle to pobieranie 7k wierszy mija się z celem ;)
Stanislaw Żółkiewski

Stanislaw Żółkiewski Looking for an
excellent job

Temat: Problem z BlazeDS/AMF

Masz domyślne ustawienia dla destination... czyli masz zapytanie co request. Myślałem, że używasz appliaction scope, aby ciągle nie inicjalizować połączenia, ale korzystasz z OracleConnectionHelper2 z metodą statyczną, co powinno dać podobny efekt.

Nie wiem co się dzieje w metodzie OracleConnectionHelper2.getConnection(), i to może zajmować czas każdego z zapytań.

Faktycznie sprawdź czasy po stronie Java - na wejściu metody, na wyjściu, i zaraz po wykonaniu OracleConnectionHelper2.getConnection().
Rafal Szulc

Rafal Szulc rozwiazuje problemy,
optymalizuje
procesy, 2G/3G DB
confi...

Temat: Problem z BlazeDS/AMF

Yhym, co request jest nawiazywane polaczenie ...
Kod javy to rozbudowalem z ktoregos z tutoriali do BlazeDSa ... Pewnie zbyt optymalnie to to nie wyglada :/


public class OracleConnectionHelper2
{
private String url;
private static OracleConnectionHelper2 instance;

private OracleConnectionHelper2()
{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
url = "jdbc:oracle:thin:@..IP..:1523:db";
} catch (Exception e) {
e.printStackTrace();
}
}

public static Connection getConnection() throws SQLException {
if (instance == null) {
instance = new OracleConnectionHelper2();
}
try {
return DriverManager.getConnection(instance.url , "..user..", "..pass..");
} catch (SQLException e) {
throw e;
}
}
public static void close(Connection connection)
{
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}


7k wierszy laduje sie raz, a potem user sobie filtruje w datagridzie to co mu potrzeba. Pobadam te timestampy wiec ... Dzieki za pomoc.

Następna dyskusja:

Flex [AIR] + Zend AMF + Pos...




Wyślij zaproszenie do