我和春天有个Web应用程序,它工作正常,当我在服务器模式下使用HSQLDB,但在文件模式下,它只通过单元测试。 这是我的数据源:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:hsql://localhost/images" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
我只是改变这一行
<property name="url" value="jdbc:hsqldb:hsql://localhost/images" />
( -- Server mode)
为了这
<property name="url" value="jdbc:hsqldb:file:data/images" />
(-- In file)
它只是通过了单元测试,并在网络APPP失败。
我想,在文件模式,当我运行web应用程序,HSQLDB未找到数据库文件。
我已经尝试过把数据库中的数据在Web应用程序的根和WEB-INF里面,这是行不通的。
好吧,如果你把数据库这样的罐子里面:
<property name="url" value="jdbc:hsqldb:res:/data/images" />
您只可以用它为只读,如果试图插入或修改数据库中,如果将失败。
一个解决方案是把听者在web.xml所以当应用程序启动,将CE与该应用程序网站的根路径初始化。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>maf</display-name>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--This is to get root of the aplication-->
<listener>
<listener-class>
org.atoms.HsqlDatabaseListener
</listener-class>
</listener>
<!--Este listener se encarga de inicializar todo el contenedor de Spring y mantener una variable en el
ServletContext que apunta a dicho contenedor -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
监听器:
package org.atoms;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
*
* @author atomsfat
*/
public class HsqlDatabaseListener implements ServletContextListener {
private ServletContext context = null;
public void contextInitialized(ServletContextEvent event) {
context = event.getServletContext();
String prefix = event.getServletContext().getRealPath("/");
System.out.println("database root " + prefix);
com.atoms.HsqlDatabasePathResolver.getInstance(prefix);
}
public void contextDestroyed(ServletContextEvent event) {
context = event.getServletContext();
}
其他类:
package com.atoms;
/**
*
* @author atomsfat
*/
public class HsqlDatabasePathResolver {
private static HsqlDatabasePathResolver instance ;
private static String applicationPath = "";
private HsqlDatabasePathResolver() {
}
/** Get Instance.
*/
static public synchronized HsqlDatabasePathResolver getInstance(String applicationPath) {
if (instance == null) {
HsqlDatabasePathResolver.applicationPath =
HsqlDatabasePathResolver.normalizePath(applicationPath);
instance = new HsqlDatabasePathResolver();
System.out.println("Inizalizando path : " + HsqlDatabasePathResolver.applicationPath);
}
return instance;
}
public String getApplicationPath() {
return applicationPath;
}
public String getUrlDatabase(String urlDatabase) {
return HsqlDatabasePathResolver.replaceAll(urlDatabase,"{apppath}", applicationPath);
}
/**
*
* replace the "\" character by "/" and remove relative paths
*
* @param path
* @return
*/
public static String normalizePath(String path) {
if (path == null) {
return null;
}
String normalized = path;
if (normalized.equals("/.")) {
return "/";
}
if (normalized.indexOf('\\') >= 0) {
normalized = normalized.replace('\\', '/');
}
if (!normalized.startsWith("/") && normalized.indexOf(':') < 0) {
normalized = "/" + normalized;
}
do {
int index = normalized.indexOf("//");
if (index < 0) {
break;
}
normalized = normalized.substring(0, index) + normalized.substring(index + 1);
} while (true);
do {
int index = normalized.indexOf("/./");
if (index < 0) {
break;
}
normalized = normalized.substring(0, index) + normalized.substring(index + 2);
} while (true);
do {
int index = normalized.indexOf("/../");
if (index >= 0) {
if (index == 0) {
return null;
}
int index2 = normalized.lastIndexOf('/', index - 1);
normalized = normalized.substring(0, index2) + normalized.substring(index + 3);
} else {
return normalized;
}
} while (true);
}
public static String replaceAll(String str, String match, String replace) {
if (match == null || match.length() == 0) {
return str;
}
if (replace == null) {
replace = "";
}
if(match.equals(replace))return str;
StringBuffer ret=new StringBuffer();
int i = str.indexOf(match);
int y = 0;
while (i >= 0)
{
//System.out.println("i:"+i+" y:"+y);
ret.append(str.substring(y, i));
ret.append(replace);
//str = str.substring(y, i) + replace + str.substring(i + match.length());
y = i + match.length();
i = str.indexOf(match,y);
}
ret.append(str.substring(y));
return ret.toString();
}
}
这是我在春天使用的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
<!-- La definición del Datasource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" lazy-init="true"
destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url">
<ref bean="dataBaseUrl"/>
</property>
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<!-- La definición del Factory de Session con Anotaciones -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" lazy-init="false">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.HSQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>Atoms.hbm.xml</value>
</list>
</property>
</bean>
<!--HibernaTemplate-->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- Definición de los DAO`s -->
<bean id="ipBlancaDao" class="org.atoms.impl.AtomsDaoHibernateImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<!--If your are not running in Web this will initialize with the directory from the process was started note that this classes is a singleton so if you are running in web the listener already have initialize the class with the path of the class-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<bean id="hsqlDatabasePathResolver" class="com.atoms.HsqlDatabasePathResolver" factory-method="getInstance" lazy-init="false">
<constructor-arg>
<value>${user.dir}</value>
</constructor-arg>
</bean>
<!--This bean just replace {apppath} whit the absolute path-->
<bean id="dataBaseUrl" class="java.lang.String" factory-bean="hsqlDatabasePathResolver" lazy-init="false"
factory-method="getUrlDatabase">
<constructor-arg>
<value>jdbc:hsqldb:mem:{apppath}/WEB-INF/data/maf</value>
</constructor-arg>
</bean>
</beans>
是的这项工作,但是是一个烂摊子,我认为解决的办法是监听器,有了它,你可以得到appWeb的路径。 如果有人可以使这个简单的,请张贴的答案。
我找到了答案在这里:
http://coding.derkeiler.com/Archive/Java/comp.lang.java.databases/2003-11/0096.html
我把去里面的数据在一个罐子里对我的项目persistenceLayerWithData.jar。
然后,我设置欢迎使用属性为数据源:
<property name="url" value="jdbc:hsqldb:res:/data/images" />
我添加的jar到WEB-INF / lib和使战争(这一切与Maven)和部署在Tomcat和它的作品,也是我在WebSphere 7部署和也适用。
但是,当我运行丝毫命令mvn码头:运行它不会我想,跑码头丝毫行家当它不把罐子的claspath。
您应该使用绝对路径。 当您运行Web应用程序,你的“电流”(或“工作”)目录是最有可能的bin
您的应用程序服务器的文件夹中。 因此,当您指定HSQLDB URL相对路径尝试,而不是某个地方相对于你的webapp根从那里加载此文件。