MySQL Datasource kontra Maven

MySQL Datasource kontra Maven
Pangeon
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Łódź
  • Postów:163
0

Witam, mam problem wydawałoby się banalny ale zjadłem już na nim własne zęby. Mam za zadanie stworzyć kontekst aplikacji, by nawiązywała ona połączenie z bazą danych. Podany poniżej kod działa:

Kopiuj
public class ConnectionTest {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.cj.jdbc.Driver");

        Connection c = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC",
                "root",
                "Pangeon66#");
        Statement s = c.createStatement();
        String q = "SELECT * FROM users;";
        ResultSet rs = s.executeQuery(q);

        String email = null;
        String name = null;
        while (rs.next()) {
            email = rs.getString("email");
            name = rs.getString("name");
            System.out.println(email + " " + name);
        }
        if(s != null) s.close();
        if(rs != null) rs.close();
        if(c != null) c.close();
    }
}

I nie ma w tym nic skomplikowanego. Gdy jednak postawiłem sobie wszystko ładnie podzielić tzn.

Kopiuj

@WebServlet(name = "TestConnectionServlet", value = "/TestConnectionServlet")
public class TestConnectionServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String q = "SELECT * FROM users;";
        try(Connection c = ConnectionProvider.connect();
            Statement s = c.createStatement();
            ResultSet rs = s.executeQuery(q))
        {
            PrintWriter p = resp.getWriter();
            while (rs.next()) {
                p.println(rs.getString("email"));
                p.println("::");
                p.println(rs.getString("name"));
                System.out.println(rs.getString("email"));
                System.out.println(rs.getString("name"));
            }
        } catch (SQLException e) {
            req.getRequestDispatcher("error.jsp").forward(req, resp);
            e.printStackTrace();
        }
    }
}

public class ConnectionProvider {
    private static DataSource ds;

    public static Connection connect() throws SQLException {
        return getDSInstance().getConnection();
    }

    private static DataSource getDSInstance() {
        if (ds == null) {
            try {
                Context ic = new InitialContext();
                Context ec = (Context) ic.lookup("java:comp/env");
                ds = (DataSource) ec.lookup("jdbc/test");
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
        return ds;
    }
}

Okazało się, że pojawiły się problemy NullPointerException, brak identyfikacji sterownika. Podany sposób łączenia się z bazą już stosowałem; bez użycia Mavena było okej. Naprawdę nie wiem co w tej konfiguracji jest nie tak, czemu to takie upierdliwe. Brakuje mi pomysłów. Proszę o pomoc, wskazówki. To co jest internecie nie pomogło mi.

Kopiuj
WEB.XML

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <resource-ref>
    <description>JMTrain Connection</description>
    <res-ref-name>jdbc/test</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

CONTEXT.XML

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="jdbc/test"
              auth="Container"
              type="javax.sql.DataSource"
              initialSize="10"
              maxTotal="100"
              maxIdle="30"
              maxWaitMillis="10000"
              username="root"
              password="Pangeon66#"
              driverClassName="com.mysql.cj.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=UTC" />
</Context>
```
[](http://)https://github.com/pangeon/JMTrain

Sukces jest progresywną realizacją wartościowej idei w ramach cierpliwego wymiaru czasu.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Zgaduje ze:

  • budujesz z tego lekkiego jara bez zależności
  • wrzucasz to do odpalenia na jakimś tomcacie

Musisz zrobić fat-jar/war jeśli chcesz coś takiego zrobić.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Pangeon
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Łódź
  • Postów:163
0

Witam, problem się rozwiązał, a był to problem konfiguracyjny - nie wiem czy to wina IDE czy Mavena, nie opisane nigdzie gdzie to ustawić, no ale pliki webapp i klasy muszą być na tym samym poziomie czyli katalog src/main; w webapp/META-INF jest jest context.xml i wtedy działa. Nadal mnie zastawia gdzie to dziadostwo skonfigurować, używam IntelliJ IDEA. Czasem to się wydaje, że cała ta graficzna zasłona wcale mi nie pomaga...


Sukces jest progresywną realizacją wartościowej idei w ramach cierpliwego wymiaru czasu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.