복붙노트

[SPRING] HSQLDB를 웹 애플리케이션에 Spring 파일로 삽입하는 법

SPRING

HSQLDB를 웹 애플리케이션에 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. ==============================

    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. ==============================

    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. ==============================

    3.절대 파일 경로를 사용해야합니다. 웹 응용 프로그램을 실행할 때 "현재"(또는 "작동중인") 디렉토리는 응용 프로그램 서버의 bin 폴더 일 가능성이 큽니다. 따라서 HSQLDB URL의 상대 경로를 지정하면 웹 응용 프로그램 루트의 상대 위치가 아닌이 파일을로드하려고 시도합니다.

    절대 파일 경로를 사용해야합니다. 웹 응용 프로그램을 실행할 때 "현재"(또는 "작동중인") 디렉토리는 응용 프로그램 서버의 bin 폴더 일 가능성이 큽니다. 따라서 HSQLDB URL의 상대 경로를 지정하면 웹 응용 프로그램 루트의 상대 위치가 아닌이 파일을로드하려고 시도합니다.

  4. from https://stackoverflow.com/questions/1380882/how-to-embed-hsqldb-in-file-with-spring-to-a-webapp by cc-by-sa and MIT license