2017-09-17 5 views
0

Ich versuche, eingebettete Datenbank Derby mit Federrahmen zu verwenden. Ich kann die Daten einfügen und lesen. Bis auf eine Sache, für die die Datenbank nicht existiert, läuft alles ganz gut. Wenn ich die Anwendung schließe und sie erneut ausführe, sind die Daten nicht vorhanden. Ich vermute, dass die Datenbank neu erstellt wurde, weiß aber nicht warum.Derby eingebettete Datenbank nicht persistent

Mein Code:

@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(); 
    } 

} 
} 

und Ausgangsprotokolle durch Feder sind

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' 

create-db.sql Inhalt

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 
); 

Lösung sind: akzeptierte Antwort darauf in richtige Richtung, aber der Fehler war einige-db; crea te = true konnte nicht gestartet werden. Dann schaute ich mir an, wie Netbeans IDE die Derby-Verbindung erstellt hat. Problem war schaffen = wahr, ich denke, dass es nicht mit der URL gesendet wird angenommen hat, aber mit Eigenschaften wie Show in folgendem Code:

@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; 
} 

Script create-db.sql können Fehler geben, wenn die Tabelle bereits vorhanden ist, da keine IF EXISTS im Derby so eingepackt in Versuch-fangen.

Bean datasourceInitializer wird explizit 'Application.dataSourceInitializer' genannt, da die automatische Spring-Konfiguration diese überschreibt. Prüfen Sie es here.

+0

weil es eingebettet ist. Eingebettete Datenbank wie in Datenbanken, die keinen Server benötigen und in eine Anwendung eingebettet sind. Dies bedeutet, dass alles von der Anwendung verwaltet wird. Wenn Sie Ihre App herunterfahren, wird auch Ihre Datenbank heruntergefahren. –

+0

Okay, also was zu tun, wenn ich Daten persistieren muss, aber keinen Server auf dem Clientcomputer installieren möchte und Daten für einen Webdienst nicht so wichtig sind – vp131

+0

Versuchen Sie, die Grundlagen von Derby zu lernen, indem Sie sich durcharbeiten Das Derby-Tutorial: http://db.apache.org/derby/docs/10.13/getstart/ –

Antwort

0

Dies ist der Kern des Problems: jdbc:derby:memory:some-db;create=true

Wenn Sie sagen, ‚Gedächtnis‘ in Ihrer Derby JDBC-Verbindung URL, Sie Derby sagen explizit eine nicht-dauerhafte Datenbank zu machen.

Wenn Sie den 'memory:' aus Ihrer JDBC Connectino URL entfernen, erstellt Derby eine persistente, dauerhafte Datenbank im Verzeichnis 'some-db' auf Ihrer Festplatte.

+0

Wie erstellt man eine Nicht-Speicher-Datenbank mit jdbc: embedded-database? Ich versuche traditionelle Weise mit Datenquelle Bean und übergebe es zu jdbc: initialize-database aber es sagt, konnte Datenbank C: \ some-db nicht starten? Create = true – vp131

+0

vielleicht konnten Sie eine neue Frage (nach dem Erforschen in Verbindung stehenden Fragen) mit Ihrem beginnen Problem "Datenbank konnte nicht gestartet werden", da es sich um ein anderes Problem als das ursprüngliche Problem handelt. –

+0

Ich habe dies in Bearbeitung erwähnt. Das Starten der Datenbank 'some-db; create = true' ist aufgrund der Eigenschaft 'create = true' fehlgeschlagen. Es sollte nicht mit db url gesendet werden, sondern mit dem Properties-Objekt. Ich konnte es nirgends finden, sondern habe es herausgefunden, indem ich die Eigenschaften der Derby-Datenbank in Netbeans angeschaut habe und wie sie die Datenbank erstellt hat. Soll ich eine neue Frage zu diesem Thema starten und beantworten? – vp131

Verwandte Themen