gpt4 book ai didi

java - 使用 HSQLDB 数据库的 Tomcat 部署应用程序给出 JDBCConnectionException

转载 作者:行者123 更新时间:2023-11-28 22:40:45 25 4
gpt4 key购买 nike

我在第一次尝试基于 Spring、HSQLDB 和 JSF 上的 Hibernate 的小应用程序时遇到了困难,最终使用 Tomcat 进行了部署。我现在面临两个问题。

首先,我尝试基于 main (String args[]) 方法在控制台上运行 Java 应用程序,该方法从 spring-module.xml 获取 customerBo bean 并使用 Hibernate 从嵌入式 HSQLDB 中插入/删除。就像一个魅力。

<强>1。两个配置位置

另一个步骤是打印出示例 bean 内容的 JSF 页面。工作也一样。然而,我在资源和配置方面遇到了困难:

  • 资源:这是我对数据库的所有配置。

    src/main/resources
    \____ config
    \____ database
    \____ database.properties
    \____ spring/beans
    \____ data-source.xml
    \____ hibernate-session-factory.xml
    \____ spring-module.xml ... for Java Console Application
  • webapp:这里是所有与 JSF 相关的内容,包括与网页类应用程序相关的 WEB-INF 文件夹。

    src/main/webapp
    \___ WEB-INF
    \____ applicationContext.xml ... for web application
    \____ faces-config.xml
    \____ web.xml
    \___ default.xhtml

如何让他们之间轻松交流?如果网络应用程序从 webapp 中的 applicationContext 开始,它需要使用保存在 resources 中的数据库。所以它迫使我为所有导入等添加前缀 classpath 例如。

<import resource="classpath:/spring-module.xml"/> 
... or ...
<property name="location">
<value>classpath:/config/database/database.properties</value>
</property>

Java 控制台应用程序仍然可以很好地使用这些装饰。你能建议我一个更好的方法吗?我将所有存储在 spring-module.xml 中的数据库内容导入 applicationContext.xml:

<beans xmlns=....>
<import resource="classpath:/spring-module.xml"/>
<import resource="classpath:/bean.xml"/>

<bean id="customerBo" class="nch.spring.customer.bo.impl.CustomerBoImpl"></bean>
</beans>

这是我用来连接到 HSQLDB 的 URL

jdbc.url=jdbc:hsqldb:database/customers

<强>2。 Tomcat 上的 HSQLDB

我在外部部署在 Tomcat 上,而不是在 IDE 中。我运行 localhost:8080

注入(inject)所有 bean 后(运行良好,因为我在控制台上测试过),我在 Tomcat 上收到错误。这是带有 causing 的第一行的简化版本:

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Could not open connection

Caused by: org.hibernate.exception.JDBCConnectionException: Could not open connection Caused by: java.sql.SQLException: No suitable driver found for jdbc:hsqldb:database/customers

我的数据库位置与项目相关。它包含在 WAR 中:

project
\____ src/main/java
\____ src/main/resources
\____ src/main/webapp
\____ database
\____ customers
\____ customers.script
\____ customers.lck
\____ customers.properties

还有我的 HSQLDB 的 pom.xml:

<!-- HSQLDB -->
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.3.2</version>
</dependency>

为什么在部署在Tomcat上的JSF上使用Spring和Hibernate无法打印出数据库内容,但可以在控制台打印出来?还有另一种嵌入数据库的方法吗? Tomcat 完全支持 HSQLDB 吗?我曾尝试先使用 MySQL,但它对我来说太麻烦了。


很快:

  • HSQLDB 与 Spring 和 Hibernate 配合良好,在 Java 控制台应用程序上得到了证明。
  • JSF 页面也能正常工作,能够打印出任何 bean 的内容。

我的应用程序自部署到 Tomcat 后拒绝与数据库通信。这是我在 GitHub 上的完整源代码.

最佳答案

问题的核心是您将 HSQLDB 与数据库文件一起使用,该数据库文件实际上是您项目的资源(即在其类路径中)。这意味着该文件将嵌入到您的 WAR 中,您将无法更新它(因为 WAR 文件中的内容将是只读的)。

您的 HSQLDB 连接字符串是:

jdbc.url=jdbc:hsqldb:database/customers

当在您的 IDE 中运行时,您需要注意它不会将您的应用程序打包在 JAR 中,而是作为一个展开的目录。因此,当您将它作为控制台应用程序运行时,它会访问数据库文件并进行更新。但是,当打包在 WAR 中时,它不会找到它。

如果你的意图是做 read-only on the database ,您可以使用 Resource Database URL 配置 HSQLDB形式的

jdbc:hsqldb:res:/database/customers

res: stored in a Java resource, such as a Jar and always read-only.

这将从位于应用程序类路径的 /database/customers 中的资源加载数据库。

但是,如果你想更新它,那么你必须使用另一种方式。一种典型的方法是使用 Server Database URL ,其中数据库托管在服务器上,可能是 localhost 用于测试目的。

关于java - 使用 HSQLDB 数据库的 Tomcat 部署应用程序给出 JDBCConnectionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39195011/

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