Étiquette : Hibernate

Retours sur Devoxx France 2016 : le jeudi

Devoxx 2016

 

Le but de cet article est de vous présenter quelques conférences intéressantes que j’ai pu suivre cette année, le jeudi 21 avril 2016, au Devoxx France, afin de vous donner envie de les consulter par vous-même. Ces retours sont basés sur ma compréhension personnelle et mes souvenirs, il se peut donc que cela ne soit pas complet ou ne reflète pas complètement la réalité ! Les liens vers les conférences sont donnés à chaque fois pour vous permettre de juger par vous-même.

 

La médecine de demain youtube

Jean-Michel Billaut twitter

Cette première keynote de Devoxx 2016 a permis d’avoir un aperçu de ce que pourra être la médecine demain. Le séquençage de nos génomes devrait devenir un standard pour arriver à une médecine de précision; les traitements seront adaptés à notre organisme et ne seront plus génériques. Cela servira à évaluer notre état de santé et détecter plus en amont cancers et autres maladies. Le séquençage de génomes est déjà possible à l’étranger, mais illégal en France et puni par la loi. La France accuse donc un retard là-dessus. Des startups anglaises, américaines et chinoises ont déjà une grosse base commune de génomes à des fins d’analyses. Une startup chinoise est d’ailleurs déjà évaluée à un milliard de dollars dans ce domaine.
D’autres technologies pourront par exemple nous permettre d’analyser nos aliments en temps réel, d’en connaître leur composition et faire le lien avec notre génome et état de santé pour savoir s’il est recommandé de manger telle ou telle chose.

 

The impact of code in society youtube

Joel Spolsky twitter

Deuxième keynote de la journée. Un des fondateurs de Stack Overflow nous a fait réfléchir sur l’impact des développeurs sur notre vie quotidienne. La décision d’un développeur peut impacter des milliers de personnes, comment celles-ci vont se réveiller le matin, comment elles vont faire du sport… Mais aussi changer l’humeur des personnes. L’exemple de Facebook était évocateur. Facebook n’affiche pas toutes les publications de tous vos amis, un algorithme se charge d’en afficher une plutôt qu’une autre. Il revient donc aux développeurs notamment de choisir que montrer à l’utilisateur. Uniquement des publications qui le rendront heureux ? Et dans ce cas cacher l’annonce d’une maladie d’un ami ? Faut-il que Facebook affiche la photo de votre ex avec son/sa nouveau/nouvelle copain/copine ? Il y a des décisions morales à prendre qui impactent plus d’un milliard de personnes. De même, qu’est-ce qui empêcherait Facebook d’influencer l’opinion des gens et de prendre un parti politique en mettant plus en avant un certain candidat et ainsi lui apporter plus de voix ?
Un autre exemple est celui de l’employé Amazon qui déplace des cartons toute la journée dans un entrepôt, en suivant les instructions données par un logiciel. Celui-ci dicte les pas et « contrôle » en quelque sorte tous les jours des centaines d’employés.
En conclusion, nous ne passons pas 5 minutes sans utiliser un logiciel qui impacte notre vie, d’une certaine manière décidée par un développeur ou une société et cela n’ira qu’en empirant.

 

L’entrepreneuriat au féminin youtube

Natacha Quester-Séméon twitter

Dernière keynote de la journée, intéressante et orientée féministe. La speakeuse nous a parlé notamment de Ada Lovelace et Margaret Hamilton, deux femmes sans qui les langages de programmation n’auraient pas été inventés et l’homme n’aurait pas marché sur la lune. Elle nous a également parlé du collectif JamaisSansElles, qui soutient les femmes un peu à la manière du mouvement solidaire international HeForShe. JamaisSansElles a été initié par le club des gentlemen et toutes les personnes adhérant à ce mouvement s’engagent à ne plus participer à une réunion ou débat public s’il n’y a pas au moins une femme participante. Elle nous a parlé ensuite de l’association qu’elle a créée, Girl Power 3.0 qui est composée d’entrepreneuses et innovatrices.
Dans l’ensemble, elle nous a parlé de la place des femmes dans le milieu informatique, de la nécessité de les intégrer dans les projets, organisations et débats.

 

