SlideShare uma empresa Scribd logo
J1Brasil
                                        Persistência de Dados além do JPA,
                                        ou Como usar noSQL em Java

                                        Alexandre Porcelli
                                        alexandre.porcelli@gmail.com




segunda-feira, 13 de dezembro de 2010
Java One Brasil 2010



                                                                            Alexandre Porcelli
                                                                            Founder




     Alexandre Porcelli
     Writer


                                Alexandre Porcelli
                                Organizer

                                                     Alexandre Porcelli
                                                     Commiter / Parser Developer


                                                                                   Alexandre Porcelli
                                                                                      Creator &
                                                                                     Project Lead



segunda-feira, 13 de dezembro de 2010
JDBC


segunda-feira, 13 de dezembro de 2010
!
public class Pessoa {                   	   	   ComboPooledDataSource ds = new ComboPooledDataSource();
	   private int id;                     	   	   try {
	   private String nome;                	   	   	   ds.setDriverClass("com.mysql.jdbc.Driver");




                                                                                                               O
	   private String email;               	   	   	   ds.setJdbcUrl("jdbc:mysql://localhost:3306/j1br");
	   private String telefone;            	   	   	   ...
     ...                                	   	   } catch (PropertyVetoException e) {




                                                                                                   G
}                                       	   	   	   throw new RuntimeException(e);
                                        	   	   }




                                                                                                 I
                                        	   	   String nome = "Alexandre Porcelli";
                                        	   	   String email = "alexandre.porcelli@gmail.com";




                                                                     D
                                        	   	   String telefone = "+55 11 1234-5678";

                                        	   	   Connection conn = null;




                                                                   Ó
                                        	   	   try {
                                        	   	   	   conn = ds.getConnection();
                                        	   	   	   PreparedStatement st = conn.prepareStatement(




                                                                  C
                                        	   	   	   	    	   	    	   "INSERT INTO PESSOA (nome, email, telefone) VALUES (?, ?, ?)",
                                        	   	   	   	    	   	    	   Statement.RETURN_GENERATED_KEYS);
                                        	   	   	   st.setString(1, nome);
                                        	   	   	   st.setString(2, email);




                                           O
                                        	   	   	   st.setString(3, telefone);
                                        	   	   	   st.executeUpdate();
                                        	   	   	   conn.commit();




                                          T
                                        	   	   	   st.getGeneratedKeys().next();




                                        I
                                        	   	   	   Pessoa novaPessoa = new Pessoa(st.getGeneratedKeys().getInt(1),
                                        	   	   	   	    	   nome, email, telefone);
                                        	   	   } catch (Exception e) {




                             U
                                        	   	   	   throw new RuntimeException("Pessoa insert failed.", e);
                                        	   	   } finally {
                                        	   	   	   try {
                                        	   	   	   	    if (conn != null) {




          M
                                        	   	   	   	    	   conn.close();
                                        	   	   	   	    }
                                        	   	   	   } catch (SQLException e) {
                                        	   	   	   	    throw new RuntimeException("Can't close connection", e);
                                        	   	   	   }
                                        	   	   }

segunda-feira, 13 de dezembro de 2010
JPA


segunda-feira, 13 de dezembro de 2010
@RunWith(Arquillian.class)
  @Entity
                                        public class PessoaTestCase {
  public class Pessoa {
                                        	   @Deployment
  	     @Id                             	   public static Archive<?> createDeployment() {
  	     @GeneratedValue                 	   	    return ShrinkWrap.create(WebArchive.class, "test.war")
  	     private    int id;              	   	    	   	    .addPackage(Game.class.getPackage())
  	     private    String nome;         	   	    	   	    .addManifestResource("test-persistence.xml", "persistence.xml")
  	     private    String email;        	   	    	   	    .addWebResource(EmptyAsset.INSTANCE, "beans.xml");
  	     private    String telefone;     	   }
         ...
  }                                     	   @PersistenceContext
                                        	   EntityManager em;

                                        	   @Inject
                                        	   UserTransaction utx;

                                        	   @Test
                                        	   public void insertSampleRecords() throws Exception {
                                        	   	   utx.begin();




   OK!
                                        	   	   em.joinTransaction();

                                        	   	   Pessoa novaPessoa = new Pessoa();
                                        	   	   novaPessoa.setNome("Alexandre Porcelli");
                                        	   	   novaPessoa.setTelefone("+55 11 1234-5678");
                                        	   	   novaPessoa.setEmail("alexandre.porcelli@gmail.com");
                                        	   	   em.persist(novaPessoa);
                                        	   	   System.out.println(novaPessoa);


                                        	   	   utx.commit();
                                        	   }
                                        }
segunda-feira, 13 de dezembro de 2010
noSQL


segunda-feira, 13 de dezembro de 2010
hype




segunda-feira, 13 de dezembro de 2010
segunda-feira, 13 de dezembro de 2010
problemas do

                            dia-a-dia


segunda-feira, 13 de dezembro de 2010
OLTP

                         On-line Transaction Processing is characterized by a large number of
                         short on-line transactions (INSERT, UPDATE, DELETE). The main emphasis
                         for OLTP systems is put on very fast query processing, maintaining data
                         integrity in multi-access environments and an effectiveness measured by
                         number of transactions per second.
segunda-feira, 13 de dezembro de 2010
segurança
                                        autenticação




segunda-feira, 13 de dezembro de 2010
JAAS, LDAP,
                      OAUTH...


segunda-feira, 13 de dezembro de 2010
public boolean isValid(String nomeUsuario, String passw) {
   	     	   PreparedStatement st;
   	     	   Connection conn = null;
   	     	   try {
   	     	   	   conn = dataSource.getConnection();
   	     	     	   st = conn.prepareStatement("SELECT 1 FROM USERS WHERE          id = ? and passw = ?");
   	     	     	   st.setString(1, nomeUsuario);
   	     	     	   st.setString(2, passw);
   	     	     	   ResultSet rs = st.executeQuery();
   	     	     	   if (rs.next()) {
   	     	     	   	   return true;
   	     	     	   }
   	     	     	   return false;
   	     	     } catch (SQLException e) {
   	     	     	   return false;
   	     	     } finally {
   	     	     	   try {
   	     	     	   	   if (conn != null) {
   	     	     	   	   	   conn.close();
   	     	     	   	   }
   	     	     	   } catch (SQLException e) {
   	     	     	   	   throw new RuntimeException("Can't close connection", e);
   	     	     	   }
   	     	     }
   	     }




segunda-feira, 13 de dezembro de 2010
Estrura de Dados:                  Chave-Valor
                                            Durabilidade:   In-Memory / Serialização Paralela / Réplica
                                                    Site:                 http://redis.io/
                                              Escrito em:                        C
                                                                         + Baixa Latência
                                                                      + Serialização Paralela
                                        Pontos Positivos:
                                                                      + Estruturas de Dados
                                                                              + Cases



                                        Pontos Negativos:                       o/




segunda-feira, 13 de dezembro de 2010
public class SegurancaRedisCode {

