Tomcat5.5 ではまったこと。


CentOS5 に yum でインストールした tomcat5.5 から PostgreSQL8.3
に DataSource を使って接続しようと思い試してみるとエラーばっかり><
今までは DriverManager を使っていて問題なく動いていたのですが、
DataSource をどうしても試してみたいので探検することに。

エラーの内容は

HTTPステータス 500 -

■例外
org.apache.jasper.JasperException: Could not create resource factory instance
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:476)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:371)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

■原因
javax.servlet.ServletException: Could not create resource factory instance
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:846)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
org.apache.jsp.mainteProduct_jsp._jspService(mainteProduct_jsp.java:335)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

■原因
javax.naming.NamingException: Could not create resource factory instance
[Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]
org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:118)
javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
org.apache.naming.NamingContext.lookup(NamingContext.java:793)
org.apache.naming.NamingContext.lookup(NamingContext.java:140)
org.apache.naming.NamingContext.lookup(NamingContext.java:781)
org.apache.naming.NamingContext.lookup(NamingContext.java:153)
org.apache.jsp.mainteProduct_jsp._jspService(mainteProduct_jsp.java:119)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

■原因
java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory
java.net.URLClassLoader$1.run(URLClassLoader.java:200)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:188)
java.lang.ClassLoader.loadClass(ClassLoader.java:306)
java.lang.ClassLoader.loadClass(ClassLoader.java:251)
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:169)
org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:115)
javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
org.apache.naming.NamingContext.lookup(NamingContext.java:793)
org.apache.naming.NamingContext.lookup(NamingContext.java:140)
org.apache.naming.NamingContext.lookup(NamingContext.java:781)
org.apache.naming.NamingContext.lookup(NamingContext.java:153)
org.apache.jsp.mainteProduct_jsp._jspService(mainteProduct_jsp.java:119)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

といった感じで tomcat に不慣れな自分にはまったく意味がわかりません。

なんとなく気付いたのは
データベースの設定が書かれた何かを javax.naming が探しにいってるようですが
javax.naming がうまく動いてないのかなってぐらい。

META-INF/context.xml


<reloadable="true">

type="javax.sql.DataSource" username="○○○" password="△△△"
driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/tomcatDB"
maxActive="10" maxIdle="4" maxWait="5000"
<validationQuery="SELECT * FROM category" />

WEB-INF/web.xml


postgreSQL Datasource example
jdbc/postgres
javax.sql.DataSource
Container

途方に暮れてるとひとりシステム屋さんというページを発見!!

同じ様に Tomcat5.5 のソースをダウンロードしてきて naming-factory-dbcp.jar を tomcat の common/lib に配置してみると
みごとに動きましたb

ありがとう~「ひとりシステム屋さん」!

タグ: ,

コメントをどうぞ