gpt4 book ai didi

java - servlet 中的 Jetty 和 SQLite 连接

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:01:39 28 4
gpt4 key购买 nike

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

Class.forName("org.sqlite.JDBC");
String url = "jdbc:sqlite:c:\\db\\base";
Connection con = DriverManager.getConnection(url);

这在 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>

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>

pom.xml - 依赖关系。

即使不更改代码(更改为使用池),此配置也会在 jetty 控制台中产生错误:java.lang.reflect.InvocationTargetException
在 sun.reflect.NativeMethodAccessorImpl.invoke0( native 方法)
在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)
....
由以下原因引起:
java.lang.IllegalStateException:在 org.eclipse.jetty.plus.webapp.PlusDescriptorProcessor.bindEntry(PlusDescriptorProcessor.java:895) 没有绑定(bind)名称 jdbc/DSTestPool
...

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

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

最佳答案

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

  • org.eclipse.jetty.plus.jndi.EnvEntry:用于env-entry类型的条目
  • 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>

您的 jetty.xml 文件具有名称和值,但缺少范围。尝试使用以下 JVM 实例范围(名称在 JVM 实例中是唯一的)

<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>

或者类似下面的 Web 应用程序上下文范围(名称对于 WebAppContext 实例是唯一的)

<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>

参见文档 here了解详情。

关于java - servlet 中的 Jetty 和 SQLite 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28384109/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com