            	     public static void main(String[] args) {
            	     	 SegurancaRedisCode seg = new SegurancaRedisCode();
            	     	 seg.addUserPassw("porcelli", "1234");
            	     	 Assert.assertTrue(seg.isValid("porcelli", "1234"));
            	     	 Assert.assertFalse(seg.isValid("porcelli", "123"));
            	     	 Assert.assertFalse(seg.isValid("xxx", "1234"));
            	     }

            	     private final Jedis jedis;

            	     public SegurancaRedisCode() {
            	     	 jedis = new Jedis("localhost");
            	     }

            	     public boolean isValid(String nomeUsuario, String passwd) {
            	     	 String correctPassw = jedis.get("user:" + nomeUsuario + ":passwd");
            	     	 if (correctPassw != null && passwd.equals(correctPassw)) {
            	     	 	 return true;
            	     	 } else {
            	     	 	 return false;
            	     	 }
            	     }
            	     public void addUserPassw(String nomeUsuario, String passwd) {
            	     	 jedis.set("user:" + nomeUsuario + ":passwd", passwd);
            	     	 jedis.save();
            	     }
            }
segunda-feira, 13 de dezembro de 2010
árvore


segunda-feira, 13 de dezembro de 2010
segunda-feira, 13 de dezembro de 2010
@Entity
      @Table(name = "categorias")
      public class Categoria {

      	     @Id
      	     @GeneratedValue
      	     private Integer id;

      	     private String nome;

      	     @OneToMany
      	     @OrderColumn
      	     @JoinColumn(name = "parent_id")
      	     private List<Categoria> filhos = new LinkedList<Categoria>();

      	     @ManyToOne(fetch = FetchType.LAZY)
      	     @JoinColumn(name = "parent_id", insertable = false, updatable = false)
      	     private Categoria parent;
            ....
      }




segunda-feira, 13 de dezembro de 2010
Estrura de Dados:            Grafo
                                            Durabilidade:         Single Node
                                                    Site:       http://neo4j.org
                                              Escrito em:             Java
                                                                     + ACID
                                                                  + Maturidade
                                        Pontos Positivos:
                                                            + Velocidade no Traverse
                                                            + Suporte RDF & SPARQL



                                        Pontos Negativos:      - Falta de Sharding




segunda-feira, 13 de dezembro de 2010
private static enum TipoRelacionamento implements RelationshipType {
                    	     	 PAI
                    	     }

                    	     private final GraphDatabaseService graph;
                    	     private static final String NEO4J_PATH = "sample/tree";

                    	     public Neo4jSampleCode() {
                    	     	 graph = new EmbeddedGraphDatabase(NEO4J_PATH);
                    	     }

                    	     public Node novaCategoria(String nome, Node pai) {
                    	     	 Transaction tx = graph.beginTx();
                    	     	 try {
                    	     	 	 Node newCat = graph.createNode();
                    	     	 	 newCat.setProperty("nome", nome);
                    	     	 	 if (pai != null) {
                    	     	 	 	 pai.createRelationshipTo(newCat, TipoRelacionamento.PAI);
                    	     	 	 }
                    	     	 	 tx.success();
                    	     	 	 return newCat;
                    	     	 } finally {
                    	     	 	 tx.finish();
                    	     	 }
                    	     }




segunda-feira, 13 de dezembro de 2010
public Node getPai(Node node) {
             	     	 Transaction tx = graph.beginTx();
             	     	 Node result;
             	     	 try {
             	     	 	 Iterable<Relationship> relationships = node.getRelationships(
             	     	 	 	 	 TipoRelacionamento.PAI, Direction.INCOMING);

             	     	     	     if (relationships.iterator().hasNext()) {
             	     	     	     	 result = relationships.iterator().next().getStartNode();
             	     	     	     } else {
             	     	     	     	 result = null;
             	     	     	     }

             	     	     	 tx.success();
             	     	     	 return result;
             	     	     } finally {
             	     	     	 tx.finish();
             	     	     }
             	     }




segunda-feira, 13 de dezembro de 2010
public List<Node> getFilhos(Node pai) {
                     	     	 Transaction tx = graph.beginTx();
                     	     	 List<Node> result = new LinkedList<Node>();
                     	     	 try {
                     	     	 	 Iterable<Relationship> relationships = pai.getRelationships(
                     	     	 	 	 	 TipoRelacionamento.PAI, Direction.OUTGOING);

                     	     	     	      for (Relationship relationship : relationships) {
                     	     	     	      	 result.add(relationship.getEndNode());
                     	     	     	      }

                     	     	     	 tx.success();
                     	     	     	 return result;
                     	     	     } finally {
                     	     	     	 tx.finish();
                     	     	     }
                     	     }




segunda-feira, 13 de dezembro de 2010
public List<Node> getArvoreCompleta(Node pai) {
                         	     	 Transaction tx = graph.beginTx();
                         	     	 List<Node> result = new LinkedList<Node>();
                         	     	 try {

                         	     	        	   Traverser traverser = pai.traverse(Order.BREADTH_FIRST,
                         	     	        	   	 	 StopEvaluator.END_OF_GRAPH,
                         	     	        	   	 	 ReturnableEvaluator.ALL_BUT_START_NODE,
                         	     	        	   	 	 TipoRelacionamento.PAI, Direction.OUTGOING);

                         	     	        	   for (Node node : traverser) {
                         	     	        	   	 result.add(node);
                         	     	        	   }

                         	     	        	 tx.success();
                         	     	        	 return result;
                         	     	        } finally {
                         	     	        	 tx.finish();
                         	     	        }
                         	     }




segunda-feira, 13 de dezembro de 2010
public static void main(String[] args) {
	     	 Neo4jSampleCode sample = new Neo4jSampleCode();
	     	 Node roupasCat = sample.novaCategoria("Vestuário", null);
	     	 Node camisaCat = sample.novaCategoria("Camisas", roupasCat);
	     	 Node calcasCat = sample.novaCategoria("Calças", roupasCat);
	     	 Node eletronicosCat = sample.novaCategoria("Estronicos", null);

	     	     Assert.assertNull(sample.getPai(eletronicosCat));
	     	     Assert.assertNotNull(sample.getPai(calcasCat));
	     	     Assert.assertEquals(sample.getPai(calcasCat), roupasCat);
	     	     Assert.assertNotNull(sample.getPai(camisaCat));
	     	     Assert.assertEquals(sample.getPai(camisaCat), roupasCat);
	     	     Assert.assertEquals(0, sample.getFilhos(camisaCat).size());
	     	     Assert.assertEquals(2, sample.getFilhos(roupasCat).size());
	     	     for (Node childCat : sample.getFilhos(roupasCat)) {
	     	     	 if (!childCat.equals(camisaCat) && !childCat.equals(calcasCat)) {
	     	     	 	 Assert.fail();
	     	     	 }
	     	     }

	     	     Node camisaMangaCurtaCat = sample.novaCategoria("Manga Curta", camisaCat);
	     	     Node camisaMangaLongCat = sample.novaCategoria("Manga Longa", camisaCat);
	     	     Assert.assertEquals(4, sample.getArvoreCompleta(roupasCat).size());
	     	     for (Node childCat : sample.getFilhos(roupasCat)) {
	     	     	 if (!childCat.equals(camisaCat) && !childCat.equals(calcasCat)
	     	     	 	 	 && !childCat.equals(camisaMangaLongCat)
                      && !childCat.equals(camisaMangaCurtaCat)) {
	 	         	 	 Assert.fail();
	 	         	 }
	 	         }
	 }
segunda-feira, 13 de dezembro de 2010
produtos
                                 diversidade & irregularidade




segunda-feira, 13 de dezembro de 2010
nome                           effective java             tv led 32”          mesa de madeira mod

               valor                            R$ 80                   R$ 1234                   R$ 503

                                        um dos melhores livros
              descr.                                             tv de led 32” muito boa!    mesa de canto legal
                                             sobre java!

          qtd. páginas                           300                       X                         X

                                          técnico/tecnologia/
            categoria                                                      X                         X
                                           programação/java

         cons. energia                            X                         A                        X

                cor                               X                        X                   marrom claro

            dimensão                              X                        X                     20x40x90




segunda-feira, 13 de dezembro de 2010
segunda-feira, 13 de dezembro de 2010
? oo ||relacional ?




segunda-feira, 13 de dezembro de 2010
Estrura de Dados:          Documento
                                            Durabilidade:            Réplica
                                                    Site:      http://mongodb.org
                                              Escrito em:              C++
                                                                   + Velocidade
                                                                      + Index
                                        Pontos Positivos:
                                                                + Consultas ad-hoc
                                                                 + Auto Sharding

                                                                   - Durabilidade
                                        Pontos Negativos:        - Update in Place
                                                          Google: mongodb and fourquare




segunda-feira, 13 de dezembro de 2010
private final DB db;

         	     public MongoDBSampleCode() throws UnknownHostException, MongoException {
         	     	 Mongo mongo = new Mongo();
         	     	 db = mongo.getDB("MeuDatabase");
         	     	 db.getCollection("produtos").drop();
         	     }

         	     public void novoEletronico(int id, String nome, int valor,
         	     	 	 String descricao, String consumoEnergia) {
         	     	 DBCollection coll = db.getCollection("produtos");

         	     	     DBObject dados = new BasicDBObject();
         	     	     dados.put("id", id);
         	     	     dados.put("nome", nome);
         	     	     dados.put("valor", valor);
         	     	     dados.put("tipo", "eletronico");
         	     	     dados.put("desc", descricao);
         	     	     dados.put("cons_energia", consumoEnergia);

         	     	     coll.insert(dados);
         	     }




segunda-feira, 13 de dezembro de 2010
public void getProdutosPorValorMenorQue(int valor) {
                               	        	 DBCollection coll = db.getCollection("produtos");

                               	        	   DBObject query = new BasicDBObject();
                               	        	   query.put("valor", new BasicDBObject("$lt", valor));

                               	        	   for (DBObject foundDoc : coll.find(query)) {
                               	        	   	 System.out.println(foundDoc);
                               	        	   }
                               	        }




