我第一次尝试使用基于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,但它对我来说非常麻烦。
不久:
我的应用程序拒绝与部署在Tomcat上的数据库通信。以下是GitHub上的完整源代码。
答案 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
用于测试目的。