Anbindung von PostgreSQL 7-Datenbank an EE-Seite klappt nicht

Hallo,


habe jetzt schon in zahlreichen Anläufen versucht, eine PostgreSQL-Datenbank an eine EE-Seite (Tomcat auf gehostetem Server) anzubinden, aber es klappt nicht.


Ist hier jemand, der mit Java EE in Verbindung mit PostgreSQL Erfahrung hat?


Auf dem Server läuft PostgreSQL Version 7.4.17 (hab ich leider keinen direkten Einfluss drauf).

Als JDBC-Treiber habe ich schon mehrere Varianten probiert, aber im Wesentlichen diesen:

[INDENT]http://jdbc.postgresql.org/download/pg74.216.jdbc2ee.jar[/INDENT]

von der Download-Seite für JDBC-Treiber:

[INDENT]Download[/INDENT]

(Der Zeile:

JDK 1.3 + J2EE - JDBC 2 EE. This contains additional support for javax.sql classes.

entnehme ich, dass der angegebe Treiber zuständig sein müsste, stimmt? :wink: )


Wenn ich die JSP, die den Treiber einbindet, starte, stürzt der Tomcat ab. Kein HTTP-Output, also auch keine Ausgabe einer Exception über catch. Da es sich um einen gehosteten Server handelt, kann ich nicht in die Log-Datei vom Server schauen (außer, jemand weiß, wie das doch geht? :wink: )


Hier also die JSP, die zunächst mal nur zum Ausprobieren entwickelt wurde:

[INDENT]

<%@ page language="java" %>
<%@ page import="java.util.*" %>
<%@ page import = "java.io.*" %>
<%@ page import = "java.sql.*" %>
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%
            out.println("DB-Test");
            
            String     driver     = "org.postgresql.Driver";
          // --------------------------------------------------------------------------
          String     user       = "user";
          String     password   = "123456";
          String     url        = "jdbc :p ostgresql://localhost/testi";
          // --------------------------------------------------------------------------
          Connection connection = null;

          try
          {
                  Class.forName (driver);
          }
          catch (ClassNotFoundException e)
          {
                  e.printStackTrace ();
                  System.exit (1);
          }

          System.out.println ("driver loaded");         
         
         
        try
        {   
          connection = DriverManager.getConnection (url,
                                                    user,
                                                    password);
        }
        catch (SQLException e)
        {
          e.printStackTrace ();
          System.exit (1);
        }

        System.out.println ("connection opened");         

        try
            {
                    String sSql = "SELECT test FROM test";
                    java.sql.Statement st = connection.createStatement();
                    ResultSet rs = st.executeQuery(sSql);
                    ResultSetMetaData rsmd = rs.getMetaData();

                    while (rs.next())
                    {
                            String text = rs.getString("test");

                            out.println("<p>"+text);

                    }
                    rs.close();
                    st.close();
                    connection.close();
            }
            catch (Exception ex)
            {
                    out.print(ex);
            }  
        
%>

[/INDENT]

Der JDBC-Treiber befindet sich (als pg74.216.jdbc2ee.jar) im Verzeichnis WEB-INF/lib des Projekts und wurde dem Build-Path hinzugefügt.

Ich muss noch dazusagen, dass ich das Projekt mit der lokal (auf meinem Rechner) installierten
8er-PostgreSQL-Version (mit dem entsprechenden JDBC-Treiber für Version 8 natürlich) und angebundener lokaler Testdatenbank
ohne Weiteres zum Laufen bringe.
Mit der 7er Version auf dem gehosteten Server schaffe ich es bisher jedoch wie geschildert nicht.



Hat jemand eine Idee, wie man da ansetzen könnte?


Gruß M-F

Tomcat-Version? Betriebssystem? BS-Version?

Ist hier jemand, der mit Java EE in Verbindung mit PostgreSQL Erfahrung hat?

Ein wenig

(Der Zeile: JDK 1.3 + J2EE - JDBC 2 EE. This contains additional support for javax.sql classes. entnehme ich, dass der angegebe Treiber zuständig sein müsste, stimmt? > :wink: > )

Ja, ich denke auch

Da es sich um einen gehosteten Server handelt, kann ich nicht in die Log-Datei vom Server schauen (außer, jemand weiß, wie das doch geht? > :wink: > )

