Comment me connecter à la base de données JDBC / datasource dans une application basée sur servlet?

j'ai un serveur MySQL externe qui est configuré et fonctionne très bien. J'ai créé une connexion de base de données dans Eclipse et je peux voir 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 dois-je faire? Y a-t-il un moyen de faire référence à la connexion de base de données créée dans l'Explorateur de sources de données, ou dois-je tout définir deux fois?

Aussi, quelle est la meilleure façon d'ouvrir le lien? J'ai j'ai le fichier mysql-connector-java-5.1.11-bin.jar 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, parce que tout d'abord, ils utilisent tous les deux des chaînes codées dur pour tout. C'est un projet D'application Web Java EE, donc y a-t-il un bon endroit pour mettre des données de connexion? Ou y a-t-il un moyen de tout oublier et d'utiliser la connexion dans l'Explorateur de sources de données?

18
demandé sur BalusC 2010-02-19 23:52:47

2 réponses

une pratique courante consiste à le configurer comme un DataSource dans le servlet container en question. Il vous fournira des installations de mise en commun de connexion qui amélioreront considérablement les performances. Une autre pratique courante est d'externaliser les paramètres bruts dans un fichier de configuration qui est placé dans classpath.

dans le cas où vous utilisez Tomcat comme servletcontainer, vous devez configurer la source de données selon sa documentation JNDI . Vous verrez qu'il ya plusieurs façons. La manière la plus simple est de créer un /META-INF/context.xml dans le webcontent de votre projet web dynamique (pour être clair ,le /META-INF est au même niveau que le /WEB-INF de la webapp) et le remplir 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 Tomcat server devrait 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 maximum de 10000 millisecondes avant qu'une connexion ne soit renvoyée de votre application (en fait: fermé par votre application, de sorte que votre application a 10 secondes entre l'acquisition de la connexion et la fermeture de la connexion). Le reste des paramètres devrait vous être familier et vous expliquer suffisamment; ce sont les paramètres JDBC.

enfin dans votre web projet, modifier le fichier /WEB-INF/web.xml pour ajouter la ligne 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 devrait utiliser la source de données fournie par le serveur avec le nom jdbc/db .

alors changez votre gestionnaire de connexion en 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? ).

alternativement, injecter le DataSource via le @Resource annotation à l'intérieur d'un conteneur géré artefact, tel que @WebServlet classe de servlet:

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

ça devrait être ça. Il suffit de déployer votre application Web avec les modifications ci-dessus et de l'exécuter. Ne pas oubliez de placer le pilote de base de données JDBC dans le Tomcat/lib ou d'ajouter son chemin à la propriété shared.loader de Tomcat/conf/catalina.properties , parce que la responsabilité du chargement du pilote JDBC est maintenant déplacée de l'application web au serveur. Pour plus de conseils et d'autres exemples de base JDBC/JNDI vous pouvez trouver cet article utile aussi bien.

voir aussi:

40
répondu BalusC 2017-05-23 12:25:39

vous pouvez configurer une source de données dans n'importe quel serveur app sur lequel vous déployez votre guerre et récupérer une référence avec JNDI. Ou vous pouvez empaqueter votre guerre dans une oreille et définir la source de données dans les sources de données de l'oreille.fichier xml (et récupérez une référence avec JNDI).

3
répondu Voytek Jarnot 2010-02-19 21:10:44