2009-08-26 4 views
34

Ich versuche Sun JDBC-Tutorial auf http://java.sun.com/docs/books/tutorial/jdbc/basics/connecting.htmlWie konfiguriere ich manuell eine DataSource in Java?

Es gibt den folgenden Beispielcode zu folgen:

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

Connection con = ds.getConnection(); 

Dieser Code kompiliert nicht, weil die DataSource Schnittstelle keine dieser Methoden hat, mit Ausnahme der getConnection() Zuletzt aufgerufene Methode.

(Hier ist der javadoc: http://java.sun.com/javase/6/docs/api/javax/sql/DataSource.html)

Was bin ich?

Edit: Ich bin eigentlich zu MySQL verbinden versuchen (com.mysql.jdbc) und ich kann die javadoc für das nicht finden. Ich werde eine Antwort akzeptieren, die mich verweist auf entweder:

1) Dokumentation für com.mysql.jdbc in Bezug auf eine DataSource, die ich verstehen kann, oder

2) gibt ein Beispiel zu folgen, was der Code des Tutorial sollte sein , für jede Datenbank.

+0

Hier sind ein paar Beispiele: http://www.tugay.biz/2016/09/hikaricp-hello-world.html http://www.tugay.biz/2016/09/bonecp-hello world.html http://www.tugay.biz/2016/07/tomcat-connection-pool-vs-apache.html –

Antwort

17

Grundsätzlich sind in JDBC die meisten dieser Eigenschaften in der API nicht konfigurierbar, sondern hängen von der Implementierung ab. Die Art und Weise, wie JDBC dies behandelt, besteht darin, dass die Verbindungs-URL für jeden Anbieter unterschiedlich ist.

Also, was Sie tun, ist der Fahrer registrieren, so dass das System JDBC kann wissen, was mit der URL zu tun:

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

Dann bilden Sie die URL:

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

Und schließlich Nutzung es eine Verbindung zu bekommen:

Connection c = DriverManager.getConnection(url); 

In anspruchsvolleren JDBC, erhalten Sie mit Verbindungspools beteiligt und Ähnliches und Anwendungsserver haben ihre eigene Art, Treiber in JNDI zu registrieren, und Sie suchen dort eine DataSource auf und rufen getConnection darauf auf.

In Bezug auf welche Eigenschaften MySQL unterstützt, siehe here.

EDIT: Ein weiterer Gedanke, technisch nur mit einer Codezeile, die Class.forName ("com.mysql.jdbc.Driver") sollte genug sein, da die Klasse einen eigenen statischen Initialisierer haben sollte, der eine Version registriert , aber manchmal ein JDBC-Treiber nicht, also, wenn Sie nicht sicher sind, ist es wenig schaden, eine zweite zu registrieren, es erstellt nur ein doppeltes Objekt in Memoreory.

+0

Nun, das funktioniert. Ich wollte die DataSource, wie im Tutorial angegeben, dass es bevorzugt wird, aber ich nehme es. –

+10

DataSource ist wirklich für Anwendungsserver und andere Container, die einen JNDI-Dienst bereitstellen. Ohne einen JNDI-Dienst machen sie keinen Sinn und das Tutorial ist ehrlich gesagt nicht wirklich gut in diesem Punkt geschrieben. – Yishai

+0

Sie können Ihre eigene Klasse erstellen, um die DataSource-Schnittstelle mit dem obigen Code für die getConnection-Methoden zu implementieren. Darüber hinaus müssen Sie nur Getter und Setter für loginTimeout und LogWriter implementieren. – GregA100k

1

Das Javadoc für DataSource, auf das Sie sich beziehen, ist das falsche Paket. Sie sollten sich javax.sql.DataSource ansehen. Wie Sie sehen können, ist dies eine Schnittstelle. Die Konfiguration des Host- und Portnamens hängt von der Implementierung ab, d. H. Dem von Ihnen verwendeten JDBC-Treiber.

Ich habe nicht die Derby javadocs überprüft, aber ich nehme an, die Code wie folgt zusammenstellen sollte:

ClientDataSource ds = org.apache.derby.jdbc.ClientDataSource() 
ds.setHost etc.... 
2

Ich denke, das Beispiel falsch ist - javax.sql.DataSource diese Eigenschaften nicht haben entweder. Ihre DataSource muss vom Typ org.apache.derby.jdbc.ClientDataSource sein, die sollte diese Eigenschaften haben.

119

Eine Sache, die Sie sich ansehen möchten, ist das Projekt Commons DBCP. Es bietet eine BasicDataSource, die ähnlich wie Ihr Beispiel konfiguriert ist. Um dies zu verwenden, benötigen Sie die JDBC-JAR des Datenbankherstellers in Ihrem Klassenpfad, und Sie müssen den Treiberklassennamen des Herstellers und die Datenbank-URL im richtigen Format angeben.

Edit:

Wenn Sie eine BasicDataSource für MySQL konfigurieren möchten, würden Sie so etwas tun:

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"); 

Code, der dann verwenden, kann ein DataSource benötigt.

+0

Ich benutzte diesen Beitrag, um Unit-Tests zu erstellen –

+0

Danke haps .... xml machte meinen Kopf in .... –

16

Datasource ist herstellerspezifisch, für MySql Sie MysqlDataSource verwenden könnte, die in der MySql Java-Anschluss jar vorgesehen ist:

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

Wenn Sie eine Frage beantworten werden, die vor 4,5 Jahren gestellt wurde Es wäre gut anzugeben, warum die derzeitigen Antworten nicht ausreichen. –

+8

Anders als die offiziell akzeptierte Antwort, richtet sich diese direkt an die Frage. Danke @Luke. – stickfigure

2

Verwendung MYSQL als Beispiel: 1) Datenbankverbindungspools verwenden: zum Beispiel: Apache Commons DBCP, auch, müssen Sie basicDataSource jAR-Paket in Ihrem classpath

@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) verwendet JDBC-basierte Treiber es in der Regel verwendet, wenn Sie berücksichtigen nicht Connection-Pool:

@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; 
}