2010-07-05 4 views
1

Je travaille sur une interface Web vers une base de données. Le but est de créer un outil que les étudiants peuvent utiliser pour apprendre le SQL, émettre des requêtes et voir les résultats. Avant, j'utilisais la CLI. Ses principaux inconvénients sont les suivants: a) les étudiants sont de plus en plus habitués aux interfaces graphiques; et b) lorsque la requête renvoie une très grande table, elle est difficile à lire car elle est enroulée. Mon interface graphique Web est destinée à remédier à ces lacunes. J'utilise GWT en tant que client côté client et un backend de base de données PostgreSQL. GWT communique avec la base de données via un conteneur de servlets Java hébergé par Jetty ou Tomcat. L'utilisation du mécanisme RPC de GWT pour émettre des requêtes simples est assez facile. Cependant, je suis coincé sur la façon de gérer les transactions de longue durée. Pour que les étudiants comprennent mieux le comportement des transactions, j'ai besoin d'eux pour pouvoir émettre une instruction BEGIN, puis émettre une ou plusieurs requêtes, puis COMMIT ou ROLLBACK. Je voudrais qu'ils émettent manuellement les instructions BEGIN/COMMIT/ROLLBACK, ce qui signifie que la transaction peut être active pendant plusieurs minutes.GWT RPC: Utiliser la même connexion DB sur plusieurs requêtes

(Ceci ne doit pas être un serveur de base de données haute performance. Il est un outil pédagogique, donc je valorise l'expérience utilisateur sur la vitesse.)

Pour mettre en œuvre ce, je dois être assuré que par toute la transaction, le client sera attaché à la même connexion à la base de données. En utilisant des techniques traditionnelles (sans état), les connexions à la base de données sont éphémères ou groupées. Par conséquent, on ne peut jamais être sûr que la même connexion à la base de données sera utilisée pour plusieurs requêtes. Je crains d'être un peu nouveau dans les servlets Java, j'ai donc plusieurs questions à poser. D'abord et avant tout, y a-t-il un mécanisme existant pour ouvrir une connexion à une base de données et l'utiliser sur une session utilisateur entière? Deuxièmement, je pensais à créer un processus serveur léger avec lequel la servlet communique. Le processus serveur va faire correspondre les identifiants de session avec une connexion de base de données active et attacher le client à celui qui convient. Ainsi, le serveur léger maintient la connexion à la base de données elle-même et persiste jusqu'à ce que l'utilisateur se déconnecte - tout comme le CLI le ferait. Est-ce que quelque chose comme ça existe déjà?

Répondre

3

Les servlets Java conservent un objet HttpSession pour chaque session utilisateur. Chaque objet de session possède une carte à clé de chaîne que vous pouvez utiliser pour attacher des objets Java arbitraires (par exemple, une connexion SQL) à la session. Dans votre cas, je récupérerais l'objet de connexion pour chaque requête comme ceci:

// getThreadLocalRequest is a member of GWT's RemoteServiceServlet 
HttpSession session = getThreadLocalRequest().getSession(); 
Connection connection = (Connection)session.getAttribute("connection"); 

if (connection == null) { 
    // I'll leave it to you to implement createConnection 
    final Connection c = createConnection(); 
    connection = c; 

    session.setAttribute("connection", connection); 
    session.setAttribute("expiryListener", new HttpSessionBindingListener() { 
     public void valueBound(HttpSessionBindingEvent e) {} 

     // This method will be called when the user's session expires 
     public void valueUnbound(HttpSessionBindingEvent e) { 
      c.close(); 
     } 
    }); 
} 

// connection is ready to use! 
Statement statement = connection.createStatement(); 
Questions connexes