Prevalência com Swap e/ou Passivation

[quote=“saoj”][quote=“Duardor”]
Sei lá, é como o pcalcado disse… o negocio de instanceof UserPassivated nao me agrada…
[/quote]

Teremos que pagar algum preço em prol da simplicidade. O desafio seria codificar uma coisa o menos dolorosa possível para quem depois vai estar escrevendo os POJOs. Se eu começar a explicar tudo isso para o pobre programador escrevendo os POJOs, o cara vai debandar na hora. :slight_smile:

Teria que ser algo mais ou menos assim:

“Se quer que seus POJOs sejam passivados, coloque eles nesse Map aqui: PassivationMap” e crie um objeto para representar o identificador único do seu POJO. E esqueça isso…" :slight_smile:

Mais ou menos como o cluster do Space4J. :slight_smile:

[]'s

Sergio[/quote]

Será que não têm algo mais simples e que mantenha TOTALMENTE a simplicidade OO???

Thinking…

[quote=“cv”]Acho mais facil exemplificar com codigo duma vez…

[code]public class MeuProxyFeliz implements InvocationHandler {

private static long lastGlobalID = 0;

private final WeakReference weakRef;

private final long id;

public MeuProxyFeliz(Object realObject) {
    this.weakRef = new WeakReference(realObject);
    this.id = lastGlobalID++;
}

/**
 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
 *      java.lang.reflect.Method, java.lang.Object[])
 */
public Object invoke(Object ignored, Method method, Object[] args) throws Throwable {
    Object proxy = weakRef.get();
    if (null == proxy) {
        // deserializa o bicho!
        
    } else if (descobreSeEuPrecisoSalvarEsteObjeto(id)) {
        // serializa o objeto!
    }

    return method.invoke(proxy, args);
}

}[/code][/quote]

Um proxy pra cada objeto???

Sim… pesado, eu sei, mas ao menos ainda estamos no campo do “possivel” :smiley:

Pergunta sobre o codigo
Kd o fonte da classe org.space4j.implementation.CommandExecuter???

:x :x :x Putz, eu fico muito p da vida com isso, semrpe que mando um mail grande pra riojug, recebo a resposta antes do e-mail. Nem lembrava o que tinha nele! :x :x :x

Bom, vamos lá. A GoF define o Pattern Proxy [página 198 doi livro em português, para que como eu não tem cartão internacional e comprou na ciência moderna :stuck_out_tongue: ], que serve extamaente para esse uso. O exemplo [muito bom, aliás] dado na descrição é um editor gráfico que rpecisa trabalhar com uma figura muito pesada, que demora para carregar. em vez dele ficar esperando o troço ser finalmente carregado para deixar o usuário brincar com o programa, ele cria um objeto que possui a mesma interface que a figura teria [por exemplo: você pode mudar ele de lugar, apagar, etc.] enquanto a imagem carrega, incluindo todos os atributos do objeto que são “visíveis” [tipo altura e largura da imagem]. A gente vê muito isso [eu, pelo menos, já que tenho linha discada :stuck_out_tongue: ] em browsers, quando carregam figuras. Creio que o Dynamic Proxy que o cv fala, da Reflection, tenha a ver com este padrão de projeto.

Supondo que com a reflection ou sei lá o que consigamos substituir o trecho em memória ocupado pelo objeto [considerando que seria muito mais simples fazer isso do que substituir todas a infinitas referências que um objeto pode ter] por um proxy muito mais magro, este proxy, quando ativado por alguém que mantinha referência ao objeto passivado, apenas chama o objeto real em disco, o coloca em seu próprio lugar e chama a mesma operação neste objeto, devolvendo a memória ao estando de antes da passivação. Pro cliente, seria transparente.

O problema é criar este proxy. Reflection, se funcionar mesmo [sei que prometi, mas ainda não li nada sobre o proxy :oops: ] poderia até ter uma lerdeza, mas a idéia aqui não é guardar objetos em disco a todo instante [como acho que alguns estão pensando, aqui e no JUG], mas sim utilizar em caso emergencial, para que sua aplicação não pare por falta de memória, então não sei se seria um problema tão grande, apesar da lerdeza reflection+serialization se bem considerável…

Não vejo muita fuga além de um agente do sistema de prevalência substituindo objetos ociosos por proxys quando o bicho pegar, mas…

