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 .
È 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).