Keine Logdateien? Kündige des Server :slight_smile: Wie willst du ne Anwendung debuggen, wenn Dein Entwicklungumfeld nit dem Produktivumfeld entspricht und du nicht mal an die Logfiles rankommst?

Es gibt Millionen von möglichkeiten, wieso dieser Effekt auftritt …

Ich muss noch dazusagen, dass ich das Projekt mit der lokal (auf meinem Rechner) installierten 8er-PostgreSQL-Version (mit dem entsprechenden JDBC-Treiber für Version 8 natürlich) und angebundener lokaler Testdatenbank ohne Weiteres zum Laufen bringe.
Mit der 7er Version auf dem gehosteten Server schaffe ich es bisher jedoch wie geschildert nicht.

Siehe oben, pass mal die entwicklungumgebung der Testumgebung an. Damit meine ich aber garnicht so sehr die Datenbankversion, sondern den ganzen Rest, also Dein BS, Deinen Tomcat, etc. :wink:


Hat jemand eine Idee, wie man da ansetzen könnte?

Naja, siehe oben :slight_smile:

Gruß

Jochen

2 Nachträge:
1.) Könnte es vielleicht sein, dass bereits mittels globaler tomcat-konfiguration ein jdbc-Treiber eingebunden wird, und dass deshalb ein Konflikt auftritt?

Oder anderesherum gefragt,
was passiert denn, wenn du den Treiber nicht einbindest?


2.) Datenbankversion
Ich würde (wie bereits vorher angedeutet) beinahe vollkommen ausschließen (ohne es gestestet zu haben), dass die unterschiedlichen DB-Versionen was damit zu tun haben.


Grüße Jochen

Tomcat-Version:

[INDENT]

Apache Tomcat/5.0

[/INDENT]

ermittelt durch:

[INDENT]

            String name = getServletContext().getServerInfo();
            out.println( name );

[/INDENT]


netcraft.com sagt über den Provider:

[INDENT]

Apache/1.3.27 Unix Red-Hat/Linux mod_fastcgi/2.2.12 mod_jk/1.2.0 mod_perl/1.26 PHP/4.3.3 FrontPage/5.0.2 mod_ssl/2.8.12 OpenSSL/0.9.6b

[/INDENT]


Wenn ich das WAR ohne reingepackten JDBC-Treiber hochlade, bekomme ich in der Applikationsliste bei dieser Applikation das kleine gelbe Ausrufezeichen anstatt des grünen Symbols. Außerdem hat mir der Providersupport vor längerer Zeit schon mal bestätigt, dass kein JDBC-Treiber vorinstalliert ist, weil der Verwaltungsaufwand für die verschiedenen Versionen zu groß wäre, angesichts der geringen Nachfrage nach so speziellen Sachen. Die meisten arbeiten halt anständig mit PHP & MySQL, wie sich das gehört. :wink:


(

Wie willst du ne Anwendung debuggen, wenn Dein Entwicklungumfeld nit dem Produktivumfeld entspricht und du nicht mal an die Logfiles rankommst?

Normalerweise lokal und erst dann raufladen, wenns lokal läuft. :wink:

Normalerweise funktioniert das ja auch recht gut, nur ist das jetzt eben so ein Fall, wo es freilich ein wenig mühselig werden kann… :wink: )

mühselig? das grenzt an hoffnungslosigkeit :wink:

Unterschätz nicht den Einfluss, den alleine unterschiedliche Tomcat-Serverkonfigurationen (geladene oder nicht geladene module, security-settings, etc) aud dein Projekt haben können.

Insofern: Du brauchst die 1.)Tomcat, 2.)Apache, und 3.)DB-Logfiles, sonst stocherst du schnell mal monate im Nebel

Grüße

Jochen

Hi Jochen,

die Stelle, an der die JSP kippt, ist auf jeden Fall die:

[INDENT]

        try
        {   
            connection = DriverManager.getConnection (url,
                                                    user,
                                                    password);
        }
        catch (Exception e)
        {
          
            out.println ( "Fehler" );
            out.println ( e.getStackTrace() );
          System.exit (1);
        }

[/INDENT]


(wie man sich ja irgendwie hat denken können :wink: )

Herausgefunden durch stückweises Vorantasten via Herauskommentieren.


Nach ein paar Sekunden vermeldet der Firefox:

[INDENT]

Fehler: Verbindung fehlgeschlagen

Firefox kann keine Verbindung zu dem Server unter … aufbauen.

  • Die Website könnte vorübergehend nicht erreichbar sein, versuchen Sie es bitte später nochmals.

  • Wenn Sie auch keine andere Website aufrufen können, überprüfen Sie bitte die Netzwerk-/Internetverbindung.

  • Wenn Ihr Computer oder Netzwerk von einer Firewall oder einem Proxy geschützt wird, stellen Sie bitte sicher,
    dass Firefox auf das Internet zugreifen darf.

[/INDENT]


Versteh nur nicht ganz, warum dann nicht einfach mal der catch-Block ausgeführt wird, aber dafür hab ich wohl noch zu wenig Einblick in die Architektur. (Kann das sein, dass es da gleich den ganzen Tomcat lahmlegt, nur weil irgendwie die Datenbankverbindung nicht aufgebaut werden kann…?)

Aber nun ja, da muss ich wohl mal den Provider kontaktieren wegen Log-Files etc. Ich geb dann bescheid, sobald ich was rausgefunden habe.


Guten Morgen! :p
M-F

Weil

DriverManager.getConnection (url, user, password)

eine Exception namens “SQLException” auslöst. Was soll der catch-Block behandeln? Eine Exception, die nie ausgelöst wurde?

Startup für PostgreSQL + JDBC + Eclipse bietet Dir ein funktionierendes Beispiel.





mfg

fristo

Aber ist eine SQLException nicht abgeleitet von Exception und damit müsste der catch auch greifen? Bin mir jetzt nicht ganz sicher aber bei .net müsste das so sein bin jetzt aber zu faul das zu überprüfen und JAVA ist teufelszeug… :wink:

cu tb

Ja, catch greift auch wenn man den Namen “Exception” einsetzt.


PS: Stell doch mal eine Liste zusammen, welche Tools hier teufelszeug sind!





mfg

fristo

Auch auf die Gefahr hin, mich zu wiederholen :wink: → LOGFILES!

try
{
connection = DriverManager.getConnection (url,
user,
password);
}
catch (Exception e)
{

out.println ( “Fehler” );
out.println ( e.getStackTrace() );
System.exit (1);
}

Dieses Statement scheint einen Tomcat/Apache crash auszulösen.

Glaube nicht daran, dass die exception jemals sauber handelt werden kann (mangels zum Zeitpunkt laufendem server :slight_smile: )


Frohe Weihnachten in die Runde

Ich würde es an deiner Stelle mal über eine DBCP Datasource versuchen,
das ist der JNDI/RMI Standardweg für Tomcat Webapplication (ca. ab
5er Version von Tomcat).

DBCP - Overview

Vesuch mal das für deine Postgres DB umzusetzen,
das macht schon vieles gleich viel angenehmer :wink:
http://wiki.apache.org/commons/DBCP

Moin,

Also ich musste etwas schmunzeln als ich deine JSP Seite gesehen
habe :wink: Du kommst von PHP und versuchst das gleich Prinzip auf
JSP Seiten zu übetragen, stimmts?


Also eins vorweg. Das kann man so machen, nur macht das
normalerweise keiner weil Du Dir damit so einige echte Probleme
einhandelst.

Ich schlage Dir daher mal folgende Alternative vor.

1.Schaue ob die Tomcatversion schon mind 5.0 oder 5.5 ist
2.Wenn ja, dann erstelle ein DBCP Datasourcefile (innerhalb des WAR’s)
3.Erstelle ein SessionBean (eine Bean die an der WebSession hängt) das die Datenquelle anspricht.
4.Greife via SessionScope von deiner JSP auf das Sessionbean zu.

Der Vorteil dabei ist das deine JSP fast nur noch HTML
und ganz wenige Zeilen Javacode enthällt (Trennung von Präsentation
und Programmierlogik). Die Lesbarkeit und Wartbarkeit ist viel
besser und die Fehleranfälligkeit nimmt rapide ab.

Alles notwendige dazu lässt sich letztendlich in dein WAR Archiv
packen. Dann nur noch in den Tomcat Deploy Ordner übertragen
und fertig.

ps: Du solltest Dir zum entwickeln (Eclipse oder Netbeans) eine
Struktur einrichten die ungefähr dem Stand deines Tomcat Porduktionsservers
entspricht.