Avatar billede aslan Nybegynder
02. februar 2005 - 14:45 Der er 27 kommentarer og
1 løsning

Hjælp til opsætning af DataSource i Tomcat?

Jeg har forsøgt at få fat på DataSource fra tomcat, men jeg får denne fejl når jeg forsøger:

Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

Den opsætning jeg har er følgende:

:::jakarta-tomcat-5.0.28/conf/Server.xml:::

<!-- Global JNDI resources -->
  <GlobalNamingResources>
    <Resource name="jdbc/DB" auth="Container" type="javax.sql.DataSource">
    </Resource>
    <ResourceParams name="jdbc/DB">
      <parameter>
      <name>username</name>
      <value>db_username</value>
      </parameter>
      <parameter>
      <name>password</name>
      <value>*****</value>
      </parameter>
      <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
      </parameter>
      <parameter>
      <name>url</name>
    <value>jdbc:mysql://*******</value>
      </parameter>
      <parameter>
      <name>maxActive</name>
      <value>8</value>
      </parameter>
      <parameter>
      <name>maxIdle</name>
      <value>4</value>
      </parameter>
    </ResourceParams>
  </GlobalNamingResources>


:::Min applikation: WEB-INF/web.xml:::

  <resource-ref>
    <res-ref-name>jdbc/DB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>


:::Min applikation: META-INF/context.xml:::

<?xml version='1.0' encoding='utf-8'?>
<Context workDir="work\Catalina\localhost\WEB_APP_NAME" path="/WEB_APP_NAME"
    docBase="c:/jakarta-tomcat-5.0.28/webapps/WEB_APP_NAME">
  <ResourceLink global="jdbc/DB" name="jdbc/DB" type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/DB">
      <parameter>
      <name>username</name>
      <value>db_username</value>
      </parameter>
      <parameter>
      <name>password</name>
      <value>****</value>
      </parameter>
      <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
      </parameter>
      <parameter>
      <name>url</name>
      <value>jdbc:mysql://*******</value>
      </parameter>
      <parameter>
      <name>maxActive</name>
      <value>8</value>
      </parameter>
      <parameter>
      <name>maxIdle</name>
      <value>4</value>
      </parameter>
    </ResourceParams>
</Context>


Har nogen ide til hvad jeg kunne have gjort forkert?
Avatar billede arne_v Ekspert
02. februar 2005 - 14:50 #1
Ligger MySQL JDBC driver jar filen i webapps/xxxx/WEB-INF/lib ?
Avatar billede aslan Nybegynder
02. februar 2005 - 14:56 #2
ja...
Avatar billede simonvalter Praktikant
02. februar 2005 - 14:58 #3
hvad sker der når man ikke sætter et factory.. bruger den så et default siden du ikke har noget?
Avatar billede simonvalter Praktikant
02. februar 2005 - 14:59 #4
altså
<parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>
Avatar billede arne_v Ekspert
02. februar 2005 - 15:02 #5
Den har ihvertfald opdaget at det er Common DBCP jævnfør exception.
Avatar billede arne_v Ekspert
02. februar 2005 - 15:03 #6
Der er en eller anden obskur lille finesse med samspillet mellem de 3 XMl config
filer.
Avatar billede arne_v Ekspert
02. februar 2005 - 15:04 #7
kan du ikke bare gøre det som jeg beskriver i http://www.eksperten.dk/artikler/50
(det vides at virke !)
Avatar billede aslan Nybegynder
02. februar 2005 - 15:11 #8
Jo jeg prøver lige dit eks. arne og vender tilbage..
Avatar billede simonvalter Praktikant
02. februar 2005 - 15:14 #9
kunne man ikke forestille sig at siden den er defineret som en global resource så skal driveren være globalt tilgængelig og ikke kun i webapps/xxxx/WEB-INF/lib .. det lyder ihvertfald logisk her..

der er flere forslag her på at løse problemet
http://www.theserverside.com/discussions/thread.tss?thread_id=25459
men arnes eksempel burde virke..
Avatar billede arne_v Ekspert
02. februar 2005 - 15:20 #10
Ah ja - common\lib er nok bedre !
Avatar billede aslan Nybegynder
02. februar 2005 - 15:34 #11
Skal lige høre skal :

<Context docBase="pooltest" path="/pooltest" reloadable="true">
<Resource auth="Container" name="jdbc/TestMySQL" type="javax.sql.DataSource" />
<ResourceParams name="jdbc/TestMySQL">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value></value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost/Test</value>
</parameter>
</ResourceParams>
</Context>

ikke ind mellem <GlobalNamingResources></GlobalNamingResources> for jeg får præcis samme fejl som før?
Avatar billede arne_v Ekspert
02. februar 2005 - 15:36 #12
Den skal ligge som en helt normal context i conf/server.xml
Avatar billede aslan Nybegynder
02. februar 2005 - 15:47 #13
Jeg får stadig denne fejl:

org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
    at app.DBInterface.getInNumbers(DBInterface.java:248)
    at org.apache.jsp.search_jsp._jspService(search_jsp.java:111)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
    at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:670)
    at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:637)
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:54)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)
Caused by: java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:243)
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)
    ... 48 more
