2009-08-26 12 views
34

Sto cercando di seguire JDBC tutorial di Sun a http://java.sun.com/docs/books/tutorial/jdbc/basics/connecting.htmlCome configurare manualmente un DataSource in Java?

Dà il seguente codice di esempio:

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

Connection con = ds.getConnection(); 

Questo codice non viene compilato perché l'interfaccia DataSource ha nessuno di questi metodi, ad eccezione del getConnection() metodo invocato per ultimo.

(Ecco il javadoc: http://java.sun.com/javase/6/docs/api/javax/sql/DataSource.html)

Che cosa mi manca?

Edit: In realtà sto cercando di connettersi a MySQL (com.mysql.jdbc) e non riesco a trovare il javadoc per questo. Accetterò una risposta che mi punta a uno:

1) Documentazione per com.mysql.jdbc per quanto riguarda un DataSource che posso capire, o

2) dà un esempio da seguire per quello che il codice del tutorial di dovrebbe essere , per qualsiasi database.

+0

Ecco alcuni esempi: 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 –

risposta

17

Fondamentalmente in JDBC la maggior parte di queste proprietà non è configurabile nell'API come quella, ma dipende dall'implementazione. Il modo in cui JDBC gestisce ciò è consentendo all'URL di connessione di essere diverso per fornitore.

Quindi quello che fate è registrare il driver in modo che il sistema di JDBC può sapere che cosa fare con l'URL:

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

Poi si formano l'URL:

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

E, infine, l'uso esso per ottenere una connessione:

Connection c = DriverManager.getConnection(url); 

In più sofisticati JDBC, sei entrato in contatto con il pool di connessione e simili, e i server delle applicazioni hanno spesso il proprio modo di registrare i driver in JNDI e si può cercare un DataSource da lì, e chiamare getConnection su di esso.

In termini di quali proprietà supporta MySQL, vedere here.

EDIT: Un altro pensiero, tecnicamente solo avendo una riga di codice che fa Class.forName ("com.mysql.jdbc.Driver") dovrebbe essere sufficiente, in quanto la classe dovrebbe avere il proprio inizializzatore statico che registra una versione , ma a volte un driver JDBC no, quindi se non si è sicuri, c'è poco danno nella registrazione di un secondo, crea semplicemente un oggetto duplicato in memeory.

+0

Bene, questo funziona. Volevo il DataSource, poiché il tutorial diceva che era preferibile, ma lo prenderò. –

+10

DataSource è in realtà per server applicazioni e altri contenitori che forniscono un servizio JNDI. Senza un servizio JNDI, non hanno molto senso, e il tutorial è onestamente non molto ben scritto su questo punto. – Yishai

+0

È possibile creare la propria classe per implementare l'interfaccia DataSource utilizzando il codice sopra per i metodi getConnection. Oltre a questo è necessario implementare getter e setter per loginTimeout e LogWriter. – GregA100k

1

Il javadoc per DataSource a cui si fa riferimento è del pacchetto errato. Dovresti dare un'occhiata a javax.sql.DataSource. Come puoi vedere questa è un'interfaccia. La configurazione del nome di porta e host dipende dall'implementazione, ad esempio il driver JDBC che si sta utilizzando.

Non ho controllato i javadocs Derby ma suppongo il codice dovrebbe compilare come questo:

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

penso che l'esempio è sbagliato - javax.sql.DataSource non hai queste proprietà sia. Il tuo DataSource deve essere del tipo org.apache.derby.jdbc.ClientDataSource, che dovrebbe avere avere tali proprietà.

119

Una cosa che si potrebbe voler vedere è il progetto Commons DBCP. Fornisce un BasicDataSource configurato in modo abbastanza simile al tuo esempio. Per utilizzarlo è necessario il JD JDBC del fornitore di database nel classpath e si deve specificare il nome della classe del driver del fornitore e l'URL del database nel formato corretto.

Edit:

Se si desidera configurare un BasicDataSource per MySQL, si dovrebbe fare qualcosa di simile:

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

codice che ha bisogno di un DataSource può quindi utilizzare tale.

+0

Ho usato questo post per creare test unitari –

+0

heap Thanx .... xml stava facendo la mia testa .... –

16

DataSource è specifico del fornitore, per MySql è possibile utilizzare MysqlDataSource che è fornito nel connettore vaso MySql Java:

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

Se hai intenzione di rispondere a una domanda posta 4.5 anni fa , sarebbe bene indicare perché le risposte attuali sono insufficienti. –

+8

A differenza della risposta ufficialmente accettata, questa risponde direttamente alla domanda. Grazie @ Luca. – stickfigure

2

usare MySQL come Esempio: 1) utilizzare pool di connessione database: Ad esempio: Apache Commons DBCP, anche, è necessario pacchetto jar basicDataSource nel 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) utilizzare driver JDBC a base di solito è usato se non si considera pool di connessione:

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