Java SE 8 pour les développeurs Java EE youtube

José Paumard twitter et David Delabassee twitter

Cette session été axée sur la présentation des fonctionnalités de Java SE 8 appliquées à Java EE 7, ce qu’il est possible d’utiliser et ce qui ne l’est pas. Je vous laisse consulter la vidéo pour en savoir plus, elle est agrémentée de nombreux exemples sur notamment la nouvelle API Date, les annotations multiples, la validation de Bean, les streams, etc.

 

Analyzing Images with Google’s Cloud Vision API Speaker Deck

Sara Robinson twitter

Présentation par une Américaine fan de Harry Potter. Elle nous a présenté les possibilités des API de Google, notamment de l’analyse d’images via du machine learning. Il est possible d’envoyer des images à Google et ceux-ci vont nous retourner un ensemble de tags qui décrivent la photo (c’est donc l’inverse de la recherche Google Images). Cette API est très puissante et capable par exemple de faire la différence entre la tour Eiffel de Paris et la réplique à Las Vegas. L’API peut également détecter les visages et l’humeur des personnes. Il y a également une API de speech qui retourne à partir d’un fichier audio le transcript de celui-ci.

 

Stack Overflow behind the scenes – how it’s made youtube

Oded Coster twitter

Un développeur de Stack Overflow nous a présenté leur architecture. Il nous a exposé quelques chiffres impressionnants (à retrouver ici), comme leurs seulement 4 serveurs SQL notamment avec entre 384Go et 768Go de RAM chacun. Ils ont une stack essentiellement Microsoft, mais leur philosophie est simple, ce qu’ils ont actuellement fonctionne très bien, donc pourquoi le changer. Si un jour, dans leurs expérimentations, ils trouvent quelque chose de plus adapté et qui fonctionne mieux pour eux, alors ils migreront. Il n’y a aucun intérêt de migrer juste pour migrer. Leurs 9 serveurs Web leur permettent de faire des mises en production sans downtime, vu qu’ils sont tous en load balancing.
De la même manière, une migration vers le cloud leur coûterait plus cher et il faudrait refaire complètement leur architecture, donc ils n’ont pas souhaité migrer et on gardé leur propre architecture.

 

Retours sur Java 8 youtube

Jean-Michel Doudoux twitter

La présentation était un petit tour des nouveautés de Java 8, avec des bonnes pratiques recommandées par le présentateur.
Par exemple, il est inutile de mettre des Optional de partout, cela ne fait qu’introduire de la complexité. Les Optional peuvent être évidemment utiles, mais cela ne sert à rien de les utiliser à tout prix.
Autre exemple, inutile de vouloir mettre des lambdas à tout bout de champ. Il faut plutôt essayer de faire uniquement des lambdas d’une seule instruction, sinon le débug peut devenir trop complexe. Dans l’ensemble, il faut faire en sorte de garder des instructions lisibles, quitte à sortir les 5 lignes de code d’une lambda dans une méthode à part.
Il faut également faire très attention à la possibilité de lancer des streams en parallèle. Même si le faire est très simple, dans la plupart des cas cela peut ralentir les traitements plutôt que les accélérer… Il ne faut pas hésiter à faire des tests de performance pour s’assurer que l’utilisation du parallel() est bénéfique.
D’autres points sont également abordés dans la conférence, je vous invite à regarder la rediffusion pour en savoir plus.

 

High-Performance Hibernate youtube

Vlad Mihalcea twitter

Présentation très intéressante et assez complexe sur l’utilisation d’Hibernate et comment en tirer un maximum de performances.
Il a parlé des différentes étapes d’une requête (temps d’acquisition de la connexion, logique d’accès aux données, temps de soumission, temps d’exécution, temps de récupération et temps d’inactivité avant release de la connexion) et ce qui peut être fait pour accélérer les traitements. Il a notamment évoqué l’utilisation des batchs insert et update, des relations entre les entités, de cache de données, des paramètres qui ont pu changer entre les différentes versions d’Hibernate, etc.
Le présentateur a d’ailleurs un blog sur lequel il a écrit un bon nombre d’articles sur le framework et un livre sur le sujet.

 

