Strona główna > Java, Komputer > Tomcat i zarządzanie połączeniami do bazy danych

Tomcat i zarządzanie połączeniami do bazy danych

Jakiś czas temu na uczelni przygotowywałem projekt związany z zastosowaniem Javy do obsługi prostego systemu zarządzania treścią, jakie znamy z sieci. Celem tego projektu było zaprzyjaźnienie się z Tomcatem, JDBC, Java Server Pages i wzorcem MVC.

Jednym z ciekawszych zagadnień, z jakimi zetknąłem się podczas implementacji była kwestia zarzadzania pulą połączeń do bazy danych już na poziomie Tomcata. Z braku polskich źródeł poprosiłem alvina o zgodę na polonizację jego tutoriala z devdaily, który posłużył za bazę do tego, co obsługiwało połączenie do bazy danych w moim projekcie.

Zakładam, że osoby korzystające z tego tutoriala mają już skonfigurowaną bazę danych, jak również wiedzą, jak wygląda działanie i obsługa Tomcata. Nasza aplikacja to JavaBlog, a na potrzeby tego tutoriala utworzono bazę danych mySQL o nazwie mateusz i haśle 123456 (chociaż można dyskutować czy to jeszcze kwalifikuje się jako hasło ;-)

Pierwszą rzeczą, jaką musimy zrobić jest konfiguracja kontekstu aplikacji w pliku context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/JavaBlog" >
        <Resource name="jdbc/mysql" auth="Container"
        type="javax.sql.DataSource"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/mateusz"
        username="mateusz"
        password="123456"
        maxActive="10"
        maxIdle="5"
        maxWait="-1"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        logAbandoned="true">
        />
</Context>

Dla nas istotna jest część dotycząca samego Resource (resztę najprawdopodobniej wygenerowało już Twoje IDE). Tutaj konfigurujemy zarówno dane dostępu do bazy (istotny jest format URLa: jdbc:mysql://host:port/nazwaBazy). Tak samo tutaj podajemy parametry puli połączeń, jaką ma utrzymywać Tomcat. Warto na tym etapie zapamiętać sobie także nazwę zasobu, gdyż odnosząc się do niego później będziemy z niej korzystać.

Ci, którzy są bardziej dociekliwi powinni zaglądnąć do dokumentacji Tomcata, aby sprawdzić, co jeszcze można tam skonfigurować (link).

Kolejny etap do stworzenie klasy, która będzie zarządzała naszym zasobem udzielając go innym metodom na ich żądanie i trzymając określoną pulę połączeń. Warto na tym etapie przyjrzeć sie poniższej klasie. Widzimy poniżej jak odnosimy się poprzez nazwę do zasobu. Istotne jest również używanie metod getConnection() oraz freeConnection przy późniejszym tworzenu kodu. Jest to o tyle ważne, że zwalnianie i pobieranie połączeń z puli w ten sposób nie spowoduje zbyt szybkiego wyczerpania się tego, co jest w puli.

package database;
import javax.naming.InitialContext;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import javax.sql.*;

 

public class DBBroker extends
HttpServlet
{
  private static DataSource datasource = null;

 


    @Override
  public void init() throws
ServletException
  {
    try{
      InitialContext initialContext = new InitialContext();
      if ( initialContext == null ){
        String message = "There was no InitialContext in DBBroker. We're about to have some problems.";
        System.err.println("*** " + message);
        throw new Exception(message);
      }
      datasource = (DataSource)initialContext.lookup( "java:/comp/env/jdbc/mysql" );

 

      if ( datasource == null ){
        String message = "Could not find our DataSource in DBBroker. We're about to have problems.";
        System.err.println("*** "+ message);
        throw new Exception(message);
      }
    }
    catch (Exception e){
      throw new ServletException(e.getMessage());
    }
  }

 

  public static synchronized Connection getConnection() throws SQLException {
    return datasource.getConnection();
  }

 

  public static synchronized void freeConnection(Connection connection){
    try{
      connection.close();
    }catch (Exception e){
      System.err.println("DBBroker:Threw an exception closing a database connection");
      e.printStackTrace();
    }
  }
}

Ostatnią częścią, jakiej potrzebujemy do szczęścia jest konfiguracja naszego pośrednika w pliku web.xml. Musimy do niego dodać 2 sekcje: jedną dotyczącą samego zasobu i drugą dotyczącą napisanego przed chwilą pośrednika.

    <resource-ref>
      <description>mySQL datasource</description>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
    </resource-ref>
    <servlet>
        <servlet-name>
            DBBroker
        </servlet-name>
        <servlet-class>
            database.DBBroker
        </servlet-class>
<load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>
            DBBroker
        </servlet-name>
        <url-pattern>
            /DBBroker
        </url-pattern>
    </servlet-mapping>

Miłego używania : )

Kategorie:Java, Komputer
  1. kj
    Sierpień 24, 2012 o 1:02 am

    Och! Karmel został programistą Enterprise. Jak wszyscy wiemy – im więcej XML-a tym bardziej Enterprise jesteś :-)

  1. No trackbacks yet.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: