Java servlet中的Jetty和SQLite连接

Java servlet中的Jetty和SQLite连接,java,sqlite,servlets,jetty,database-connection,Java,Sqlite,Servlets,Jetty,Database Connection,我正在用Java和Maven在Netbeans中制作一个小的servlet应用程序。我正在使用SQLite数据库和最新的Jetty服务器。我在创建用于servlet的连接池时遇到问题。工作原理(在servlet中): 这在jetty.xml/web.xml/pom.xml中不需要特定设置即可工作 我有一些库可以使用SQLite和连接池(org.xerial.SQLite-jdbc、commons-pool、commons-dbcp) 什么不起作用: web.xml: <resour

我正在用Java和Maven在Netbeans中制作一个小的servlet应用程序。我正在使用SQLite数据库和最新的Jetty服务器。我在创建用于servlet的连接池时遇到问题。工作原理(在servlet中):

这在jetty.xml/web.xml/pom.xml中不需要特定设置即可工作 我有一些库可以使用SQLite和连接池(org.xerial.SQLite-jdbc、commons-pool、commons-dbcp)

什么不起作用:

web.xml:

    <resource-ref>
       <description>DB Connection Pool</description>
       <res-ref-name>jdbc/DSTestPool</res-ref-name>
       <res-type>javax.sql.ConnectionPoolDataSource</res-type>
       <res-auth>Container</res-auth>
    </resource-ref>

数据库连接池
jdbc/DSTestPool
javax.sql.ConnectionPoolDataSource
容器
jetty.xml

<New id="DSTestPool" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg>jdbc/DSTestPool</Arg>
    <Arg>
        <New class="org.sqlite.SQLiteConnectionPoolDataSource">
            <Set name="driverClassName">org.sqlite.JDBC</Set>
            <Set name="url">jdbc:sqlite:c:\\db\\base</Set>         
        </New>
    </Arg>
</New>

jdbc/DSTestPool
org.sqlite.JDBC
jdbc:sqlite:c:\\db\\base
xml-依赖项

此配置,即使没有代码更改(更改为使用池),也会在jetty控制台中创建错误:
java.lang.reflect.InvocationTargetException
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
....
原因:
java.lang.IllegalStateException:在org.eclipse.jetty.plus.webapp.PlusDescriptorProcessor.bindEntry(PlusDescriptorProcessor.java:895)中没有要绑定的名称jdbc/DSTestPool
…

在Jetty中打开应用程序:错误503


我认为我在jetty.xml中声明的jdbc/DSTestPool有问题,我尝试了不同的参数,但结果是一样的。

jetty.xml中缺少一个参数,您可以声明以下任何类型:

  • org.eclipse.jetty.plus.jndi.EnvEntry:用于环境条目类型的条目
  • org.eclipse.jetty.plus.jndi.Resource:用于所有其他类型的资源
  • org.eclipse.jetty.plus.jndi.Transaction:对于JTA经理
  • org.eclipse.jetty.plus.jndi.Link:用于web.xml资源名称和命名条目之间的链接
每种类型都遵循相同的模式:

<New class="org.eclipse.jetty.plus.jndi.xxxx">
  <Arg><!-- scope --></Arg>
  <Arg><!-- name --></Arg>
  <Arg><!-- value --></Arg>
</New>


详细信息。

一种方法可以是使用HikariCp(或任何其他pooler…)。 在jetty-env.xml中:

<Configure  class="org.eclipse.jetty.webapp.WebAppContext">
<New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource">
 <Arg></Arg>
 <Arg>jdbc/ds</Arg>
 <Arg>
   <New class="com.zaxxer.hikari.HikariDataSource">
     <Arg>
        <New class="com.zaxxer.hikari.HikariConfig">
           <Set name="dataSourceClassName">org.sqlite.SQLiteDataSource</Set>
           <Call name="addDataSourceProperty">
              <Arg>url</Arg>
              <Arg>jdbc:sqlite:path/to/test.db</Arg>
           </Call>
        </New>
     </Arg>
  </New>
</Arg>
<New id="DSTestPool" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg></Arg><!-- empty arg -->
    <Arg>jdbc/DSTestPool</Arg>
    <Arg>
        <New class="org.sqlite.SQLiteConnectionPoolDataSource">
            <Set name="driverClassName">org.sqlite.JDBC</Set>
            <Set name="url">jdbc:sqlite:c:\\db\\base</Set>
        </New>
    </Arg>
</New>
<Configure id='wac' class="org.eclipse.jetty.webapp.WebAppContext">
    <New id="DSTestPool" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg><Ref refid='wac'/></Arg><!-- reference to WebAppContext -->
        <Arg>jdbc/DSTestPool</Arg>
        <Arg>
            <New class="org.sqlite.SQLiteConnectionPoolDataSource">
                <Set name="driverClassName">org.sqlite.JDBC</Set>
                <Set name="url">jdbc:sqlite:c:\\db\\base</Set>
            </New>
        </Arg>
    </New>
</Configure>
<Configure  class="org.eclipse.jetty.webapp.WebAppContext">
<New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource">
 <Arg></Arg>
 <Arg>jdbc/ds</Arg>
 <Arg>
   <New class="com.zaxxer.hikari.HikariDataSource">
     <Arg>
        <New class="com.zaxxer.hikari.HikariConfig">
           <Set name="dataSourceClassName">org.sqlite.SQLiteDataSource</Set>
           <Call name="addDataSourceProperty">
              <Arg>url</Arg>
              <Arg>jdbc:sqlite:path/to/test.db</Arg>
           </Call>
        </New>
     </Arg>
  </New>
</Arg>
<resource-ref id="ds">
    <res-ref-name>jdbc/ds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
(DataSource)new InitialContext().lookup("java:/comp/env/jdbc/ds");
...