Como vamos saber se um objeto é muito acessado, sem fazer ele implementar nem estender nada?

  1. Utilizar DAO para ler a classe, assim saberíamos quando alguém requisitasse uma classe da persistência no primeiro acesso, ams quem garante que o cara não vai guardar uma referência para esta classe nele mesmo e mandar a gente se danar, nunca mais chamando o DAO rpa nada?

  2. Agrupar os objetos persitidos em estruturas mínimas possíveis, contendo um grupo de objetos correlatos. Passivar toda a estrutura de uma vez, talvez utilizando a opção 1) para monitoria. Assim, teríamos os mesmos problemas, mas creio que a taxa de “passivação errada” seria menor, porque a tendência é que um objeto referenciado a outro seja chamado quando este for chamado, logo se mantivermos o grupo de “amiguinhos” do objeto X na memória, se rpecisarmos de algum deles quando chamarmos X , temos certeza que estarão lá. Uhm…isto está muito imaturo e confuso…

Bem, considerando o primeiro desfafio, de colocar um proxy substituindo o objeto original no endereço de memória deste, resolvido, como monitorar as consultas sem fazer com qeu o cliente tenha que se improtar se está utilizando o modelo de passivação do Space4J versão 2.5 ou o Prevayler 3.4 :?: :?: :?:

Ai meu são tanenbaum…

Sim… pesado, eu sei, mas ao menos ainda estamos no campo do “possivel” :D[/quote]

Ok
Na situacao hipotética (bem hipotética mesmo) que tenhamos MUITOOOSSS proxys de modo que apenas estes encham a memória, q poderemos fazer???
Proxys de proxys???

Abraços

[quote=“duardor”]Pergunta sobre o codigo
Kd o fonte da classe org.space4j.implementation.CommandExecuter???[/quote]

CommandExecuter não tem !!! :frowning:

O que temos é um Command, que representa uma alteração no Space e que é executado por um Space4J.

Vc está olhando em http://space4j.dev.java.net/

O que procuras ?

Assim, não sei se é muita viagem, falando em AOP, mas poderíamos fazer q todos que a todos os proxys fossem integrados um aspecto q faria o papel do dao… mas eu ainda não to concordando com esse negocio de um proxy pra cada objeto…

PS: Discussão muito boa!

Abraços

[quote=“saoj”][quote=“duardor”]Pergunta sobre o codigo
Kd o fonte da classe org.space4j.implementation.CommandExecuter???[/quote]

CommandExecuter não tem !!! :frowning:

O que temos é um Command, que representa uma alteração no Space e que é executado por um Space4J.

Vc está olhando em http://space4j.dev.java.net/

O que procuras ?[/quote]
ueh
Peguei o ccódigo e têm apenas a classe CommandExceuter
???
por isso não entendi q diasbos é ela!

Nao eh possivel substituir nada na memoria. Quem gerencia isso eh a JVM, e a gente nao quer mexer nisso. Ou seja, todo o seu post foi pras cucuias - desculpe por trazer as más notícias :smiley:

Outra: se vc estiver usando dynamic proxies (reflection ou cglib), ou vc fala com o proxy, ou vc fala com o objeto. Ou seja, ou voce faz com que toda a criacao de objetos “sensiveis” no sistema passe por uma factory que te devolve o proxy no lugar, ou voce tem todos os problemas que o louds mencionou, e mais alguns. Alias, tudo que o louds falou continua valendo: abusar de dynamic proxies desse jeito requer MUITO cuidado.

Sim… pesado, eu sei, mas ao menos ainda estamos no campo do “possivel” :D[/quote]

Ok
Na situacao hipotética (bem hipotética mesmo) que tenhamos MUITOOOSSS proxys de modo que apenas estes encham a memória, q poderemos fazer???
Proxys de proxys???

Abraços[/quote]

Perae
Deixa eu me explicar direito …
Proxies para conjuntos de Proxies (credo, isto tah me cheirando indexação de BD)
:frowning:

Abraços

[quote=“duardor”]
Na situacao hipotética (bem hipotética mesmo) que tenhamos MUITOOOSSS proxys de modo que apenas estes encham a memória, q poderemos fazer???
Proxys de proxys???[/quote]

Um…de repente vc precisa tirar 1 ou dois dos hipotéticas, se estamos falando de servidores robustos [ou de efeito slashdot], não temos muito limites para esbarrar…

Bem, neste caso acho que realmente o negócio é jogar a toalha, rebootar o servidor e resgatar a última réplica enquanto manda o boy ir comprar mais memória! Acho que para chegar aqui, o problema tá na arquitetura de infra-estrutura, de repente o cara quis economizar e não uso um cluster, prevalência é lindiu, maraviliosiu, mas não é magikiu. :smiley:

[quote=“duardor”][quote=“saoj”][quote=“duardor”]Pergunta sobre o codigo
Kd o fonte da classe org.space4j.implementation.CommandExecuter???[/quote]

CommandExecuter não tem !!! :frowning:

