web-dev-qa-db-fra.com

Comment dois-je me connecter à la base de données / source de données JDBC dans une application basée sur un servlet?

J'ai un serveur MySQL externe qui est configuré et fonctionne correctement. J'ai créé une connexion à la base de données dans Eclipse et je peux afficher la base de données dans l'onglet Explorateur de sources de données.

Maintenant, j'ai un servlet qui doit accéder à cette base de données. Comment fait-on ça? Existe-t-il un moyen de référencer cette connexion à la base de données créée dans l'explorateur de sources de données, ou dois-je tout définir deux fois?

De plus, quelle est la meilleure façon d'ouvrir la connexion? J'ai le mysql-connector-Java-5.1.11-bin.jar fichier inclus, et j'ai trouvé deux méthodes qui fonctionnent:

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

et

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

Ni l'un ni l'autre n'est optimal, car tout d'abord, ils utilisent tous les deux des chaînes codées en dur pour tout. Il s'agit d'un projet d'application web Java EE, donc y a-t-il un bon endroit pour mettre les données de connexion? Ou existe-t-il un moyen de renoncer à tout cela et d'utiliser simplement la connexion dans l'explorateur de source de données?

20
Ed Marty

Une pratique courante consiste à configurer ceci comme DataSource dans le conteneur de servlet en question. Il vous fournira des installations de mise en commun des connexions qui amélioreront considérablement les performances. Une pratique courante consiste également à externaliser les paramètres bruts dans un fichier de configuration qui a été placé dans le chemin de classe.

Dans le cas où vous utilisez Tomcat comme conteneur de servlet, vous devez configurer la source de données conformément à son documentation JNDI . Vous verrez qu'il y a plusieurs façons. Le moyen le plus simple consiste à créer un /META-INF/context.xml Dans le contenu Web de votre projet Web dynamique (pour être clair, le /META-INF Est au même niveau que le /WEB-INF De la webapp) et remplissez-le avec quelque chose comme:

<?xml version="1.0" encoding="UTF-8"?>

<Context>
    <Resource
        name="jdbc/db" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000" 
        url="jdbc:mysql://hostname.com/db"
        driverClassName="com.mysql.jdbc.Driver"
        username="user" password="pass"
    />
</Context>

Cela signifie en gros que le serveur Tomcat doit créer une source de données avec le nom JNDI jdbc/db Avec un maximum de 100 connexions actives, un maximum de 30 connexions inactives et un temps d'attente maximal de 10000 millisecondes avant qu'une connexion ne soit renvoyée de votre application (en fait: fermée par votre application, votre application dispose donc de 10 secondes entre l'acquisition de la connexion et la fermeture de la connexion). Le reste des paramètres doit vous être familier et suffisamment explicite; ce sont les paramètres JDBC.

Enfin dans votre projet web, éditez le fichier /WEB-INF/web.xml Pour ajouter l'entrée suivante:

<resource-env-ref>
    <resource-env-ref-name>jdbc/db</resource-env-ref-name>
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>

Cela signifie en gros que l'application Web doit utiliser la source de données fournie par le serveur avec le nom jdbc/db.

Ensuite, changez votre gestionnaire de connexions pour quelque chose comme ceci:

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();
}

..et remplacer tous les appels Class.forName(driver) par new Database("jdbc/db") et remplacer tous les appels DriverManager.getConnection() par database.getConnection(). Vous pouvez si nécessaire obtenir la valeur jdbc/db À partir d'un fichier de configuration ( Fichier de propriétés? ).

Vous pouvez également injecter DataSource via l'annotation @Resource à l'intérieur d'un artefact géré par conteneur, tel qu'une classe de servlet @WebServlet :

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

Ça devrait être ça. Déployez simplement votre application Web avec les modifications ci-dessus et exécutez-la. N'oubliez pas de placer le pilote JDBC de la base de données dans Tomcat/lib Ou d'ajouter son chemin d'accès à la propriété shared.loader De Tomcat/conf/catalina.properties, Car la responsabilité du chargement du pilote JDBC est désormais déplacé de l'application Web vers le serveur. Pour plus de conseils et d'autres exemples de base JDBC/JNDI, vous pouvez également trouver cet article utile.

Voir également:

42
BalusC

Vous pouvez configurer une source de données sur le serveur d'applications sur lequel vous déployez votre WAR et y récupérer une référence avec JNDI. Ou vous pouvez empaqueter votre WAR dans un EAR et définir la source de données dans le fichier data-sources.xml de l'EAR (et y chercher une référence avec JNDI).

3
Voytek Jarnot