Avatar billede arne_v Ekspert
02. februar 2005 - 15:53 #14
Og du har lagt context tag direkte i host tag og din JSP side er faktisk i
den context du har defineret ?
Avatar billede aslan Nybegynder
02. februar 2005 - 16:02 #15
Så virkede det arne.. læg et svar
Avatar billede arne_v Ekspert
02. februar 2005 - 16:05 #16
ok
Avatar billede aslan Nybegynder
02. februar 2005 - 16:46 #17
Hej arne ved du egentlig om man kan sætte noget simpelt cronjob op i tomcat?
Avatar billede arne_v Ekspert
02. februar 2005 - 16:54 #18
Jeg mener ikke at Tomcat har indbygget en timer service.

Men du kan bruge f.eks. http://www.quartzscheduler.org/quartz/ i Tomcat.
Avatar billede arne_v Ekspert
02. februar 2005 - 17:00 #19
http://www.theserverside.com/blogs/showblog.tss?id=QuartzSchedulerInJ2EE

(der kaldes en EJB til sidst men det er en servlet som køres af Quartz og
den behøver ikke kalde en EJB)
Avatar billede aslan Nybegynder
02. februar 2005 - 19:35 #20
ok tak endnu angang...
Avatar billede aslan Nybegynder
03. februar 2005 - 16:16 #21
Hej igen Arne, dit eks. er specifik bundet til en applikation, hvordan kan man ændre det så alle applikationer kan benytte sig af samme datasource? Du får selvfølgelig point hvis du kan hjælpe mig med det.
Avatar billede arne_v Ekspert
03. februar 2005 - 16:21 #22
Det kan jeg lige lege lidt med i aften.

Typisk vil man netop have det per applikation fordi så kan server
administartor styre hvor mange connections hver applikation
får.
Avatar billede arne_v Ekspert
03. februar 2005 - 23:10 #23
Det her er til at blive skør af.

Jeg prøvede med Tomcat 5.5.

Først konstaterede jeg at eksmeplet fra min artikel ikke virkede.

Men:

      <Context docBase="pooltest" path="/pooltest" reloadable="true">
            <Resource auth="Container" name="jdbc/TestMySQL" type="javax.sql.DataSource"
              maxActive="100" maxIdle="30" maxWait="10000"
              username="" password="" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost/Test"/>
          </Context>

gjorde.

Så flyttede jeg den op i global names:

        ...
          <Resource auth="Container" name="jdbc/TestMySQL" type="javax.sql.DataSource"
              maxActive="100" maxIdle="30" maxWait="10000"
              username="" password="" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost/Test"/>

  </GlobalNamingResources>
...
      <Context docBase="pooltest" path="/pooltest" reloadable="true">
      </Context>

men det virkede ikke.

Lidt doc læsning viste dog tricket:

        ...
          <Resource auth="Container" name="jdbc/TestMySQL" type="javax.sql.DataSource"
              maxActive="100" maxIdle="30" maxWait="10000"
              username="" password="" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost/Test"/>

  </GlobalNamingResources>
...
      <Context docBase="pooltest" path="/pooltest" reloadable="true">
            <ResourceLink auth="Container" name="jdbc/TestMySQL" type="javax.sql.DataSource" global="jdbc/TestMySQL"/>
      </Context>

og så virkede det.
Avatar billede aslan Nybegynder
05. februar 2005 - 16:18 #24
Tak for det arne jeg kigger lige på det på mandag og vender så tilbage..
Avatar billede aslan Nybegynder
07. februar 2005 - 11:00 #25
Når jeg forsøger som du beskriver arne får jeg samme fejl som før:

Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:780)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
        at util.ServiceLocator.getConnectionJDNIName(ServiceLocator.java:100)
        ... 47 more
Caused by: java.sql.SQLException: No suitable driver
        at java.sql.DriverManager.getDriver(DriverManager.java:243)
        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)
        ... 49 more

Men i dit eks. er man vel stadig afhængig af at man skal redigere i server.xml når man lægger en ny applikation op? Jeg tænker på:

      <Context docBase="pooltest" path="/pooltest" reloadable="true">
            <ResourceLink auth="Container" name="jdbc/TestMySQL" type="javax.sql.DataSource" global="jdbc/TestMySQL"/>
      </Context>
Avatar billede aslan Nybegynder
07. februar 2005 - 12:11 #26
Så fik jeg det til at virke også uden at man er afhængig af server.xml når man smider en ny applikation op. Smider noget kode op senere når jeg har tid...
Avatar billede aslan Nybegynder
07. februar 2005 - 16:00 #27
mellem GlobalNamingResources  :


<Resource auth="Container" name="jdbc/Conn" type="javax.sql.DataSource" />
    <ResourceParams name="jdbc/Conn">
      <parameter>
        <name>factory</name>
        <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
      </parameter>
      <parameter>
        <name>maxActive</name>
        <value>100</value>
      </parameter>
      <parameter>
        <name>maxIdle</name>
        <value>30</value>
      </parameter>
      <parameter>
        <name>maxWait</name>
        <value>10000</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value></value>
      </parameter>
      <parameter>
        <name>password</name>
        <value></value>
      </parameter>
      <parameter>
        <name>driverClassName</name>
        <value>com.mysql.jdbc.Driver</value>
      </parameter>
      <parameter>
        <name>url</name>
        <value>jdbc:mysql://</value>
      </parameter>
    </ResourceParams>


Mellem Host:

        <DefaultContext>
          <ResourceLink
            name="jdbc/Conn"
            global="jdbc/Conn"
            type="javax.sql.DataSource"
          />
        </DefaultContext>
Avatar billede aslan Nybegynder
07. februar 2005 - 16:01 #28
Jeg lægger lige point op til dig arne...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester