2016-11-14 55 views
1

我有一个运行在Tomcat 8服务器上的restful api实现。我决定使用嵌入式Derby版本通过JDBC(使用Eclipse)将数据存储在数据库中。从我的角度来看,嵌入式版本的官方教程并不是非常有用。我跟着这里的步骤: http://www.nailedtothex.org/roller/kyle/entry/defining-embedded-derby-as-a无法在Tomcat中访问嵌入式Derby 8

我的问题是,德比连接没有发现,因为我使用了德比的嵌入式版本,我不知道如何调试不连接到德比的原因。

我将derby.jar和derby-shutdown-listener.jar复制到Tomcat服务器的lib文件夹中。我接受了context.xml和server.xml。

的context.xml:

<Context docBase="myapp" 
     path="/myapp" 
     reloadable="true"> 

     <ResourceLink name="jdbc/derby" 
       global="jdbc/derby" 
       type="javax.sql.DataSource" /> 
</Context> 

我也试过这个版本的context.xml的:

<Context docBase="myapp" 
     path="/myapp" 
     reloadable="true"> 
<Resource name="jdbc/derby" auth="Container" 
     driverClassName="org.apache.derby.jdbc.EmbeddedDriver" 
     username="bot" password="carmeq!" 
     type="javax.sql.DataSource" 
     url="jdbc:derby:mydb;create=true"/> 
</Context> 

的server.xml:

<Listener className="org.nailedtothex.derby.DerbyShutdownLifecycleListener" /> 

我改变了我的网络。 xml:

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

在我的Java类涉及到数据库的连接,我有以下规格:

String dbURL2 = "jdbc:derby:mydb;create=true"; 

这是我的异常,当我把我的宁静的功能,我接受。

javax.servlet.ServletException: java.lang.NullPointerException 
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:487) 
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425) 
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383) 
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336) 
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

调试代码时,它显示没有找到指定url的合适驱动程序。此外,我在我的Tomcat文件夹(显示在Libraries/Apache Tomcat v8.0下)中使用Maven并在derby.jar旁边,我还在我的pom中添加了相同的derby.jar(版本10.9.1.0) .XML。

感谢

+0

你是什么意思的“没有找到与德比的连接”?你有错误信息吗?例外?尽可能精确地描述你所体验的特定症状,人们可以提供帮助。 –

+0

嗨@BryanPendleton,我添加了这个异常。 – Matzka

+0

我发现讨论:http://stackoverflow.com/questions/3816015/sqlexception-no-suitable-driver-found-for-jdbcderby-localhost1527,但derby.jar是在tomcat文件夹中,并显示在tomcat部分图书馆。关于,我已尝试几乎所有的网址.. – Matzka

回答

1

将tomcat original documentation(至少8.0)还指出,该作者没有运气和网内的其他文件,各地也不太清楚。这里是如何为我的作品...

server.xml中你应该有资源GlobalNamingResources内补充说:

<GlobalNamingResources> 
    <!-- Keep non DB Resource stuff here ... --> 

    <Resource auth="Container" 
    driverClassName="org.apache.derby.jdbc.EmbeddedDriver" 
    maxActive="100" maxIdle="30" maxWait="10000" 
    name="jdbc/myDerby" username="" password="" 
    type="javax.sql.DataSource" 
    url="jdbc:derby:Databases/myDerbyDB;create=true"/> 
</GlobalNamingResources> 

的context.xml你应该链接到它是这样的:

<ResourceLink name="jdbc/myDerbyLink" 
    global="jdbc/myDerby" 
    type="javax.sql.DataSource" /> 

我相信,把资源本身放在context.xml中是行不通的,至少它不适合我。

在你的代码,数据库通常是作为链接/引用名称访问,jdbc/myDerbyLink

Context initContext = new InitialContext(); 
Context envContext = (Context)initContext.lookup("java:/comp/env"); 
DataSource ds = (DataSource)envContext.lookup("jdbc/myDerbyLink"); 
Connection conn = ds.getConnection(); 

如果避免使用链接的名称和全局属性相同的名字,也可以是irritiating少得多。只是为了让更多的明确的,这里怎么链接进行处理(XPath的等):

Java Code "java:/comp/env/<JDBCString>" 
    ==> context.xml:/Context/ResourceLink/@name == <JDBCString> 
    ==> ./@global == server.xml:/GlobalNamingResources/Resource/@name 

在web.xml中,不使用的context.xml,你应该能够直接使用资源的短名称jdbc/myDerby 。如果没有,请尝试使用完整的java:/comp/env/jdbc/myDerby

顺便说一句:如果你粘贴导致错误的代码段也会很有帮助。