2009-08-26 11 views
34

Staram się podążać samouczek Sun JDBC w http://java.sun.com/docs/books/tutorial/jdbc/basics/connecting.htmlJak ręcznie skonfigurować źródło danych w Javie?

Daje następujący przykładowy kod:

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

Connection con = ds.getConnection(); 

Ten kod nie kompiluje ponieważ interfejs DataSource nie ma żadnej z tych metod, z wyjątkiem dla getConnection() metoda wywoływana jako ostatnia.

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

Co mi brakuje?

Edit: Jestem rzeczywiście próbuje połączyć się z MySQL (com.mysql.jdbc) i nie mogę znaleźć javadoc do tego. Ja przyjmuję odpowiedź wskazującą mnie do obu:

1) Dokumentacja dla com.mysql.jdbc dotycząca DataSource że mogę zrozumieć, albo

2) podaje przykład do naśladowania dla co samouczka Kod powinny być dla dowolnej bazy danych.

+0

Oto kilka przykładów: 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 –

Odpowiedz

17

Zasadniczo w JDBC większość tych właściwości nie jest konfigurowalna w interfejsie API, a raczej zależy od implementacji. Sposób, w jaki JDBC radzi sobie z tym problemem, umożliwia zmianę adresu URL połączenia w zależności od dostawcy.

Więc co zrobić, to zarejestrować sterownik tak, że system JDBC może wiedzieć, co zrobić z adresem URL:

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

Wtedy tworzą URL:

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

i wreszcie użytkowania Aby uzyskać połączenie:

Connection c = DriverManager.getConnection(url); 

W bardziej wyrafinowanym JDBC angażujesz się w puli połączeń i podobne, a serwery aplikacji często mają swój własny sposób rejestrowania sterowników w JNDI i odszukujesz tam DataSource, i wywołuj na nim getConnection.

Pod względem właściwości obsługiwanych przez MySQL, patrz here.

EDYCJA: Jeszcze jedna myśl, technicznie tylko o linii kodu, który ma Class.forName ("com.mysql.jdbc.Driver") powinno wystarczyć, ponieważ klasa powinna mieć własny statyczny inicjator, który rejestruje wersję , ale czasami sterownik JDBC tego nie robi, więc jeśli nie masz pewności, nie zaszkodzi rejestracja drugiego, po prostu tworzy duplikat obiektu w memu.

+0

Dobrze, że działa. Chciałem DataSource, jak sam instruktor powiedział, że jest preferowany, ale wezmę go. –

+10

DataSource jest tak naprawdę dla serwerów aplikacji i innych kontenerów, które dostarczają usługę JNDI. Bez usługi JNDI nie mają większego sensu, a tutorial jest naprawdę niezbyt dobrze napisany w tym punkcie. – Yishai

+0

Można utworzyć własną klasę, aby zaimplementować interfejs DataSource za pomocą powyższego kodu dla metod getConnection. Poza tym wystarczy zaimplementować metody pobierające i ustawiające dla loginTimeout i LogWriter. – GregA100k

1

Plik javadoc dla źródła danych, do którego się odnosisz, jest nieodpowiedniego pakietu. Powinieneś spojrzeć na javax.sql.DataSource. Jak widać jest to interfejs. Konfiguracja nazwy hosta i portu zależy od implementacji, tj. Używanego sterownika JDBC.

Nie sprawdził Javadocs Derby ale przypuszczam kod należy skompilować tak:

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

myślę, że przykład jest źle - javax.sql.DataSource nie ma tych właściwości albo. Twój DataSource musi być typu org.apache.derby.jdbc.ClientDataSource, który powinien mieć powinien mieć te właściwości.

119

Jedną z rzeczy, na które warto spojrzeć, jest projekt Commons DBCP. Zapewnia on BasicDataSource, który jest skonfigurowany dość podobnie do twojego przykładu. Aby użyć tego, potrzebujesz JAR JDBC dostawcy bazy danych w ścieżce klas i musisz podać nazwę klasy sterownika dostawcy i adres URL bazy danych we właściwym formacie.

Edit:

Jeśli chcesz skonfigurować BasicDataSource dla MySQL, byś zrobił coś takiego:

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

Kod, który potrzebuje DataSource można następnie użyć.

+0

Użyłem tego posta do stworzenia testów jednostkowych –

+0

Niższe hałdy .... xml robiłam .... –

16

DataSource jest sprzedawca specyficzne dla MySQL można użyć MysqlDataSource który jest wyposażony w złącza słoiku MySql Java:

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

Jeśli zamierzasz odpowiedzieć na pytanie zadane 4,5 roku temu , dobrze byłoby wskazać, dlaczego obecne odpowiedzi są niewystarczające. –

+8

W przeciwieństwie do oficjalnie akceptowanej odpowiedzi, ta bezpośrednio odnosi się do pytania. Dziękuję @Luke. – stickfigure

2

wykorzystuje MySQL jako przykładu: 1) użyć bazy danych pula połączeń, na przykład: Apache fotografia DBCP, również trzeba basicDataSource pakiet jar w ścieżce klas

@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) Za pomocą sterownika JDBC oparte jest zwykle używany, jeśli nie uważają puli połączeń:

@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; 
} 
Powiązane problemy