Jak połączyć się z bazą danych JDBC / datasource w aplikacji opartej na serwletach?
Mam zewnętrzny serwer MySQL, który jest skonfigurowany i działa dobrze. Stworzyłem połączenie z bazą danych w Eclipse i mogę przeglądać bazę danych w zakładce Data Source Explorer.
Mam serwlet, który potrzebuje dostępu do bazy danych. Jak to zrobić? Czy istnieje sposób, aby odwołać się do połączenia z bazą danych utworzonego w Eksploratorze źródeł danych, czy muszę zdefiniować wszystko dwa razy? Jaki jest najlepszy sposób na otwarcie połączenia? Mam w komplecie plikmysql-connector-java-5.1.11-bin.jar
i mam znaleziono dwie metody, które działają:
MysqlDataSource d = new MysqlDataSource();
d.setUser("user");
d.setPassword("pass");
d.setServerName("hostname.com");
d.setDatabaseName("db");
Connection c = d.getConnection();
I
Connection c = DriverManager.getConnection("jdbc:mysql://hostname.com/db","user","pass");
Żadna z nich nie jest optymalna, ponieważ przede wszystkim obie używają do wszystkiego zakodowanych łańcuchów. Jest to projekt aplikacji internetowej Java EE, więc czy jest dobre miejsce, aby umieścić dane połączenia? A może jest sposób, aby zrezygnować z tego wszystkiego i po prostu użyć połączenia w Eksploratorze źródeł danych?
2 answers
Powszechną praktyką jest skonfigurowanie tego jako DataSource
w kontenerze serwletów . Zapewni Ci usługi łączenia, które znacznie poprawią wydajność. Powszechną praktyką jest również uzewnętrznianie ustawień raw w jakimś pliku konfiguracyjnym, który jest umieszczony w classpath.
Jeśli używasz Tomcat jako servletcontainer, musisz skonfigurować źródło danych zgodnie z jego JNDI documentation . Zobaczysz. że jest kilka sposobów. Najprostszym sposobem jest utworzenie /META-INF/context.xml
w webcontent dynamicznego projektu sieci web (dla jasności, /META-INF
jest na tym samym poziomie co /WEB-INF
webapp) i wypełnić go czymś takim jak:
<?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>
Oznacza to z grubsza, że serwer Tomcat powinien utworzyć źródło danych o nazwie JNDI jdbc/db
z maksymalnie 100 aktywnymi połączeniami, maksymalnie 30 bezczynnymi połączeniami i maksymalnym czasem oczekiwania 10000 milisekund przed zwróceniem połączenia z Twojej aplikacji (właściwie: zamkniętej przez Twoją aplikację, więc Twoja aplikacja ma 10 sekund czasu między uzyskaniem połączenia a jego zamknięciem). Pozostałość po Ustawieniach powinna być znana i wystarczająco wyjaśniająca; są to ustawienia JDBC.
Na koniec w swoim projekcie, Edytuj plik /WEB-INF/web.xml
, aby dodać następujący wpis:
<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>
To z grubsza oznacza, że webaplikacja powinna używać źródła danych dostarczonego przez serwer o nazwie jdbc/db
.
Następnie zmień Menedżera połączeń na coś takiego:
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();
}
..i Zastąp wszystkie wywołania Class.forName(driver)
przez new Database("jdbc/db")
i Zastąp wszystkie wywołania DriverManager.getConnection()
przez database.getConnection()
. Możesz w razie potrzeby uzyskać wartość jdbc/db
z jakiegoś pliku konfiguracyjnego (Plik Właściwości?).
Ewentualnie wstrzyknąć DataSource
przez @Resource
adnotacja wewnątrz artefaktu zarządzanego kontenerem, np. @WebServlet
Klasa servlet:
@Resource("jdbc/db")
private DataSource dataSource;
To powinno być to. Wystarczy wdrożyć swój webaplikacji z powyższymi zmianami i uruchom go. Nie zapomnij umieścić sterownika bazy danych JDBC w Tomcat/lib
lub dodać jego ścieżkę do shared.loader
właściwości Tomcat/conf/catalina.properties
, ponieważ odpowiedzialność za załadowanie sterownika JDBC została przeniesiona z webaplikacji na serwer. Aby uzyskać więcej wskazówek i innych podstawowych przykładów JDBC/JNDI, możesz znaleźć ten artykuł również przydatny.
Zobacz też:
- Jak zainstalować sterownik JDBC w Eclipse web project bez wychodzenia z java.lang.ClassNotFoundexception
- gdzie muszę umieścić sterownik JDBC dla puli połączeń Tomcat?
- czy korzystanie ze statycznej Javy jest bezpieczne?sql.Instancja połączenia w systemie wielowątkowym?
- wyświetlanie JDBC ResultSet w HTML na stronie JSP przy użyciu wzorca MVC i DAO
- Jak pobrać i wyświetlić obrazy z bazy danych na stronie JSP?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:39
Możesz skonfigurować źródło danych na dowolnym serwerze aplikacji, na którym wdrażasz swoją wojnę i pobrać odniesienie do niej za pomocą JNDI. Albo możesz spakować swoją wojnę do ucha i zdefiniować źródło danych w źródłach danych ucha.plik xml (i pobrać do niego odniesienie za pomocą JNDI).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-19 21:10:44