[TOMCAT] DB connection pooling met JSP/servlets

Pagina: 1
Acties:

  • Helox-in-a-box
  • Registratie: Augustus 2000
  • Laatst online: 20:10
Ik krijg er onderhand wel een punthoofd van, na een week lang FAQs lezen en HOWTOs uitproberen wil het maar niet lukken dus misschien dat iemand hier er meer verstand van heeft :P

Probleem: DB connection pooling werkt onder JSP (eindelijk) maar wil niet werken met servlets.

Dingen die ik al heb geprobeerd: tomcat faq, jndi docs op sun.com, zoeken op GoT, zoeken op google, zoeken op google groups. Helaas allen zonder resultaat.

Setup: Tomcat 5.0 server met een servlet die connect naar een database.

Dingen die het WEL doen: ik kan dus inmiddels al wel verbinding maken via een JSP-pagina naar database, zie hier de code:
code:
1
2
3
4
5
6
7
<%@ page language="java"
import="java.sql.*,javax.sql.*,javax.naming.*" 
Context initCtx = new javax.naming.InitialContext();
Context ctx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup("dbGlobal");
Connection conn = ds.getConnection();
%>

Dit werkt inmiddels door toevoeging van 2 onderdelen in wat config files: tomcat/conf/server.xml en tomcat/conf/catalina/localhost/test.xml, hieronder de stukken vd configs:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Dit staat in de server.xml tussen de GlobalNamingResources-tags

    <Resource name="dbconnection" type="javax.sql.DataSource"/>
    <ResourceParams name="dbconnection">
      <parameter>
        <name>maxWait</name>
        <value>5000</value>
      </parameter>
      <parameter>
        <name>maxActive</name>
        <value>4</value>
      </parameter>
      <parameter>
        <name>password</name>
        <value>password</value>
      </parameter>
      <parameter>
        <name>url</name>
        <value>jdbc:mysql://interne-ip/database</value>
      </parameter>
      <parameter>
        <name>driverClassName</name>
        <value>com.mysql.jdbc.Driver</value>
      </parameter>
      <parameter>
        <name>maxIdle</name>
        <value>2</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value>username</value>
      </parameter>
    </ResourceParams>

code:
1
2
3
Dit staat dan in de test.xml tussen de Context-tags:

<ResourceLink global="dbconnection" name="dbGlobal" type="javax.sql.DataSource"/>

Dit geheel werkt ook naar behoren, verder nix aan de hand (voorbeeld gevonden via google en is eigenlijk het enige voorbeeld wat werkte...)

locatie van bestanden: de mysql-connector staat verder in tomcat/common/lib

Alleen op het moment dat ik het geheel omzet naar een servlet dan blijf het hangen bij het connecten naar de InitialContext, ik heb verder precies dezelfde tags in de /conf/catalina/localhost/HelloDatabase.xml gezet (dat van de resource link) maar helaas...
Dit is de code in de servlet
code:
1
2
3
4
5
6
7
8
9
10
11
initCtx = new InitialContext();
if (initCtx == null) throw new Exception("Boom - No Initial Context");
        
ctx = (Context) initCtx.lookup("java:comp/env");

ds = (DataSource) ctx.lookup("dbGlobal");

if (ds == null) throw new Exception("Boom - No Datasource");
m_logger.info("DataSource getted");
conn = ds.getConnection();
m_logger.info("Connection made");

je zou zeggen precies hetzelfde als in de JSP maarja op de een of andere manier wilt het daar wel en hier niet...

De logfile zegt dit:
2005-11-16 18:24:47,580 ERROR [main] com.akonix.application.helloDatabase.HelloDatabase - javax.naming.CommunicationException: Cannot connect to ORB [Root exception is org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No]

Het lijkt dus alsof er geen registry wordt opgestart waarmee de app zich aan kan melden, maar alsik jdk/bin/tnameserve.exe opstart dan gaatie een klein stukje verder maar blijft dan hangen bij:

2005-11-16 17:57:31,687 ERROR [main] com.akonix.application.helloDatabase.HelloDatabase - javax.naming.NameNotFoundException [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]

Het lijkt wel alsof er tijdens het draaien van servlets de applicaties niet kunnen connecten naar de registry van tomcat (wat dus WEL lukt als er gebruik wordt gemaakt van JSPs).

Ik hoop dat iemand hier meer kaas van heeft gegeten ;)

[ Voor 9% gewijzigd door Helox-in-a-box op 16-11-2005 19:14 ]


Verwijderd

Jsp's zijn servlets, kijk even in de directory %TOMCAT_HOME%/work/Catalina/localhost/%naam van je project%/org/apache/jsp/%naam_van_de_jsp%.java

daar kan je zien hoe tomcat je jsp verbouwd naar een servlet

verder is het niet duidelijk wanneer de exceptie wordt opgegooid, is dat bij InitialContext of bij Datasource ?

  • Helox-in-a-box
  • Registratie: Augustus 2000
  • Laatst online: 20:10

2005-11-16 18:24:47,580 ERROR [main] com.akonix.application.helloDatabase.HelloDatabase - javax.naming.CommunicationException: Cannot connect to ORB [Root exception is org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No]

Deze error wordt bij InitialContext gegenereerd, das dus alsik geen tnameserv.exe draai. Als ik dat wel doe dan gaatie verder en geeftie een error bij Context


2005-11-16 17:57:31,687 ERROR [main] com.akonix.application.helloDatabase.HelloDatabase - javax.naming.NameNotFoundException [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]

het lijkt dus wel alsof de resource niet wordt in het registry wordt gezet als er Java wordt gedraait? |:(
Dit is de omgezette source van de jsp:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

Context initCtx = new javax.naming.InitialContext();

Context ctx = (Context) initCtx.lookup("java:comp/env");

DataSource ds = (DataSource) ctx.lookup("dbGlobal");

Connection conn = ds.getConnection();

Statement stmt  = null;
ResultSet rs    = null;

try {
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT * FROM nieuws LIMIT 0,20");
} catch (Exception e) {
    e.printStackTrace();
}

[ Voor 6% gewijzigd door Helox-in-a-box op 17-11-2005 10:19 ]