segunda-feira, 13 de dezembro de 2010
public static void main(String[] args) throws UnknownHostException,
            	     	 	 MongoException {
            	     	 MongoDBSampleCode samp = new MongoDBSampleCode();
            	     	 samp.novoEletronico(1, "tvled32", 1234, "Tv de led 32"", "A");
            	     	 samp.novoEletronico(2, "geladeira", 2030, "Geladeira Duas portas", "B");
            	     	 samp.novoLivro(3, "effective java", 80,
            	     	 	 	 "um dos melhores livros sobre java!",
            	     	 	 	 "técnico/tecnologia/programação/java", 300);
            	     	 samp.novoLivro(4, "senhor dos anéis 2", 23, "clássico",
            	     	 	 	 "romance/ficção", 300);
            	     	 samp.novoMovel(5, "mesa de madeira", 503, "mesa de canto legal",
            	     	 	 	 "clara", "20x40x90");
            	     	 samp.getProdutosPorValorMenorQue(600);
            	     }




segunda-feira, 13 de dezembro de 2010
{
                                            "id": 3,
                                            "nome": "effective java",
                                            "valor": 80,
                                            "tipo": "livro",
                                            "desc": "um dos melhores livros sobre java!",
                                            "categoria": "técnico/tecnologia/programação/java",
                                            "qtd_pgs": 300
                                        }

                                        {
                                            "id": 4,
                                            "nome": "senhor dos anéis 2",
                                            "valor": 23,
                                            "tipo": "livro",
                                            "desc": "clássico",
                                            "categoria": "romance/ficção",
                                            "qtd_pgs": 300
                                        }

                                        {
                                            "id": 5,
                                            "nome": "mesa de madeira",
                                            "valor": 503,
                                            "tipo": "movel",
                                            "desc": "mesa de canto legal",
                                            "cor": "clara",
                                            "dimensao": "20x40x90"
                                        }
segunda-feira, 13 de dezembro de 2010
cache + db
                                        bigdata & latência




segunda-feira, 13 de dezembro de 2010
Big Data



segunda-feira, 13 de dezembro de 2010
mas fora do #trendtopic...




                         1.000.000 tx/hora




                                             100tx/seg.


segunda-feira, 13 de dezembro de 2010
no início...


                               Código   Banco de Dados




segunda-feira, 13 de dezembro de 2010
depois...
                                        CACHE




                  Código                        Banco de Dados




segunda-feira, 13 de dezembro de 2010
Estrura de Dados:       Família de Colunas
                                            Durabilidade:            Réplica
                                                    Site:   http://cassandra.apache.org
                                              Escrito em:              Java

                                                          + Conceito Dynamo & Big-Table
                                        Pontos Positivos:        + Escalabilidade
                                                                  + Configuração



                                        Pontos Negativos:    Google: cassandra & digg




segunda-feira, 13 de dezembro de 2010
modelo




segunda-feira, 13 de dezembro de 2010
exemplo...

                                                        Keyspace: Keyspace1

                                                   Família de Colunas: Standard1
                                                      nome
                                         chave                  valor      timestamp
                                                    da coluna
                                        porcelli   telefone 1234-5678 1291325256       ...




segunda-feira, 13 de dezembro de 2010
final private CassandraClientPool pool;

         	     public CassandraSampleCode() {
         	     	 pool = CassandraClientPoolFactory.INSTANCE.get();
         	     }

         	     public void novoDado(String nomeUsuario, String telefone, String email) {
         	     	 CassandraClient client = null;
         	     	 try {
         	     	 	 client = pool.borrowClient("localhost", 9160);

         	     	     	     Keyspace keyspace = client.getKeyspace("Keyspace1");
         	     	     	     ColumnPath columnPath = new ColumnPath();
         	     	     	     columnPath.setColumn_family("Standard1");
         	     	     	     columnPath.setColumn(bytes("telefone"));
         	     	     	     keyspace.insert(nomeUsuario, columnPath, bytes(telefone));

         	     	     	 columnPath.setColumn(bytes("email"));
         	     	     	 keyspace.insert(nomeUsuario, columnPath, bytes(email));
         	     	     } finally {
         	     	     	 pool.releaseClient(client);
         	     	     }
         	     }




segunda-feira, 13 de dezembro de 2010
public String getTelefone(String nomeUsuario) {
                   	     	 CassandraClient client = null;
                   	     	 try {
                   	     	 	 client = pool.borrowClient("localhost", 9160);

                   	     	     	 Keyspace keyspace = client.getKeyspace("Keyspace1");
                   	     	     	 ColumnPath columnPath = new ColumnPath();
                   	     	     	 columnPath.setColumn_family("Standard1");
                   	     	     	 columnPath.setColumn(bytes("telefone"));
                   	     	     	 Column colValue = keyspace.getColumn(nomeUsuario, columnPath);
                   	     	     	 return string(colValue.getValue());
                   	     	     } catch (NotFoundException e) {
                   	     	     	 return null;
                   	     	     } finally {
                   	     	     	 pool.releaseClient(client);
                   	     	     }
                   	     }




segunda-feira, 13 de dezembro de 2010
public static void main(String[] args) throws Exception {
     	     	 CassandraSampleCode samp = new CassandraSampleCode();
     	     	 Assert.assertNull(samp.getTelefone("porcelli"));
     	     	 Assert.assertNull(samp.getEmail("porcelli"));
     	     	 samp.novoDado("porcelli", "+55 11 1234-5678", "alexandre.porcelli@gmail.com");
     	     	 Assert.assertEquals("+55 11 1234-5678", samp.getTelefone("porcelli"));
     	     	 Assert.assertEquals("alexandre.porcelli@gmail.com", samp.getEmail("porcelli"));
     	     }




segunda-feira, 13 de dezembro de 2010
busca


segunda-feira, 13 de dezembro de 2010
SELECT *
       FROM
        PRODUTO
       WHERE
       NOME LIKE “TE%”

segunda-feira, 13 de dezembro de 2010
segunda-feira, 13 de dezembro de 2010
Estrura de Dados:       Lista Invertida
                                            Durabilidade:         Single Node
                                                    Site:   http://lucene.apache.org
                                              Escrito em:            Java

                                                               + Baixa Latência
                                        Pontos Positivos:       + Durabilidade
                                                                   + Padrão



                                        Pontos Negativos:             o/




segunda-feira, 13 de dezembro de 2010
OLAP

                         On-line Analytical Processing is characterized by relatively low volume
                         of   transactions.  Queries   are  often   very  complex   and  involve
                         aggregations. For OLAP systems a response time is an effectiveness
                         measure. OLAP applications are widely used by Data Mining techniques.

segunda-feira, 13 de dezembro de 2010
segunda-feira, 13 de dezembro de 2010
persistência
     poliglota




segunda-feira, 13 de dezembro de 2010
quer saber mais?




segunda-feira, 13 de dezembro de 2010
Perguntas?

               @porcelli
segunda-feira, 13 de dezembro de 2010
Código Fonte                       https://github.com/porcelli/j1brasil-sample-code




segunda-feira, 13 de dezembro de 2010
Obrigado


                                        @porcelli

                                        github.com/porcelli

             about.me/porcelli          porcelli.com.br

                                        alexandre.porcelli@gmail.com

                                        linkedin.com/in/alexandreporcelli
segunda-feira, 13 de dezembro de 2010

Mais conteúdo relacionado

Mais procurados

Project coin pequenas mudanças grandes facilidades
Project coin pequenas mudanças grandes facilidadesProject coin pequenas mudanças grandes facilidades
Project coin pequenas mudanças grandes facilidades
Marcelo de Castro
 
POO - 14 - Vetores
POO - 14 - VetoresPOO - 14 - Vetores
POO - 14 - Vetores
Ludimila Monjardim Casagrande
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basico
Wemerson Silva
 
Java 07
Java 07Java 07
Java 07
samuelthiago
 
POO - 04 - Variávies em Java
POO - 04 - Variávies em JavaPOO - 04 - Variávies em Java
POO - 04 - Variávies em Java
Ludimila Monjardim Casagrande
 
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e OraclePassagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
André Reis
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
Maurício Linhares
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Elvis Rocha
 
POO - 12 - A Classe Object
POO - 12 - A Classe ObjectPOO - 12 - A Classe Object
POO - 12 - A Classe Object
Ludimila Monjardim Casagrande
 
Javascript
JavascriptJavascript
Javascript
Fernando Simeone
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2
irenescotolo
 
POO - 24 - Classes Básicas do Java - Datas
POO - 24 - Classes Básicas do Java - DatasPOO - 24 - Classes Básicas do Java - Datas
POO - 24 - Classes Básicas do Java - Datas
Ludimila Monjardim Casagrande
 
Refactoring
RefactoringRefactoring
Refactoring
Bruno Lui
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordida
Luciano Ramalho
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Tchelinux
 
Novidades java 7
Novidades java 7Novidades java 7
Novidades java 7
Wellington Pinheiro
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
Luciano Ramalho
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
Emerson Cardoso
 
Java 06
Java 06Java 06
Java 06
samuelthiago
 

Mais procurados (19)

Project coin pequenas mudanças grandes facilidades
Project coin pequenas mudanças grandes facilidadesProject coin pequenas mudanças grandes facilidades
Project coin pequenas mudanças grandes facilidades
 
POO - 14 - Vetores
POO - 14 - VetoresPOO - 14 - Vetores
POO - 14 - Vetores
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basico
 
Java 07
Java 07Java 07
Java 07
 
POO - 04 - Variávies em Java
POO - 04 - Variávies em JavaPOO - 04 - Variávies em Java
POO - 04 - Variávies em Java
 
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e OraclePassagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
 
POO - 12 - A Classe Object
POO - 12 - A Classe ObjectPOO - 12 - A Classe Object
POO - 12 - A Classe Object
 
Javascript
JavascriptJavascript
Javascript
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2
 
POO - 24 - Classes Básicas do Java - Datas
POO - 24 - Classes Básicas do Java - DatasPOO - 24 - Classes Básicas do Java - Datas
POO - 24 - Classes Básicas do Java - Datas
 
Refactoring
RefactoringRefactoring
Refactoring
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordida
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
 
Novidades java 7
Novidades java 7Novidades java 7
Novidades java 7
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
 
Java aprendendo linguagem.ppt
Java aprendendo linguagem.pptJava aprendendo linguagem.ppt
Java aprendendo linguagem.ppt
 
Java 06
Java 06Java 06
Java 06
 

Semelhante a J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java

Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
rafaelferreira
 
Floggy-GUJavaSC-2008-09-20
Floggy-GUJavaSC-2008-09-20Floggy-GUJavaSC-2008-09-20
Floggy-GUJavaSC-2008-09-20
Thiago Leão Moreira
 
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
Manuel Menezes de Sequeira
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
elliando dias
 
JQuery
JQuery JQuery
Floggy-IIBoot-2008-09-25
Floggy-IIBoot-2008-09-25Floggy-IIBoot-2008-09-25
Floggy-IIBoot-2008-09-25
Thiago Leão Moreira
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
Nelson Glauber Leal
 
One Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptOne Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScript
Loiane Groner
 
POO - 09 - Entradas e Saídas em Java
POO - 09 - Entradas e Saídas em JavaPOO - 09 - Entradas e Saídas em Java
POO - 09 - Entradas e Saídas em Java
Ludimila Monjardim Casagrande
 
Programação Concorrente - Aula 05
Programação Concorrente - Aula 05Programação Concorrente - Aula 05
Programação Concorrente - Aula 05
thomasdacosta
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
Henrique Fernandes
 

Semelhante a J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java (11)

Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
 
Floggy-GUJavaSC-2008-09-20
Floggy-GUJavaSC-2008-09-20Floggy-GUJavaSC-2008-09-20
Floggy-GUJavaSC-2008-09-20
 
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
JQuery
JQuery JQuery
JQuery
 
Floggy-IIBoot-2008-09-25
Floggy-IIBoot-2008-09-25Floggy-IIBoot-2008-09-25
Floggy-IIBoot-2008-09-25
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
One Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScriptOne Language to Rule Them All: TypeScript
One Language to Rule Them All: TypeScript
 
POO - 09 - Entradas e Saídas em Java
POO - 09 - Entradas e Saídas em JavaPOO - 09 - Entradas e Saídas em Java
POO - 09 - Entradas e Saídas em Java
 
Programação Concorrente - Aula 05
Programação Concorrente - Aula 05Programação Concorrente - Aula 05
Programação Concorrente - Aula 05
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 

Mais de Alexandre Porcelli

Dawn of the citizen developer
Dawn of the citizen developerDawn of the citizen developer
Dawn of the citizen developer
Alexandre Porcelli
 
Running rules and processes in the cloud
Running rules and processes in the cloudRunning rules and processes in the cloud
Running rules and processes in the cloud
Alexandre Porcelli
 
Impulsione sua carreira contribuindo para projetos open source
Impulsione sua carreira contribuindo para projetos open sourceImpulsione sua carreira contribuindo para projetos open source
Impulsione sua carreira contribuindo para projetos open source
Alexandre Porcelli
 
QConSP 2013 - Não confunda engenharia de software com lean startup
QConSP 2013 - Não confunda engenharia de software com lean startupQConSP 2013 - Não confunda engenharia de software com lean startup
QConSP 2013 - Não confunda engenharia de software com lean startup
Alexandre Porcelli
 
JUDCon São Paulo - Drools in a Nutshell
JUDCon São Paulo - Drools in a NutshellJUDCon São Paulo - Drools in a Nutshell
JUDCon São Paulo - Drools in a Nutshell
Alexandre Porcelli
 
NoSQL for the rest of us - a JBoss perspective over those hot tools and how y...
NoSQL for the rest of us - a JBoss perspective over those hot tools and how y...NoSQL for the rest of us - a JBoss perspective over those hot tools and how y...
NoSQL for the rest of us - a JBoss perspective over those hot tools and how y...
Alexandre Porcelli
 
Armazenamento de Dados em Poucas Palavras ou Uma resposta definitiva para tod...
Armazenamento de Dados em Poucas Palavras ou Uma resposta definitiva para tod...Armazenamento de Dados em Poucas Palavras ou Uma resposta definitiva para tod...
Armazenamento de Dados em Poucas Palavras ou Uma resposta definitiva para tod...
Alexandre Porcelli
 
DevinVale: SQL, noSQL ou newSQL - Onde armazenar meus dados?
DevinVale:  SQL, noSQL ou newSQL - Onde armazenar meus dados?DevinVale:  SQL, noSQL ou newSQL - Onde armazenar meus dados?
DevinVale: SQL, noSQL ou newSQL - Onde armazenar meus dados?
Alexandre Porcelli
 
noSQL e ORM, será que dá samba?
noSQL e ORM, será que dá samba?noSQL e ORM, será que dá samba?
noSQL e ORM, será que dá samba?
Alexandre Porcelli
 
noSQL - Uma nova escola de pensamento
noSQL - Uma nova escola de pensamentonoSQL - Uma nova escola de pensamento
noSQL - Uma nova escola de pensamento
Alexandre Porcelli
 
noSQL @ MSTechDay São Paulo
noSQL @ MSTechDay São PaulonoSQL @ MSTechDay São Paulo
noSQL @ MSTechDay São Paulo
Alexandre Porcelli
 
Integration & DSL
Integration & DSLIntegration & DSL
Integration & DSL
Alexandre Porcelli
 
SQL, NoSQL ou NewSQL: Onde armazenar meus dados?
SQL, NoSQL ou NewSQL: Onde armazenar meus dados?SQL, NoSQL ou NewSQL: Onde armazenar meus dados?
SQL, NoSQL ou NewSQL: Onde armazenar meus dados?
Alexandre Porcelli
 
A importância dos dados em sua arquitetura... uma visão muito além do SQL Ser...
A importância dos dados em sua arquitetura... uma visão muito além do SQL Ser...A importância dos dados em sua arquitetura... uma visão muito além do SQL Ser...
A importância dos dados em sua arquitetura... uma visão muito além do SQL Ser...
Alexandre Porcelli
 
noSQL WTF?! - Citi2010
noSQL WTF?! - Citi2010noSQL WTF?! - Citi2010
noSQL WTF?! - Citi2010
Alexandre Porcelli
 
noSQL @ QCon SP
noSQL @ QCon SPnoSQL @ QCon SP
noSQL @ QCon SP
Alexandre Porcelli
 
noSQL além do buzz
noSQL além do buzznoSQL além do buzz
noSQL além do buzz
Alexandre Porcelli
 
GraphDatabases @ TDC2010
GraphDatabases @ TDC2010GraphDatabases @ TDC2010
GraphDatabases @ TDC2010
Alexandre Porcelli
 
Motor de Regras @ TDC2010
Motor de Regras @ TDC2010Motor de Regras @ TDC2010
Motor de Regras @ TDC2010
Alexandre Porcelli
 
OpenSpotLight - Concepts
OpenSpotLight - ConceptsOpenSpotLight - Concepts
OpenSpotLight - Concepts
Alexandre Porcelli
 

Mais de Alexandre Porcelli (20)

Dawn of the citizen developer
Dawn of the citizen developerDawn of the citizen developer
Dawn of the citizen developer
 
Running rules and processes in the cloud
Running rules and processes in the cloudRunning rules and processes in the cloud
Running rules and processes in the cloud
 
Impulsione sua carreira contribuindo para projetos open source
Impulsione sua carreira contribuindo para projetos open sourceImpulsione sua carreira contribuindo para projetos open source
Impulsione sua carreira contribuindo para projetos open source
 
QConSP 2013 - Não confunda engenharia de software com lean startup
QConSP 2013 - Não confunda engenharia de software com lean startupQConSP 2013 - Não confunda engenharia de software com lean startup
QConSP 2013 - Não confunda engenharia de software com lean startup
 
JUDCon São Paulo - Drools in a Nutshell
JUDCon São Paulo - Drools in a NutshellJUDCon São Paulo - Drools in a Nutshell
JUDCon São Paulo - Drools in a Nutshell
 
NoSQL for the rest of us - a JBoss perspective over those hot tools and how y...
NoSQL for the rest of us - a JBoss perspective over those hot tools and how y...NoSQL for the rest of us - a JBoss perspective over those hot tools and how y...
NoSQL for the rest of us - a JBoss perspective over those hot tools and how y...
 
Armazenamento de Dados em Poucas Palavras ou Uma resposta definitiva para tod...
Armazenamento de Dados em Poucas Palavras ou Uma resposta definitiva para tod...Armazenamento de Dados em Poucas Palavras ou Uma resposta definitiva para tod...
Armazenamento de Dados em Poucas Palavras ou Uma resposta definitiva para tod...
 
DevinVale: SQL, noSQL ou newSQL - Onde armazenar meus dados?
DevinVale:  SQL, noSQL ou newSQL - Onde armazenar meus dados?DevinVale:  SQL, noSQL ou newSQL - Onde armazenar meus dados?
DevinVale: SQL, noSQL ou newSQL - Onde armazenar meus dados?
 
noSQL e ORM, será que dá samba?
noSQL e ORM, será que dá samba?noSQL e ORM, será que dá samba?
noSQL e ORM, será que dá samba?
 
noSQL - Uma nova escola de pensamento
noSQL - Uma nova escola de pensamentonoSQL - Uma nova escola de pensamento
noSQL - Uma nova escola de pensamento
 
noSQL @ MSTechDay São Paulo
noSQL @ MSTechDay São PaulonoSQL @ MSTechDay São Paulo
noSQL @ MSTechDay São Paulo
 
Integration & DSL
Integration & DSLIntegration & DSL
Integration & DSL
 
SQL, NoSQL ou NewSQL: Onde armazenar meus dados?
SQL, NoSQL ou NewSQL: Onde armazenar meus dados?SQL, NoSQL ou NewSQL: Onde armazenar meus dados?
SQL, NoSQL ou NewSQL: Onde armazenar meus dados?
 
A importância dos dados em sua arquitetura... uma visão muito além do SQL Ser...
A importância dos dados em sua arquitetura... uma visão muito além do SQL Ser...A importância dos dados em sua arquitetura... uma visão muito além do SQL Ser...
A importância dos dados em sua arquitetura... uma visão muito além do SQL Ser...
 
noSQL WTF?! - Citi2010
noSQL WTF?! - Citi2010noSQL WTF?! - Citi2010
noSQL WTF?! - Citi2010
 
noSQL @ QCon SP
noSQL @ QCon SPnoSQL @ QCon SP
noSQL @ QCon SP
 
noSQL além do buzz
noSQL além do buzznoSQL além do buzz
noSQL além do buzz
 
GraphDatabases @ TDC2010
GraphDatabases @ TDC2010GraphDatabases @ TDC2010
GraphDatabases @ TDC2010
 
Motor de Regras @ TDC2010
Motor de Regras @ TDC2010Motor de Regras @ TDC2010
Motor de Regras @ TDC2010
 
OpenSpotLight - Concepts
OpenSpotLight - ConceptsOpenSpotLight - Concepts
OpenSpotLight - Concepts
 

J1Brasil: Persistência de Dados além do JPA, ou Como usar noSQL em Java

  • 1. J1Brasil Persistência de Dados além do JPA, ou Como usar noSQL em Java Alexandre Porcelli alexandre.porcelli@gmail.com segunda-feira, 13 de dezembro de 2010
  • 2. Java One Brasil 2010 Alexandre Porcelli Founder Alexandre Porcelli Writer Alexandre Porcelli Organizer Alexandre Porcelli Commiter / Parser Developer Alexandre Porcelli Creator & Project Lead segunda-feira, 13 de dezembro de 2010
  • 3. JDBC segunda-feira, 13 de dezembro de 2010
  • 4. ! public class Pessoa { ComboPooledDataSource ds = new ComboPooledDataSource(); private int id; try { private String nome; ds.setDriverClass("com.mysql.jdbc.Driver"); O private String email; ds.setJdbcUrl("jdbc:mysql://localhost:3306/j1br"); private String telefone; ... ... } catch (PropertyVetoException e) { G } throw new RuntimeException(e); } I String nome = "Alexandre Porcelli"; String email = "alexandre.porcelli@gmail.com"; D String telefone = "+55 11 1234-5678"; Connection conn = null; Ó try { conn = ds.getConnection(); PreparedStatement st = conn.prepareStatement( C "INSERT INTO PESSOA (nome, email, telefone) VALUES (?, ?, ?)", Statement.RETURN_GENERATED_KEYS); st.setString(1, nome); st.setString(2, email); O st.setString(3, telefone); st.executeUpdate(); conn.commit(); T st.getGeneratedKeys().next(); I Pessoa novaPessoa = new Pessoa(st.getGeneratedKeys().getInt(1), nome, email, telefone); } catch (Exception e) { U throw new RuntimeException("Pessoa insert failed.", e); } finally { try { if (conn != null) { M conn.close(); } } catch (SQLException e) { throw new RuntimeException("Can't close connection", e); } } segunda-feira, 13 de dezembro de 2010
  • 5. JPA segunda-feira, 13 de dezembro de 2010
  • 6. @RunWith(Arquillian.class) @Entity public class PessoaTestCase { public class Pessoa { @Deployment @Id public static Archive<?> createDeployment() { @GeneratedValue return ShrinkWrap.create(WebArchive.class, "test.war") private int id; .addPackage(Game.class.getPackage()) private String nome; .addManifestResource("test-persistence.xml", "persistence.xml") private String email; .addWebResource(EmptyAsset.INSTANCE, "beans.xml"); private String telefone; } ... } @PersistenceContext EntityManager em; @Inject UserTransaction utx; @Test public void insertSampleRecords() throws Exception { utx.begin(); OK! em.joinTransaction(); Pessoa novaPessoa = new Pessoa(); novaPessoa.setNome("Alexandre Porcelli"); novaPessoa.setTelefone("+55 11 1234-5678"); novaPessoa.setEmail("alexandre.porcelli@gmail.com"); em.persist(novaPessoa); System.out.println(novaPessoa); utx.commit(); } } segunda-feira, 13 de dezembro de 2010
  • 7. noSQL segunda-feira, 13 de dezembro de 2010
  • 8. hype segunda-feira, 13 de dezembro de 2010
  • 9. segunda-feira, 13 de dezembro de 2010
  • 10. problemas do dia-a-dia segunda-feira, 13 de dezembro de 2010
  • 11. OLTP On-line Transaction Processing is characterized by a large number of short on-line transactions (INSERT, UPDATE, DELETE). The main emphasis for OLTP systems is put on very fast query processing, maintaining data integrity in multi-access environments and an effectiveness measured by number of transactions per second. segunda-feira, 13 de dezembro de 2010
  • 12. segurança autenticação segunda-feira, 13 de dezembro de 2010
  • 13. JAAS, LDAP, OAUTH... segunda-feira, 13 de dezembro de 2010
  • 14. public boolean isValid(String nomeUsuario, String passw) { PreparedStatement st; Connection conn = null; try { conn = dataSource.getConnection(); st = conn.prepareStatement("SELECT 1 FROM USERS WHERE id = ? and passw = ?"); st.setString(1, nomeUsuario); st.setString(2, passw); ResultSet rs = st.executeQuery(); if (rs.next()) { return true; } return false; } catch (SQLException e) { return false; } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e) { throw new RuntimeException("Can't close connection", e); } } } segunda-feira, 13 de dezembro de 2010
  • 15. Estrura de Dados: Chave-Valor Durabilidade: In-Memory / Serialização Paralela / Réplica Site: http://redis.io/ Escrito em: C + Baixa Latência + Serialização Paralela Pontos Positivos: + Estruturas de Dados + Cases Pontos Negativos: o/ segunda-feira, 13 de dezembro de 2010
  • 16. public class SegurancaRedisCode { public static void main(String[] args) { SegurancaRedisCode seg = new SegurancaRedisCode(); seg.addUserPassw("porcelli", "1234"); Assert.assertTrue(seg.isValid("porcelli", "1234")); Assert.assertFalse(seg.isValid("porcelli", "123")); Assert.assertFalse(seg.isValid("xxx", "1234")); } private final Jedis jedis; public SegurancaRedisCode() { jedis = new Jedis("localhost"); } public boolean isValid(String nomeUsuario, String passwd) { String correctPassw = jedis.get("user:" + nomeUsuario + ":passwd"); if (correctPassw != null && passwd.equals(correctPassw)) { return true; } else { return false; } } public void addUserPassw(String nomeUsuario, String passwd) { jedis.set("user:" + nomeUsuario + ":passwd", passwd); jedis.save(); } } segunda-feira, 13 de dezembro de 2010
  • 17. árvore segunda-feira, 13 de dezembro de 2010
  • 18. segunda-feira, 13 de dezembro de 2010
  • 19. @Entity @Table(name = "categorias") public class Categoria { @Id @GeneratedValue private Integer id; private String nome; @OneToMany @OrderColumn @JoinColumn(name = "parent_id") private List<Categoria> filhos = new LinkedList<Categoria>(); @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id", insertable = false, updatable = false) private Categoria parent; .... } segunda-feira, 13 de dezembro de 2010
  • 20. Estrura de Dados: Grafo Durabilidade: Single Node Site: http://neo4j.org Escrito em: Java + ACID + Maturidade Pontos Positivos: + Velocidade no Traverse + Suporte RDF & SPARQL Pontos Negativos: - Falta de Sharding segunda-feira, 13 de dezembro de 2010
  • 21. private static enum TipoRelacionamento implements RelationshipType { PAI } private final GraphDatabaseService graph; private static final String NEO4J_PATH = "sample/tree"; public Neo4jSampleCode() { graph = new EmbeddedGraphDatabase(NEO4J_PATH); } public Node novaCategoria(String nome, Node pai) { Transaction tx = graph.beginTx(); try { Node newCat = graph.createNode(); newCat.setProperty("nome", nome); if (pai != null) { pai.createRelationshipTo(newCat, TipoRelacionamento.PAI); } tx.success(); return newCat; } finally { tx.finish(); } } segunda-feira, 13 de dezembro de 2010
  • 22. public Node getPai(Node node) { Transaction tx = graph.beginTx(); Node result; try { Iterable<Relationship> relationships = node.getRelationships( TipoRelacionamento.PAI, Direction.INCOMING); if (relationships.iterator().hasNext()) { result = relationships.iterator().next().getStartNode(); } else { result = null; } tx.success(); return result; } finally { tx.finish(); } } segunda-feira, 13 de dezembro de 2010
  • 23. public List<Node> getFilhos(Node pai) { Transaction tx = graph.beginTx(); List<Node> result = new LinkedList<Node>(); try { Iterable<Relationship> relationships = pai.getRelationships( TipoRelacionamento.PAI, Direction.OUTGOING); for (Relationship relationship : relationships) { result.add(relationship.getEndNode()); } tx.success(); return result; } finally { tx.finish(); } } segunda-feira, 13 de dezembro de 2010
  • 24. public List<Node> getArvoreCompleta(Node pai) { Transaction tx = graph.beginTx(); List<Node> result = new LinkedList<Node>(); try { Traverser traverser = pai.traverse(Order.BREADTH_FIRST, StopEvaluator.END_OF_GRAPH, ReturnableEvaluator.ALL_BUT_START_NODE, TipoRelacionamento.PAI, Direction.OUTGOING); for (Node node : traverser) { result.add(node); } tx.success(); return result; } finally { tx.finish(); } } segunda-feira, 13 de dezembro de 2010
  • 25. public static void main(String[] args) { Neo4jSampleCode sample = new Neo4jSampleCode(); Node roupasCat = sample.novaCategoria("Vestuário", null); Node camisaCat = sample.novaCategoria("Camisas", roupasCat); Node calcasCat = sample.novaCategoria("Calças", roupasCat); Node eletronicosCat = sample.novaCategoria("Estronicos", null); Assert.assertNull(sample.getPai(eletronicosCat)); Assert.assertNotNull(sample.getPai(calcasCat)); Assert.assertEquals(sample.getPai(calcasCat), roupasCat); Assert.assertNotNull(sample.getPai(camisaCat)); Assert.assertEquals(sample.getPai(camisaCat), roupasCat); Assert.assertEquals(0, sample.getFilhos(camisaCat).size()); Assert.assertEquals(2, sample.getFilhos(roupasCat).size()); for (Node childCat : sample.getFilhos(roupasCat)) { if (!childCat.equals(camisaCat) && !childCat.equals(calcasCat)) { Assert.fail(); } } Node camisaMangaCurtaCat = sample.novaCategoria("Manga Curta", camisaCat); Node camisaMangaLongCat = sample.novaCategoria("Manga Longa", camisaCat); Assert.assertEquals(4, sample.getArvoreCompleta(roupasCat).size()); for (Node childCat : sample.getFilhos(roupasCat)) { if (!childCat.equals(camisaCat) && !childCat.equals(calcasCat) && !childCat.equals(camisaMangaLongCat) && !childCat.equals(camisaMangaCurtaCat)) { Assert.fail(); } } } segunda-feira, 13 de dezembro de 2010
  • 26. produtos diversidade & irregularidade segunda-feira, 13 de dezembro de 2010
  • 27. nome effective java tv led 32” mesa de madeira mod valor R$ 80 R$ 1234 R$ 503 um dos melhores livros descr. tv de led 32” muito boa! mesa de canto legal sobre java! qtd. páginas 300 X X técnico/tecnologia/ categoria X X programação/java cons. energia X A X cor X X marrom claro dimensão X X 20x40x90 segunda-feira, 13 de dezembro de 2010
  • 28. segunda-feira, 13 de dezembro de 2010
  • 29. ? oo ||relacional ? segunda-feira, 13 de dezembro de 2010
  • 30. Estrura de Dados: Documento Durabilidade: Réplica Site: http://mongodb.org Escrito em: C++ + Velocidade + Index Pontos Positivos: + Consultas ad-hoc + Auto Sharding - Durabilidade Pontos Negativos: - Update in Place Google: mongodb and fourquare segunda-feira, 13 de dezembro de 2010
  • 31. private final DB db; public MongoDBSampleCode() throws UnknownHostException, MongoException { Mongo mongo = new Mongo(); db = mongo.getDB("MeuDatabase"); db.getCollection("produtos").drop(); } public void novoEletronico(int id, String nome, int valor, String descricao, String consumoEnergia) { DBCollection coll = db.getCollection("produtos"); DBObject dados = new BasicDBObject(); dados.put("id", id); dados.put("nome", nome); dados.put("valor", valor); dados.put("tipo", "eletronico"); dados.put("desc", descricao); dados.put("cons_energia", consumoEnergia); coll.insert(dados); } segunda-feira, 13 de dezembro de 2010
  • 32. public void getProdutosPorValorMenorQue(int valor) { DBCollection coll = db.getCollection("produtos"); DBObject query = new BasicDBObject(); query.put("valor", new BasicDBObject("$lt", valor)); for (DBObject foundDoc : coll.find(query)) { System.out.println(foundDoc); } } segunda-feira, 13 de dezembro de 2010
  • 33. public static void main(String[] args) throws UnknownHostException, MongoException { MongoDBSampleCode samp = new MongoDBSampleCode(); samp.novoEletronico(1, "tvled32", 1234, "Tv de led 32"", "A"); samp.novoEletronico(2, "geladeira", 2030, "Geladeira Duas portas", "B"); samp.novoLivro(3, "effective java", 80, "um dos melhores livros sobre java!", "técnico/tecnologia/programação/java", 300); samp.novoLivro(4, "senhor dos anéis 2", 23, "clássico", "romance/ficção", 300); samp.novoMovel(5, "mesa de madeira", 503, "mesa de canto legal", "clara", "20x40x90"); samp.getProdutosPorValorMenorQue(600); } segunda-feira, 13 de dezembro de 2010
  • 34. { "id": 3, "nome": "effective java", "valor": 80, "tipo": "livro", "desc": "um dos melhores livros sobre java!", "categoria": "técnico/tecnologia/programação/java", "qtd_pgs": 300 } { "id": 4, "nome": "senhor dos anéis 2", "valor": 23, "tipo": "livro", "desc": "clássico", "categoria": "romance/ficção", "qtd_pgs": 300 } { "id": 5, "nome": "mesa de madeira", "valor": 503, "tipo": "movel", "desc": "mesa de canto legal", "cor": "clara", "dimensao": "20x40x90" } segunda-feira, 13 de dezembro de 2010
  • 35. cache + db bigdata & latência segunda-feira, 13 de dezembro de 2010
  • 36. Big Data segunda-feira, 13 de dezembro de 2010
  • 37. mas fora do #trendtopic... 1.000.000 tx/hora 100tx/seg. segunda-feira, 13 de dezembro de 2010
  • 38. no início... Código Banco de Dados segunda-feira, 13 de dezembro de 2010
  • 39. depois... CACHE Código Banco de Dados segunda-feira, 13 de dezembro de 2010
  • 40. Estrura de Dados: Família de Colunas Durabilidade: Réplica Site: http://cassandra.apache.org Escrito em: Java + Conceito Dynamo & Big-Table Pontos Positivos: + Escalabilidade + Configuração Pontos Negativos: Google: cassandra & digg segunda-feira, 13 de dezembro de 2010
  • 41. modelo segunda-feira, 13 de dezembro de 2010
  • 42. exemplo... Keyspace: Keyspace1 Família de Colunas: Standard1 nome chave valor timestamp da coluna porcelli telefone 1234-5678 1291325256 ... segunda-feira, 13 de dezembro de 2010
  • 43. final private CassandraClientPool pool; public CassandraSampleCode() { pool = CassandraClientPoolFactory.INSTANCE.get(); } public void novoDado(String nomeUsuario, String telefone, String email) { CassandraClient client = null; try { client = pool.borrowClient("localhost", 9160); Keyspace keyspace = client.getKeyspace("Keyspace1"); ColumnPath columnPath = new ColumnPath(); columnPath.setColumn_family("Standard1"); columnPath.setColumn(bytes("telefone")); keyspace.insert(nomeUsuario, columnPath, bytes(telefone)); columnPath.setColumn(bytes("email")); keyspace.insert(nomeUsuario, columnPath, bytes(email)); } finally { pool.releaseClient(client); } } segunda-feira, 13 de dezembro de 2010
  • 44. public String getTelefone(String nomeUsuario) { CassandraClient client = null; try { client = pool.borrowClient("localhost", 9160); Keyspace keyspace = client.getKeyspace("Keyspace1"); ColumnPath columnPath = new ColumnPath(); columnPath.setColumn_family("Standard1"); columnPath.setColumn(bytes("telefone")); Column colValue = keyspace.getColumn(nomeUsuario, columnPath); return string(colValue.getValue()); } catch (NotFoundException e) { return null; } finally { pool.releaseClient(client); } } segunda-feira, 13 de dezembro de 2010
  • 45. public static void main(String[] args) throws Exception { CassandraSampleCode samp = new CassandraSampleCode(); Assert.assertNull(samp.getTelefone("porcelli")); Assert.assertNull(samp.getEmail("porcelli")); samp.novoDado("porcelli", "+55 11 1234-5678", "alexandre.porcelli@gmail.com"); Assert.assertEquals("+55 11 1234-5678", samp.getTelefone("porcelli")); Assert.assertEquals("alexandre.porcelli@gmail.com", samp.getEmail("porcelli")); } segunda-feira, 13 de dezembro de 2010
  • 46. busca segunda-feira, 13 de dezembro de 2010
  • 47. SELECT * FROM PRODUTO WHERE NOME LIKE “TE%” segunda-feira, 13 de dezembro de 2010
  • 48. segunda-feira, 13 de dezembro de 2010
  • 49. Estrura de Dados: Lista Invertida Durabilidade: Single Node Site: http://lucene.apache.org Escrito em: Java + Baixa Latência Pontos Positivos: + Durabilidade + Padrão Pontos Negativos: o/ segunda-feira, 13 de dezembro de 2010
  • 50. OLAP On-line Analytical Processing is characterized by relatively low volume of transactions. Queries are often very complex and involve aggregations. For OLAP systems a response time is an effectiveness measure. OLAP applications are widely used by Data Mining techniques. segunda-feira, 13 de dezembro de 2010
  • 51. segunda-feira, 13 de dezembro de 2010
  • 52. persistência poliglota segunda-feira, 13 de dezembro de 2010
  • 53. quer saber mais? segunda-feira, 13 de dezembro de 2010
  • 54. Perguntas? @porcelli segunda-feira, 13 de dezembro de 2010
  • 55. Código Fonte https://github.com/porcelli/j1brasil-sample-code segunda-feira, 13 de dezembro de 2010
  • 56. Obrigado @porcelli github.com/porcelli about.me/porcelli porcelli.com.br alexandre.porcelli@gmail.com linkedin.com/in/alexandreporcelli segunda-feira, 13 de dezembro de 2010