JPA – EntityManager x EntityManagerFactory x Multithreading

Opa!

Neste post vou falar um pouco sobre EntityManager e EntityManagerFactory em relação a ambiente multithread.

EntityManager não é thread-safe

Diferente do EntityManagerFactory, o EntityManager não é thread-safe. É importante relevar isso principalmente em aplicações web, onde cada requisição do cliente é tratada por um thread diferente.

Neste cenário normalmente são utilizados singletons para prover os serviços, onde pode ser um problema usar injeção de dependência (DI) para injetar um EntityManager como membro de instância dos singletons.

Por isso, o mais indicado é injetar o EntityManagerFactory. Exemplo:

public class UserDAO {
    @PersistenceUnit
    private EntityManagerFactory emf;

    public void persist(User user) {
        EntityManager em = null;
        try {
            em = emf.createEntityManager();
            return em.persist(user);
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
}

Usando a injeção de dependências do Spring

Com o Spring a situação é diferente…

O seguinte post é bem interessante, onde o autor explica o mecanismo de controle de transação do Spring para métodos anotados com @Transactional do Spring:

http://blog.jhades.org/how-does-spring-transactional-really-work/

A parte em que ele fala do EntityManager vem bem a calhar. No caso, ele explica que o Spring não injeta o EntityManager diretamente, invés disso é injetado um proxy. Este proxy, com ajuda de um ThreadLocal, sempre resolve um EntityManager por thread, eliminando o problema do multithreading.

Antes que o leitor possa pensar em ignorar a ideia do proxy e injetar sempre o EntityManagerFactory, quando usando o Spring, o melhor mesmo é injetar direto o EntityManager.

Dentro de um escopo transacional do Spring, a abertura e commit/rollback são controlados pelo container, o que é feito em cima do EntityManager controlado pelo Spring (vinculado ao thread atual).

Se injetamos o EntityManagerFactory e criamos o EntityManager manualmente, o Spring não irá realizar o controle da transação no EntityManager que criamos, mas em algum outro controlado por ele. Neste caso você poderá notar que suas alterações não serão persistidas no banco.

Então o correto, que é até mais simples, é usar direto o EntityManager. Segue exemplo:

public class MyComponent {
    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void doStuff() {
        Animal animal = new Animal("Fish");
        Toy toy = new Toy("Ball");

        entityManager.persist(animal);
        entityManager.persist(toy);
    }
}

Como já citado lá naquele post, o mais legal é que se o método inicial da transação chamar outro componente, e este componente também injetar o EntityManager, novamente estaremos trabalhando com o proxy que irá resolver o mesmo EntityManager, possibilitando continuar na mesma transação.

Outras referências:
Tutorial JEE 6 (EntityManager em ambiente gerenciado):
http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html#indexterm-1674

Publicado em Java, JPA, Spring | Deixar um comentário

A trava de tela não funciona no Xubuntu?

No Xubuntu 14.04, o recurso de “lock screen” (CTRL+ALT+DEL) é acionado pelo script xflock4, que chama um dos “lockers” instalados no sistema. O problema ocorre quando nenhum “locker” é encontrado.

No meu caso, o problema foi que desativei o ligh-locker, que por padrão fica responsável por travar a tela. Para resolver o problema basta reativá-lo, ou então instalar outro locker.

Eu optei por deixar o light-locker desativado, pois ele não estava respeitando as configurações e travando a tela automaticamente enquanto eu assistia filmes… Instalei então o gnome-screensaver:
sudo apt-get install gnome-screensaver

Vasculhando o xflock4, nota-se que podem ser usados os seguintes lockers: light-locker, gnome-screensaver, xcreensaver, xlock e slock.

Referências:
http://unix.stackexchange.com/questions/101806/why-doesnt-my-screen-lock-in-xfce#comment155208_101813
https://wiki.archlinux.org/index.php/Xfce#Lock_the_screen

Publicado em Sem categoria | Deixar um comentário

Content assist do Eclipse não funcionando no KDE

Depois de instalar o KDE em um ambiente Ubuntu 14.04 LTS, através do pacote kubuntu-desktop v1.308.1, tive problemas com o recurso de content assist no Eclipse, o qual é acionado por CTRL+SPACE. Acredito que o mesmo problema ocorrerá também no Netbeans, que utiliza a mesma hotkey.

No meu caso o problema foi um conflito com o IBus (Intelligent Input Bus), que é um framework para possibilitar a utilização de vários idiomas para entrada de texto, possibilitando a rápida troca de idioma através de uma hotkey, que por padrão é justamente o CTRL+SPACE.

Para resolver o problema basta desabilitar a hotkey, ou mudá-la para outra combinação, caso queira utilizar o recurso. Para isso abra o IBus pelo menu de aplicações do KDE ou, se estiver disponível, pelo ícone na “system tray”, que normalmente se apresenta como um teclado:

Ícone do IBus na System Tray

Acionando a tela de preferências, o CTRL+SPACE aparece logo de cara. Acione então o botão de configurações…

Tela de preferências do IBus

Comigo, a tela de configuração das hotkeys ficou “bugada” e não exibiu corretamente a lista de hotkeys, mas como o item já vem selecionado, bastou acionar o delete e confirmar.

Tela de configuração da tecla de atalho do IBus

Referências:
Homepage do IBus: https://code.google.com/p/ibus/

Publicado em Bugs, Linux | Com a tag , , , , , , , | 3 comentários

Livros e apostilas gratuitos sobre programação

No repositório a seguir (Github) é mantida uma lista com alguns livros e apostilas gratuitos sobre programação e tópicos afins, incluindo linguagens e metodologias de desenvolvimento. Segue o link:
https://github.com/vhf/free-programming-books

Você pode ainda contribuir com a lista, basta seguir as instruções contidas na própria página inicial do repositório.

Existe material em vários idiomas, por exemplo em pt-BR, que está em:
https://github.com/vhf/free-programming-books/blob/master/free-programming-books-pt_BR.md

Publicado em Sem categoria | Deixar um comentário

Exemplo Spring + Hibernate + Tiles

Postei no Github um exemplo de aplicação web internacionalizada baseada nas seguintes tecnologias:

  • Spring Framework (web mvc)
  • Hibernate
  • Apache Tiles
  • Maven
  • EasyMock

Link para o repositório: https://github.com/hmagalhaes/exemplo-rh

Publicado em Sem categoria | Deixar um comentário

Arquivo da Internet: Wayback Machine

Muito legal este site. Ele tira “foto” do estado atual das páginas pela Internet a fora, permitindo a navegação pelas páginas em diversas épocas. Há também a opção de requisitar manualmente uma nova foto de algum site qualquer.

Vale a pena conferir.

http://archive.org/web/

Publicado em Legais, Web | Com a tag , | Deixar um comentário

GoodUI – Ideias para uma boa UI

No projeto GoodUI, o autor compartilha diversas ideias para criar uma boa interface de usuário (User Interface), visando a maior usabilidade e ainda uma melhora na taxa de conversão (vendas, captação de cadastro, etc).

No momento desta postagem, são 38 ideias, vale a pena conferir.

Ref.:
GoodUI, disponível em <http://www.goodui.org>.

Publicado em Design, UI, UX, Web | Deixar um comentário

Assistir ao Netflix no Linux Ubuntu/Debian

Alternativa: Netflix Desktop

O pacote “netflix-desktop” consiste em uma versão personalizada do Wine que vem com Firefox e Silverlight 4 instalados, pronto para acessar o Netflix.
Ao instalar, um link é criado no menu de aplicações do sistema, dentro da categoria multimídia. Basta acioná-lo que uma instância do Firefox (versão Windows) é iniciada pelo Wine com tudo pronto.

A instalação é feita pelo pacote “netflix-desktop”:
sudo apt-get install netflix-desktop

Caso não tenha o repositório, pode adicionar o repositório ppa do autor:
sudo add-apt-repository ppa:ehoover/compholio

O pacote também está disponível em outro repositório:
sudo add-apt-repository ppa:pipelight/stable

Caso tenha problemas com os comandos acima, tente baixar o pacote deb diretamente:
http://ppa.launchpad.net/ehoover/compholio/ubuntu/pool/main/n/netflix-desktop/
https://launchpad.net/~pipelight/+archive/stable/

Mais informações estão disponíveis na homepage do projeto:
http://www.compholio.com/netflix-desktop

Situação do Silverlight

Há algum tempo atrás, consumir mídia distribuída por Silverlight no Linux era mais simples, pois bastava instalar um plugin diretamente no navegador, da mesma forma que é feita no Windows. Nesse caso utilizava-se o Moonlight, que é uma implementação do Silverlight para Linux que funciona sobre a plataforma Mono, porém o projeto foi descontinuado. Entre outros motivos, cita-se que o fim do projeto deu-se pela baixa adoção da tecnologia Silverlight.

Outra questão relacionada ao assunto, é que o Netflix está investindo na troca de sua solução baseada em Silverlight por algo compatível com HTML5, visando é claro, maior audiência.

Enquanto o Flash se mantém no mercado mesmo após as duras ameaças de morte vindas do HTML5, a solução da Microsoft definha principalmente por não ter recebido investimento em portabilidade. De qualquer forma, este é um fenômeno natural, visto que hoje entende-se que a padronização trazida pelo HTML5 é a melhor abordagem.

Algumas referências:
Homepage do Moonlight
Mono Moonlight no Wikipedia
Netflix to dump Silverlight, Microsoft’s stalled technology
Miguel de Icaza on ASP.NET MVC, Moonlight, and the Android Lawsuit

Publicado em Linux, Web | Com a tag , , , , , | Deixar um comentário

O que faz um herói?

Muito legal. Faz valer os 4m34seg indo além do conceito inicial de herói que vem à nossa mente ao ler o título.

Publicado em Legais, Pensamentos | Deixar um comentário

Desenvolvimento para Firefox OS

Ilustração do mascote do Firefox OS junto a um smartphone com Firefox OS rodando

Firefox OS. Eu quero!

Em 50 minutos, Andre Garzia, membro da comunidade Mozilla Brasil, dá uma pincelada sobre o novo Firefox OS, que está chegando de vez pelas terras tupiniquins.

Além de destacar as facilidades em se desenvolver para a plataforma, o que é feito tudo à base de Javascript, HTML e CSS, o palestrante dá insights sobre as vantagens de se investir no novo sistema, o qual conta com ótima performance devido à arquitetura de poucas camadas, resultando em alcance maior no mercado através de dispositivos mais modestos em hardware. Também é destaque o modelo de distribuição de aplicações, que inclui o Firefox Marketplace e a distribuição diretamente do seu website. Vale citar também o novo modelo de pagamento que está para sair, o qual baseia-se em cobrança direto em conta telefônica, dispensando o uso de cartão de crédito, o que é sem dúvidas ideal baixos valores, tal como a venda de aplicações costuma ser.

Vale a pena dar uma conferida no link:  http://www.infoq.com/br/presentations/desenvolvendo-novo-firefox-os

E viva o software aberto.

Publicado em Mobile, Web | Com a tag , , | Deixar um comentário