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 plik mysql-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?

Author: BalusC, 2010-02-19

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ż:

 40
Author: BalusC,
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).

 3
Author: Voytek Jarnot,
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