web-dev-qa-db-fra.com

Comment configurer manuellement une source de données en Java?

J'essaie de suivre le didacticiel JDBC de Sun sur http://Java.Sun.com/docs/books/tutorial/jdbc/basics/connecting.html

Il donne l'exemple de code suivant:

DataSource ds = (DataSource) org.Apache.derby.jdbc.ClientDataSource()
ds.setPort(1527);
ds.setHost("localhost");
ds.setUser("APP")
ds.setPassword("APP");

Connection con = ds.getConnection();

Ce code ne se compile pas car l'interface DataSource n'a aucune de ces méthodes, à l'exception de la méthode getConnection() invoquée en dernier.

(Voici le javadoc: http://Java.Sun.com/javase/6/docs/api/javax/sql/DataSource.html )

Qu'est-ce que je rate?

Edit: J'essaie actuellement de me connecter à MySQL (com.mysql.jdbc) Et je ne trouve pas le javadoc pour cela. J'accepte une réponse qui m'indique soit:

1) documentation pour com.mysql.jdbc Concernant un DataSource que je peux comprendre, ou

2) donne un exemple à suivre pour ce que le code du tutoriel devrait être, pour n'importe quelle base de données.

43
Eric Wilson

Fondamentalement, dans JDBC, la plupart de ces propriétés ne sont pas configurables dans l'API comme ça, elles dépendent plutôt de l'implémentation. La façon dont JDBC gère cela est de permettre que l'URL de connexion soit différente par fournisseur.

Donc, ce que vous faites est d'enregistrer le pilote afin que le système JDBC puisse savoir quoi faire avec l'URL:

 DriverManager.registerDriver((Driver) Class.forName("com.mysql.jdbc.Driver").newInstance());

Ensuite, vous formez l'URL:

 String url = "jdbc:mysql://[Host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]"

Et enfin, utilisez-le pour obtenir une connexion:

 Connection c = DriverManager.getConnection(url);

Dans JDBC plus sophistiqué, vous vous impliquez dans les pools de connexions et autres, et les serveurs d'applications ont souvent leur propre façon d'enregistrer les pilotes dans JNDI et vous recherchez une DataSource à partir de là, et appelez getConnection dessus.

En ce qui concerne les propriétés prises en charge par MySQL, voir ici .

EDIT: Une autre pensée, techniquement, avoir juste une ligne de code qui fait Class.forName ("com.mysql.jdbc.Driver") devrait être suffisant, car la classe devrait avoir son propre initialiseur statique qui enregistre une version, mais parfois un Le pilote JDBC ne le fait pas, donc si vous n'êtes pas sûr, il y a peu de mal à en enregistrer un deuxième, il crée simplement un objet en double dans la mémoire.

20
Yishai

Une chose que vous voudrez peut-être examiner est le projet Commons DBCP . Il fournit un BasicDataSource qui est configuré de manière assez similaire à votre exemple. Pour l'utiliser, vous avez besoin du JAR JDBC du fournisseur de base de données dans votre chemin de classe et vous devez spécifier le nom de classe de pilote du fournisseur et l'URL de la base de données au format approprié.

Modifier:

Si vous souhaitez configurer un BasicDataSource pour MySQL, vous feriez quelque chose comme ceci:

BasicDataSource dataSource = new BasicDataSource();

dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("username");
dataSource.setPassword("password");
dataSource.setUrl("jdbc:mysql://<Host>:<port>/<database>");
dataSource.setMaxActive(10);
dataSource.setMaxIdle(5);
dataSource.setInitialSize(5);
dataSource.setValidationQuery("SELECT 1");

Le code qui a besoin d'un DataSource peut alors l'utiliser.

126
ColinD

DataSource est spécifique au fournisseur, pour MySql vous pouvez utiliser MysqlDataSource qui est fourni dans le pot de connecteur MySql Java Java:

    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setDatabaseName("xyz");
    dataSource.setUser("xyz");
    dataSource.setPassword("xyz");
    dataSource.setServerName("xyz.yourdomain.com");
20
Luke

utilisez MYSQL comme exemple: 1) utilisez des pools de connexion à la base de données: pour l'exemple: Apache Commons DBCP, vous avez également besoin du package jar basicDataSource dans votre chemin de classe

@Bean
public BasicDataSource dataSource() {
    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost:3306/gene");
    ds.setUsername("root");
    ds.setPassword("root");
    return ds;
}

2) utilisez le pilote basé sur JDBC, il est généralement utilisé si vous ne considérez pas le pool de connexions:

@Bean
public DataSource dataSource(){
    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUrl("jdbc:mysql://localhost:3306/gene");
    ds.setUsername("root");
    ds.setPassword("root");
    return ds;
}
3
Fujian lin

Je pense que l'exemple est faux - javax.sql.DataSource n'a pas non plus ces propriétés. Votre DataSource doit être du type org.Apache.derby.jdbc.ClientDataSource, qui devrait avoir ces propriétés.

2
Vinay Sajip

Le javadoc pour DataSource auquel vous faites référence est du mauvais package. Vous devriez regarder javax.sql.DataSource . Comme vous pouvez le voir, c'est une interface. La configuration de l'hôte et du nom de port dépend de l'implémentation, c'est-à-dire du pilote JDBC que vous utilisez.

Je n'ai pas vérifié les javadocs Derby mais je suppose que le code devrait compiler comme ceci:

ClientDataSource ds = org.Apache.derby.jdbc.ClientDataSource()
ds.setHost etc....
1
Kees de Kooter