Come devo connettermi al database JDBC / origine dati in un’applicazione basata su servlet?

Ho un server MySQL esterno configurato e funzionante. Ho creato una connessione al database in Eclipse e posso visualizzare il database nella scheda Explorer origine dati.

Ora, ho un servlet che deve accedere a quel database. Come lo faccio? C’è un modo per fare riferimento a quella connessione al database creata nell’origine dati explorer, o devo definire tutto due volte?

Inoltre, qual è il modo migliore per aprire la connessione? Ho incluso il file mysql-connector-java-5.1.11-bin.jar , e ho trovato due metodi che funzionano:

 MysqlDataSource d = new MysqlDataSource(); d.setUser("user"); d.setPassword("pass"); d.setServerName("hostname.com"); d.setDatabaseName("db"); Connection c = d.getConnection(); 

e

 Connection c = DriverManager.getConnection("jdbc:mysql://hostname.com/db","user","pass"); 

Nessuno dei due è ottimale, perché prima di tutto usano entrambi le stringhe codificate per tutto. Questo è un progetto di app Web Java EE, quindi c’è un buon posto dove mettere i dati di connessione? O c’è un modo per rinunciare a tutto questo e basta usare la connessione nell’origine dati explorer?

Una pratica comune è configurarla come un DataSource nel contenitore servlet in questione. Fornirà servizi di pool di connessioni che miglioreranno notevolmente le prestazioni. Inoltre, è prassi comune esternalizzare le impostazioni raw in alcuni file di configurazione che sono stati collocati nel classpath.

Se si utilizza Tomcat come servlet container, è necessario configurare l’origine dati secondo la relativa documentazione JNDI . Vedrai che ci sono diversi modi. Il modo più semplice è creare un /META-INF/context.xml nel contenuto web del tuo progetto web dinamico (per essere chiari, il /META-INF è allo stesso livello di /WEB-INF della webapp) e riempirlo con qualcosa come:

     

Ciò significa che il server Tomcat dovrebbe creare un’origine dati con il nome JNDI jdbc/db con un massimo di 100 connessioni attive, un massimo di 30 connessioni inattive e un tempo di attesa massimo di 10000 millisecondi prima che una connessione debba essere restituita dall’applicazione (in realtà : chiuso dall’applicazione, quindi l’applicazione ha 10 secondi di tempo tra l’acquisizione della connessione e la chiusura della connessione). Il resto delle impostazioni dovrebbe essere familiare e abbastanza esplicativo per te; quelle sono le impostazioni JDBC.

Infine, nel tuo progetto web, modifica il file /WEB-INF/web.xml per aggiungere la seguente voce:

  jdbc/db javax.sql.DataSource  

Ciò significa che l’applicazione web dovrebbe utilizzare l’origine dati fornita dal server con il nome jdbc/db .

Quindi cambia il tuo gestore delle connessioni con qualcosa del genere:

 private DataSource dataSource; public Database(String jndiname) { try { dataSource = (DataSource) new InitialContext().lookup("java:comp/env/" + jndiname); } catch (NamingException e) { // Handle error that it's not configured in JNDI. throw new IllegalStateException(jndiname + " is missing in JNDI!", e); } } public Connection getConnection() { return dataSource.getConnection(); } 

..e sostituire tutte le Class.forName(driver) dal new Database("jdbc/db") e sostituire tutte le chiamate DriverManager.getConnection() da database.getConnection() . È ansible se necessario ottenere il valore jdbc/db da qualche file di configurazione ( file delle proprietà? ).

In alternativa, iniettare DataSource tramite l’annotazione @Resource all’interno di una @Resource gestita dal contenitore, ad esempio una class servlet @WebServlet :

 @Resource("jdbc/db") private DataSource dataSource; 

Questo dovrebbe essere. Basta distribuire la tua applicazione web con le modifiche precedenti ed eseguirla. Non dimenticare di posizionare il driver JDBC del database in Tomcat/lib o di aggiungere il suo percorso alla proprietà shared.loader di Tomcat/conf/catalina.properties , poiché la responsabilità del caricamento del driver JDBC viene ora spostata dall’applicazione web a il server. Per ulteriori suggerimenti e altri esempi di JDBC / JNDI di base potresti trovare utile questo articolo .

Guarda anche:

  • Come installare il driver JDBC nel progetto Web Eclipse senza affrontare java.lang.ClassNotFoundexception
  • Dove devo posizionare il driver JDBC per il pool di connessione di Tomcat?
  • È sicuro utilizzare un’istanza java.sql.Connection statica in un sistema con multithreading?
  • Mostra JDBC ResultSet in HTML nella pagina JSP usando pattern MVC e DAO
  • Come recuperare e visualizzare le immagini da un database in una pagina JSP?

È ansible impostare un’origine dati in qualsiasi app server su cui si sta distribuendo il WAR e recuperare un riferimento ad esso con JNDI. Oppure puoi impacchettare il tuo WAR in un EAR e definire l’origine dati nel file data-sources.xml dell’EAR (e recuperare un riferimento ad esso con JNDI).