String Concatenation de 1 à 9 youtube

Remi Forax

La présentation a été menée par un maître de conférence à l’université Paris Est Marne-la-Vallée, développeur sur l’OpenJDK et expert JCP sur 3 JSR (invokedynamic, lambda et Jigsaw).
Le but de la présentation était de savoir comment concaténer des strings de manière la plus performante possible.
Après une analyse du bytecode et du code assembleur géré par la JVM, la conclusion contre toute attente était que le plus rapide, dans son cas présenté, est l’opérateur + et non le StringBuilder. Ceci à cause du JIT qui reconnaît certains patterns de code, certaines méthodes communes et les remplace à la volée par du code assembleur optimisé au runtime. Il nous a ainsi conseillé de coder comme la majorité des gens le font pour que le code soit reconnu par le JIT et soit plus performant. Dans l’ensemble, il est donc plutôt conseillé d’utiliser l’opérateur + pour des concaténations simples et le StringBuilder en cas de boucles, tout en gardant des instructions simples dans ce dernier (pas de i++, pas de Object.toString()), sinon les optimisations ne fonctionneront pas.
Il nous a ensuite expliqué que cela sera réglé avec Java 9 grâce notamment à son travail sur la JSR invokedynamic, mais que le comportement des strings risque d’être altéré. Il nous conseille donc dès maintenant de tester les early builds du JDK9 afin de voir s’il n’y a pas de régression et ainsi les reporter.

 

Modular monoliths youtube

Simon Brown twitter

Présentation discutant des architectures monolithiques et microservices. Le speakeur propose tout au long de la conférence une architecture orientée module, organisée par fonctionnalité plutôt que par service, ou DAO ou contrôleur… Selon sa présentation, cela règle la plupart des problèmes d’architecture qui surviennent au bout d’un moment sur les projets. Il a commencé la conférence par la phrase « Monolith are big balls of mud » et fini en disant que si on ne sait pas bien organiser un gros projet, un ensemble de petits projets ne sera pas mieux et ce n’est pas la solution. Sa phrase de fin était donc « Microservices are a distributed big ball of mud ».

 

Performance: Java vous déclare sa flamme youtube

Vincent Beretti twitter et Nicolas Peters twitter

Présentation sur comment débugger plus facilement des problèmes de performances sur des applications Java, ou autre, avec les Flame graphs. Ils ont présenté les outils créés par un développeur de chez Netflix (Brendan Gregg) spécialiste des Flame graphs, afin d’en générer depuis des threads dump. Ils ont pris un cas concret pendant leur présentation et ont analysé les problèmes de performances avec ces outils.

Introduction au framework Grails

Grails_logo

 

L’objectif de cet article et de ceux à venir est de vous présenter les avantages que peut vous apporter le framework Grails. Pourquoi, quand et comment l’utiliser ? Nous verrons cela par la suite.

 

 

Présentation de GRAILS

 

Grails est un framework web open source, de développement rapide, basé sur le langage Groovy, lui-même basé sur le langage Java.

Il utilise plusieurs principes qui permettent une haute productivité :

– Don’t Repeat Yourself (DRY) : le framework est basé sur le modèle MVC.

– Convention plutôt que configuration (Convention over configuration ou coding by convention) : Grails propose de nombreux comportements par défaut, vous n’aurez presque rien à configurer lors du développement de votre application. Par exemple, une classe dont le nom termine par « Controller » sera automatiquement considérée comme un contrôleur web.

– Architecture orientée modèle : pour réaliser une application basique, vous aurez uniquement à vous préoccuper de vos modèles. Les vues, les contrôleurs et les tests seront générés.

– Prototypage : Grails vous permet de générer vos vues, contrôleurs et tests à partir de vos modèles grâce à des méthodes de scaffolding. Vous pouvez ainsi obtenir une application de CRUD très rapidement. Vous pouvez également créer vos propres templates pour ajouter des fonctionnalités à la génération, ou simplement modifier l’apparence de votre application.

– Plugins : de nombreux plugins sont disponibles pour Grails. Ils vous permettront d’implémenter rapidement des fonctionnalités, telles que l’authentification avec le plugin Spring Security Core.

 

Historique

 

Le développement de Grails a été débuté en juillet 2005 par Graeme Rocher. Le framework était alors connu sous le nom de “Groovy on Rails”, car inspiré de “Ruby on Rails”. La première version (0.1) a été publiée le 29 mars 2006. Le même mois, il est renommé en “Grails” sous la demande du créateur de Ruby on Rails, David Heinemeier Hansson. Les principales versions suivantes sont:

 

[table id=1 /]

 

Peu après la sortie de la version 1.0, la société G2One (The Groovy Grails Company) est rachetée en novembre 2008 par SpringSource, elle-même rachetée en août 2009 par VMware.

 

Architecture

 

Grails utilise de nombreuses technologies existantes. Les principales sont :
– Le langage Groovy
– Hibernate
– Spring
– Sitemesh pour gérer la mise en page
– Le célèbre système de logging Log4J
– JUnit pour les tests unitaires

Celles-ci sont organisées comme montré ci-dessous :

architecture_grails

 

Toute application Grails est organisée en quatre parties : les domaines (les modèles), les services, les contrôleurs et les vues. Nous verrons plus en détail cette organisation par la suite avec un exemple d’application.

Les vues sont gérées par le framework SiteMesh, permettant notamment de créer des layouts, tandis que le cœur de Grails est géré par le framework Spring. La persistance des données est facilitée par GORM (Grails Object Relational Mapping). Celui-ci est basé sur Hibernate et utilise par défaut sa base de données intégrée HSQLDB, il permet de faire la relation entre les domaines et la base de données. Nous le verrons plus en détail dans un article suivant. Gant quant à lui est basé sur Ant, il sera utilisé notamment lorsque nous exécuterons une commande pour gérer Grails telle que « grails run-app ».

Pour terminer, tout objet de votre application pourra être développé soit en Java soit en Groovy. Dans les deux cas, votre objet sera compilé en bytecode et exécuté par la JVM.

 

Installation

 

Nous allons maintenant voir comment mettre en place un environnement de développement pour utiliser Grails.

Avant de commencer, il faut bien évidemment avoir installé un JDK (en version 1.6 ou supérieure), avoir configuré la variable d’environnement JAVA_HOME, pointant vers le dossier d’installation de votre JDK, et avoir ajouté le dossier bin/ du JDK à votre variable PATH.

Il existe plusieurs solutions pour utiliser le framework Grails. La première, la plus simple, consiste à télécharger l’IDE Groovy/Grails Tool Suite (GGTS). Il s’agit d’un environnement de développement basé sur Eclipse, tout comme Spring Tool Suite (STS). Il vous suffit ensuite d’extraire l’archive téléchargée, et de lancer GGTS.

Si vous possédez déjà STS, vous pouvez facilement installer le plugin Grails en suivant ces directives.

Si vous souhaitez utiliser Grails avec un autre IDE comme IntelliJ IDEANetBeans ou TextMate, nous vous laissons consulter la documentation officielle à ce propos.

 

Conclusion

 

Après cette présentation, vous pouvez déjà apercevoir les avantages que peut fournir Grails. Il utilise le langage moderne Groovy, le réputé framework Spring, de nombreux plugins, le principe de « coding by convention », le prototypage… Il s’agit d’un framework bien adapté au développement très rapide d’applications basiques, vous laissant en même temps la possibilité de réaliser des fonctionnalités bien plus avancées que du simple CRUD.

Dans les prochains articles, nous verrons plus en détail le fonctionnement du framework par un exemple d’application.

 

Sources

http://grails.org/

http://en.wikipedia.org/wiki/Grails_(framework)

http://www-igm.univ-mlv.fr/~dr/XPOSE2009/Groovy_and_Grails/grails_architecture.php

Sélection de colonnes dans Hibernate

 Liste avec seulement quelques colonnes dans Hibernate

Les outils d’ORM (Hibernate, Ibatis, …) sont aujourd’hui à maturité et ne souffrent plus des problèmes de performance des premières versions. Le code SQL généré, ainsi que la transformation en objets, ont été très largement optimisés.