O que temos é um Command, que representa uma alteração no Space e que é executado por um Space4J.

Vc está olhando em http://space4j.dev.java.net/

O que procuras ?[/quote]
ueh
Peguei o ccódigo e têm apenas a classe CommandExceuter
???
por isso não entendi q diasbos é ela![/quote]

De que código vc está falando ??? Pra não atrapalhar a discussão aqui, me manda isso por email: contato@smartjava.com.br

[]'s

Sergio

…mas… e na situacao (tambem hipotetica) de cair uma bomba nuclear no datacenter? E se os vikings invadirem o predio? E se…?

MEEEEEEENOS, gente, mEEEEEEEEEEnos. :smiley:

Sim, fodeu - e deixe-me reiterar isso: um objeto NAO EXISTE se ele estiver fora da memoria. É impossivel determinar qual o estado de um objeto (ou seja, quais os dados que ele continha) se ele nao estiver na memoria, ou se vc nao copiar esses dados pra outro objeto. Eh uma limitacao simples, mas que se vc prestar atencao, muda bastante o rumo dessa conversa (que já tá ficando sem pé nem cabeça…)

Era o que eu temia, droga de graal do Proxy foi pro kct. Infelizmente, que vai jogar a toalha sou eu: se não tem como substituir um objeto por outro em memória de jeito nenhum, não dá pra substituir infinitas referências a um objeto [a droga da passagem por valores e não referência!], de que adianta eu criar um proxy no endereço 939393 se o objeto que instanciei a três dias vai procurar em 23323 ? Se não rola nenhuma plaquinha pra indicar “mudamos”, já era.

Pelo visto, o jeito é a própria aplicação ter como selecionar um grupo de objetos e jogar eles na vala, ops, no disco. Legal, pena que isso quebra uma camada…uhm… alguém falou em BMP? damn

ai, ai, são knuth…

Sim, fodeu - e deixe-me reiterar isso: um objeto NAO EXISTE se ele estiver fora da memoria. É impossivel determinar qual o estado de um objeto (ou seja, quais os dados que ele continha) se ele nao estiver na memoria, ou se vc nao copiar esses dados pra outro objeto. Eh uma limitacao simples, mas que se vc prestar atencao, muda bastante o rumo dessa conversa (que já tá ficando sem pé nem cabeça…)[/quote]
Dae cv, se isso for verdade absoluta essa conversa jah nao tem pé nem cabeca a muito tempo…
Mas o caso aki é: o objeto NÃO EXISTE em memória mas já existiu (já foi criado em algum momento ueh) mas seu estado está serializado em disco!
To errado?

Sim, fodeu - e deixe-me reiterar isso: um objeto NAO EXISTE se ele estiver fora da memoria. É impossivel determinar qual o estado de um objeto (ou seja, quais os dados que ele continha) se ele nao estiver na memoria, ou se vc nao copiar esses dados pra outro objeto. Eh uma limitacao simples, mas que se vc prestar atencao, muda bastante o rumo dessa conversa (que já tá ficando sem pé nem cabeça…)[/quote]

Claro CV !!! :smiley: :smiley: :smiley: :smiley:

Receber um objeto que não está na memória seria coisa para paranormal !!! :smiley: :smiley: :smiley: :smiley:

O que eu quiz dizer é:

Receber um objeto qualquer que sinalize que o o objeto em questão não está na memória e precisa ser trazido de volta.

Esse objeto poderia ser o tal do objeto que representa o identificador único do objeto.

if (myuser instanceof UniqueIdentifier) {
myuser=getFromDisc(user_id);
}

Bom, esse papo foi muito legal. Eu vou tentar, sem maiores pretensões, brincar com isso. Os proxies me parecem ser a solução mais correta, mas não a melhor. Por isso vou partir para a minha solução simplista que eu descrevi acima. Se conseguir alguma coisa descente eu aviso a voces.

Um abraço,

Sergio

Sérgio, eu posso estar doido, mas tenho quase certeza que o quê você está querendo fazer é um proxy, pelo menos o comprotamento é o mesmo.

Realmente, creio que só como um serviço, tipo o “console do administrador do sistema”, o cara seleciona determinados objetos [imposto de renda de 1983?] e joga em hd. Eles estão lá, podem ser chamados em necessidade, como page faults em memória, mas enquanto não chega a hora…lazy…lazy zorra nenhuma, amanhã tem trabalho, fui!

[]s

Sergio, ja que vc vai ter um tempinho pra brincar (olha eu me aproveitando :D) e descubra o que acontece se vc tenta deserializar um objeto que possui uma WeakReference - isso eh bastante importante, se vc for organizar a coisa usando dynamic proxies, do jeito que eu mostrei. :smiley: