2017-09-17 1 views
0

스프링 프레임 워크와 함께 내장 데이터베이스 Derby를 사용하려고합니다. 데이터를 삽입하고 읽을 수 있습니다. 데이터베이스가 지속되지 않는 한 가지를 제외하고는 모든 것이 완벽하게 작동합니다. 응용 프로그램을 닫고 다시 실행하면 데이터가 없습니다. 나는 데이터베이스가 다시 생성되었지만 이유를 모르겠다 고 생각합니다.Derby 내장 데이터베이스가 지속되지 않음

내 코드 : 허용 대답에 지적 : 봄

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 

public class MainClass 

{ 
@Bean 
public DataSource dataSource() 
{ 

     // no need shutdown, EmbeddedDatabaseFactoryBean will take care of this 
     EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
     EmbeddedDatabase db = builder 
       .setType(EmbeddedDatabaseType.DERBY) //.HSQL, .H2 or .DERBY 
       .setName("some-db") 
       .addScript("/create-db.sql") 
       .build(); 
     return db; 
} 

@Bean 
public DataSourceTransactionManager transactionManager(DataSource dataSource) 
{ 
    DataSourceTransactionManager d = new DataSourceTransactionManager(dataSource); 
    return d; 
} 

public static void main(String[] args) 
{ 

    ConfigurableApplicationContext context = new SpringApplicationBuilder(MainClass.class).headless(false).run(args); 
    MainFrame.mf = context.getBean(MainFrame.class); 
    MainFrame.mf.setVisible(true); 
    UserService userService = new UserService(); 

    if(userService.isSignedIn()) 
    { 
     MainFrame.mf.loggedIn(); 
    } 
    else 
    { 
     MainFrame.mf.loggedOut(); 
    } 

} 
} 

그리고 출력 로그

2017-09-17 20:41:53.461 INFO 3516 --- [   main] com.some.MainClass      : Starting MainClass on maker with PID 3516 (C:\..\NetbeansProjects\..\target\classes started by verma in C:\..\NetbeansProjects\proj) 
2017-09-17 20:41:53.469 INFO 3516 --- [   main] com.some.MainClass      : No active profile set, falling back to default profiles: default 
2017-09-17 20:41:53.571 INFO 3516 --- [   main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]2df32bf7: startup date [Sun Sep 17 20:41:53 IST 2017]; root of context hierarchy 
2017-09-17 20:41:56.974 INFO 3516 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http) 
2017-09-17 20:41:57.007 INFO 3516 --- [   main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 
2017-09-17 20:41:57.010 INFO 3516 --- [   main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.16 
2017-09-17 20:41:57.278 INFO 3516 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]  : Initializing Spring embedded WebApplicationContext 
2017-09-17 20:41:57.279 INFO 3516 --- [ost-startStop-1] o.s.web.context.ContextLoader   : Root WebApplicationContext: initialization completed in 3714 ms 
2017-09-17 20:41:57.606 INFO 3516 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 
2017-09-17 20:41:57.616 INFO 3516 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 
2017-09-17 20:41:57.618 INFO 3516 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 
2017-09-17 20:41:57.618 INFO 3516 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 
2017-09-17 20:41:57.619 INFO 3516 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 
2017-09-17 20:41:58.028 INFO 3516 --- [   main] o.s.j.d.e.EmbeddedDatabaseFactory  : Starting embedded database: url='jdbc:derby:memory:some-db;create=true', username='sa' 
2017-09-17 20:41:58.883 INFO 3516 --- [   main] o.s.jdbc.datasource.init.ScriptUtils  : Executing SQL script from class path resource [create-db.sql] 
2017-09-17 20:41:59.248 INFO 3516 --- [   main] o.s.jdbc.datasource.init.ScriptUtils  : Executed SQL script from class path resource [create-db.sql] in 365 ms. 
2017-09-17 20:42:00.907 INFO 3516 --- [   main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot[email protected]2df32bf7: startup date [Sun Sep 17 20:41:53 IST 2017]; root of context hierarchy 
2017-09-17 20:42:01.052 INFO 3516 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/login],methods=[POST]}" onto java.util.Map com.some.connection.ConnectionController.login(java.lang.String) 
2017-09-17 20:42:01.055 INFO 3516 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/logout],methods=[POST]}" onto org.springframework.http.ResponseEntity com.some.connection.ConnectionController.logout(java.lang.String) 
2017-09-17 20:42:01.062 INFO 3516 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 
2017-09-17 20:42:01.063 INFO 3516 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 
2017-09-17 20:42:01.153 INFO 3516 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2017-09-17 20:42:01.155 INFO 3516 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2017-09-17 20:42:01.250 INFO 3516 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2017-09-17 20:42:01.717 INFO 3516 --- [   main] o.s.j.e.a.AnnotationMBeanExporter  : Registering beans for JMX exposure on startup 
2017-09-17 20:42:01.829 INFO 3516 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 
2017-09-17 20:42:01.840 INFO 3516 --- [   main] com.some.MainClass      : Started MainClass in 9.034 seconds (JVM running for 9.794) 
2017-09-17 20:42:06.305 INFO 3516 --- [  Thread-6] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot[email protected]2df32bf7: startup date [Sun Sep 17 20:41:53 IST 2017]; root of context hierarchy 
2017-09-17 20:42:06.314 INFO 3516 --- [  Thread-6] o.s.j.e.a.AnnotationMBeanExporter  : Unregistering JMX-exposed beans on shutdown 
2017-09-17 20:42:06.348 INFO 3516 --- [  Thread-6] o.s.j.d.e.EmbeddedDatabaseFactory  : Shutting down embedded database: url='jdbc:derby:memory:some-db;create=true' 

만들-db.sql 내용

CREATE TABLE table_connection 
(
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), 
ip VARCHAR(50) UNIQUE, 
sessionId VARCHAR(50) DEFAULT NULL 
); 

해결책이 있습니다 옳은 방향이지만 오류는 약간의 - db; crea te = true를 시작하지 못했습니다. 그런 다음 Netbeans IDE가 더비 연결을 만드는 방법을 살펴 보았습니다. 문제는이 URL을하지만 아래의 코드 쇼 등의 속성과 함께 전송되지 않는 것으로 생각 사실 = 생성했다 :

@Bean 
public DataSource dataSource() 
{ 
    DriverManagerDataSource dm = new DriverManagerDataSource("jdbc:derby:some-db", "root", "root"); 

    Properties properties = new Properties(); 
    properties.setProperty("create", "true"); 

    dm.setConnectionProperties(properties); 
    dm.setSchema("APP"); 
    dm.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver"); 

    return dm; 
} 

@Bean(name="Application.dataSourceInitializer") 
public DataSourceInitializer dataSourceInitializer(DataSource dataSource) 
{ 
    final DataSourceInitializer initializer = new DataSourceInitializer(); 
    initializer.setDataSource(dataSource); 
    try 
    { 
     JdbcTemplate jdbc = new JdbcTemplate(dataSource); 
     jdbc.queryForList("SELECT id FROM table_connection"); 
    } 
    catch(Exception e) 
    { 
     initializer.setDatabasePopulator(databasePopulator()); 
    } 
    return initializer; 
} 

@Value("classpath:create-db.sql") 
private Resource schemaScript; 

private DatabasePopulator databasePopulator() 
{ 
    final ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); 
    populator.addScript(schemaScript); 
    return populator; 
} 

스크립트에는 IF가 존재하지 않기 때문에 테이블이 이미 존재하는 경우 오류를 줄 수-db.sql을 만들 derby에서 try-catch로 감쌌다.

Bean datasourceInitializer는 스프링 자동 구성이이를 무시하는 경향이 있으므로 명시 적으로 'Application.dataSourceInitializer'라는 이름이 지정됩니다.

당신이 당신의 더비 JDBC 연결 URL에서 '메모리'라고 jdbc:derby:memory:some-db;create=true, 당신은 명시 적으로 비 내구성 데이터베이스를 만들기 위해 더비를 말하고있다 : 그것은 here.

+0

임베드되어 있기 때문입니다. 서버가 필요없고 응용 프로그램에 내장 된 데이터베이스와 마찬가지로 내장 데이터베이스. 이는 응용 프로그램이 모든 것을 관리한다는 의미입니다. 앱을 종료하면 db도 종료됩니다. –

+0

데이터를 유지해야하지만 클라이언트 시스템에 서버를 설치하지 않고 웹 서비스를 작성하는 데 데이터가 중요하지 않은 경우 어떻게해야합니까? – vp131

+0

길을 일함으로써 더비의 기본 사항을 배우십시오. Derby 자습서 : http://db.apache.org/derby/docs/10.13/getstart/ –

답변

0

이 문제의 핵심을 확인합니다.

JDBC Connectino URL에서 'memory :'를 제거하면 Derby는 하드 디스크의 'some-db'디렉토리에 지속적이고 내구성있는 데이터베이스를 생성합니다.

+0

jdbc : embedded-database로 비 메모리 데이터베이스를 만드는 방법은 무엇입니까? 내가 데이터 원본 콩을 전통적인 방법을 시도하고 그것을 JDBC에 전달 : 초기화 - 데이터베이스하지만 그것은 데이터베이스 C : \ some-db를 만들지 못했습니다? create = true – vp131

+0

아마 당신은 (당신이 관련 질문을 연구 한 후) 새로운 질문을 시작할 수 있습니다. "데이터베이스를 시작하지 못했습니다"라는 문제는 초기 문제와는 다른 문제이므로 –

+0

나는 이것을 편집에서 언급했다. 'some-db; create = true'데이터베이스를 시작하지 못했습니다. 'create = true'속성 때문에 발생했습니다. db url과 함께 보내지는 않지만 Properties 객체를 사용하여 전송해야합니다. 어디서나 Netbeans의 Derby 데이터베이스 속성과 데이터베이스 작성 방법을 살펴봄으로써 어디에서나 찾을 수있었습니다. 이 문제에 대한 새로운 질문을 시작하고 대답해야합니까? – vp131

관련 문제