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

标签 java spring tomcat hsqldb

我在第一次尝试基于 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/

相关文章:

java - 配置eclipse、tomcat和maven提高webapp的生产力

java - 来自 C++ 的 JNI 调用、FindClass 和导入

java - 如何在使用 ImageIO.read() 时解决 'java.io.EOFException: Unexpected end of ZLIB input stream'

java - 从请求 URL 中检索值

spring - Java EE 应用程序中的审核日志记录解决方案

java - 找不到 Spring Security : WebSecurityConfigurerAdapter. 类

java - 在 Java 中添加后递增

Spring Integration Webservice 与 RestTemplate

mysql - http ://java. sun.com/jsp/jSTL/core 无法在 web.xml 或随此应用程序部署的 jar 文件中解析

java - 在负载下收集 Java heapdump