[SPRING] HSQLDB를 웹 애플리케이션에 Spring 파일로 삽입하는 법
SPRINGHSQLDB를 웹 애플리케이션에 Spring 파일로 삽입하는 법
Spring과 함께 webApp를 가지고 있는데, 서버 모드에서 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)
그리고 그것은 단위 테스트를 통과하고 웹 앱에서 실패합니다.
나는 파일 모드에서 webapp을 실행할 때 HSQLDB가 데이터베이스의 파일을 찾지 못한다고 생각합니다.
데이터베이스의 데이터를 webapp의 루트에두고 web-inf 내부에 이미 넣으려고 시도했지만 작동하지 않습니다.
해결법
-
==============================
1.글쎄, 데이터베이스를 다음과 같이 jar 파일에 넣는다면 :
글쎄, 데이터베이스를 다음과 같이 jar 파일에 넣는다면 :
<property name="url" value="jdbc:hsqldb:res:/data/images" />
실패 할 경우 데이터베이스를 삽입하거나 수정하려고하면 읽기 전용으로 만 사용할 수 있습니다.
한 가지 해결책은 web.xml에 리스너를 넣는 것입니다. 그러면 응용 프로그램이 시작될 때 응용 프로그램 웹의 루트 경로로 초기화됩니다.
<?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의 경로를 얻을 수 있습니다. 누군가가 이것을 간단하게 만들 수 있다면 답을 게시하십시오.
-
==============================
2.나는 그 답을 여기에서 발견했다.
나는 그 답을 여기에서 발견했다.
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에 추가하고 war (모든 것을 maven으로 작성)을 tomcat에 deploy하면 작동합니다. 또한 Websphere 7에 배포하고 작동합니다.
그러나 부엉이 부두를 달릴 때 : 부두 부두를 달릴 때 항아리를 움켜 쥐게하지 않는다고 생각하지 않습니다.
-
==============================
3.절대 파일 경로를 사용해야합니다. 웹 응용 프로그램을 실행할 때 "현재"(또는 "작동중인") 디렉토리는 응용 프로그램 서버의 bin 폴더 일 가능성이 큽니다. 따라서 HSQLDB URL의 상대 경로를 지정하면 웹 응용 프로그램 루트의 상대 위치가 아닌이 파일을로드하려고 시도합니다.
절대 파일 경로를 사용해야합니다. 웹 응용 프로그램을 실행할 때 "현재"(또는 "작동중인") 디렉토리는 응용 프로그램 서버의 bin 폴더 일 가능성이 큽니다. 따라서 HSQLDB URL의 상대 경로를 지정하면 웹 응용 프로그램 루트의 상대 위치가 아닌이 파일을로드하려고 시도합니다.
from https://stackoverflow.com/questions/1380882/how-to-embed-hsqldb-in-file-with-spring-to-a-webapp by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 응용 프로그램이 시작될 때 데이터베이스에서 Ehcache로 데이터를로드하는 방법 (0) | 2019.04.02 |
---|---|
[SPRING] 스프링 MVC 인터셉터 매핑 문제 (0) | 2019.04.02 |
[SPRING] Spring 3.1 및 Hibernate 4의 현재 스레드 예외에 대해이 No Session이 발견 된 이유 (0) | 2019.04.02 |
[SPRING] 모든 jsp 페이지에 css 및 js 파일을 포함하십시오. (0) | 2019.04.02 |
[SPRING] Spring JPA / Hibernate EmptyInterceptor가 Entitymanager / Spring beans를 주입하지 않음 (0) | 2019.04.02 |