Cependant selon la taille de la grappe d’objet remontée, il peut subsister des problèmes de performance, liés au nombre et à la complexité des objets à créer. Le cas d’utilisation typique sur une application de gestion est l’affichage d’une liste d’objet complexe sur un écran de recherche.

Prenons le cas par exemple d’une liste de commande (que nous simplifions volontairement) :

public Class Commande {

private Destination destination;

private Set<LigneCommande> lignes;

private Client client;

...

}
Une requête Criteria qui permet de remonter la liste des commandes ressemble à ceci :
DetachedCriteria criteria = DetachedCriteria.forClass(Commande.class,"commande")

.createAlias("commande.Destination", "destination", CriteriaSpecification.LEFT_JOIN)

.createAlias("commande.Lignes", "lignes", CriteriaSpecification.LEFT_JOIN)

.createAlias("commande.Client", "client", CriteriaSpecification.INNER_JOIN);

List<Commande> listCommande = getHibernateTemplate().findByCriteria(criteria);
Cette requête remonte donc tous les objets Commande (toutes les colonnes de la table correspondante), ainsi que les objets liés (et donc toutes les colonnes associées). Dans le cas où la grappe d’objets est importante et composée de nombreux objets, le nombre de lignes remontées devient très important et la constitution des objets très coûteuse  Rappelons que nous souhaitons simplement afficher une liste avec seulement quelques colonnes… au moins 95% des données remontées ne nous servent donc à rien.

Depuis la version 3 d’Hibernate a été introduite la notion de Projection. Celle-ci va nous permettre non seulement de remonter seulement les colonnes qui nous intéressent mais également une liste d’objets non gérés par Hibernate ; par exemple nous allons pouvoir remonter directement une liste de DTO (data transfert object) en se basant sur le même objet criteria (forClass(Commande.class, »commande »)) :

On définit le DTO :

public class DealListDto implements Serializable  {
    private static final long serialVersionUID = 1L;

    private java.lang.String id;
    private String ref;
    private Date date;
    private String nom;
    private String prenom;
    private String destNom;
    ...
}
puis les propriétés que l’on souhaite remonter, ainsi que le bean avec lequel on veut les mapper :
criteria.setProjection(Projections.projectionList()

.add(Property.forName("commande.Id"), "id")

.add(Property.forName("commande.Ref"), "ref")

.add(Property.forName("commande.Date"), "date")

.add(Property.forName("client.Nom"), "nom")

.add(Property.forName("client.Prenom"), "prenom")

.add(Property.forName("destination.nom"), "destNom")

.setResultTransformer( Transformers.aliasToBean(DealListDto.class));

List<DealListDto> listCommande = getHibernateTemplate().findByCriteria(criteria);
Nous obtenons donc une liste de DealListDto, beaucoup plus légers, que nous pouvons  faire remonter directement sur la couche client.

Hibernate : mapping d’une colonne en Set

Le mapping avec Hibernate

L’utilisation d’une relation many-to many avec hibernate permet de rendre transparent la table d’association.

Dans l’exemple suivant, la table EDITION_LIVRE sera mappée de manière transparente :
Livre Many Many Hibernate
La mapping de la table LIVRE sera le suivant :

‹set name="editions" table="EDITION_LIVRE"›
‹key column="LIVRE_ID" /›
‹many-to-many column="EDITION_ID" /›
‹/set›

Et Livre contiendra un Set<Edition>, mais l’objet EditionLivre n’existera pas…

A la vue de ce type de mapping, on peut être intéressé de faire la même chose pour un mapping many to one.
En effet, plutôt que de me retrouver avec un Set d’objet dont nous n’avons besoin que pour de l’affichage, nous préférerions avoir un Set de String. Par exemple, si on prend une relation de ce type :

Livre Set Hibernate
Et qu’on ne veut pas avoir à mapper l’objet LivreMotcle, il suffit de définir dans le fichier de mapping Livre le Set suivant :

‹set name=”mots" table="LIVRE_MOTCLE"›
‹key column="LIVRE_ID" /›
‹element column="MOT" type="string"/›
‹/set›

On obtient alors un Set<String> mots dans l’objet Livre.

Loading...
X