使用HSQLDB数据库的Tomcat部署应用程序,提供JDBCConnectionException

时间:2016-08-28 19:30:26

标签: java spring tomcat hsqldb

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

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

1。两个配置位置

另一个步骤是JSF页面打印出样本bean内容。工作也好。但是我在资源和配置方面遇到了困难:

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

    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
    

如何让他们轻松互相沟通?如果Web应用程序从 webapp 中的applicationContext启动,则需要使用保存在资源中的数据库。所以它迫使我用classpath等所有导入等作为前缀,例如。

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

Java控制台应用程序仍适用于这些装饰。你能建议我一个更好的方法吗?我导入applicationContext.xml所有存储在int spring-module.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

注入所有bean之后(运行良好,因为我在控制台上测试了它),我收到了Tomcat上的错误。这是缩短版本的第一行:

  

org.springframework.transaction.CannotCreateTransactionException:无法打开Hibernate Session进行事务处理;嵌套异常是org.hibernate.exception.JDBCConnectionException:无法打开连接

     

引起:org.hibernate.exception.JDBCConnectionException:无法打开连接   引起:java.sql.SQLException:没有为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上的完整源代码。

1 个答案:

答案 0 :(得分:2)

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

HSQLDB的连接字符串是:

jdbc:hsqldb:res:/database/customers

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

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

res
  

/database/customers:存储在Java资源中,例如Jar,并且始终是只读的。

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

但是,如果要更新它,则必须使用其他方法。一种典型的方法是使用Server Database URL,数据库托管在服务器上,可能select date_format(t.the_date, '%m-%d-%Y') as date, video_id, count(distincct user_id) as count_unique_users from video_status group by date_format(created_at, '%m-%d-%Y'), video_id 用于测试目的。