2017-09-17 4 views
0

J'essaie d'utiliser derby de base de données intégrée avec cadre de printemps. Je peux insérer les données et les lire. Tout fonctionne parfaitement, sauf pour une chose que la base de données ne persiste pas. Lorsque je ferme l'application et que je l'exécute à nouveau, les données ne sont pas présentes. Je suppose que la base de données est créée à nouveau mais je ne sais pas pourquoi.La base de données intégrée de Derby ne persiste pas

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

} 
} 

et les journaux de sortie par ressort sont

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 contenu sont

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

SOLUTION: réponse acceptée en a bonne direction, mais l'erreur était some-db; crea te = true n'a pas pu démarrer. Ensuite, j'ai regardé comment l'IDE Netbeans créait la connexion derby. Le problème était crée = true, je pense que ce n'est pas censé être envoyé à l'URL, mais avec des propriétés comme le montrent dans le code ci-dessous:

@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 peut donner une erreur si la table existe déjà pas IF EXISTS en derby l'a donc emballé dans l'essai-catch.

Bean datasourceInitializer est explicitement nommé 'Application.dataSourceInitializer' car l'auto-configuration du ressort a tendance à le surcharger. Check it here.

+0

car il est intégré. Base de données intégrée comme dans les bases de données qui n'ont pas besoin de serveur et qui sont intégrées dans une application. Cela signifie que tout est géré par l'application. Si vous fermez votre application, votre base de données s'arrête également. –

+0

Bon, alors que faire si j'ai besoin de données pour persister mais que je ne veux pas installer de serveur sur la machine client et que les données ne sont pas si importantes pour un service web – vp131

+0

Essayez d'apprendre les bases de Derby en travaillant le tutoriel Derby: http://db.apache.org/derby/docs/10.13/getstart/ –

Répondre

0

C'est le cœur de votre problème: jdbc:derby:memory:some-db;create=true

Quand vous dites « mémoire » dans votre URL de connexion JDBC Derby, vous dites Derby explicitement de faire une base de données non durable. Si vous supprimez le 'memory:' de votre URL JDBC Connectino, Derby créera une base de données persistante et durable dans le répertoire 'some-db' de votre disque dur.

+0

Comment créer une base de données non-mémoire avec jdbc: embedded-database? J'essaye la manière traditionnelle avec le haricot de datasource et le passant à jdbc: initialize-base de données mais il a été impossible de démarrer la base de données C: \ some-db? Create = true – vp131

+0

Peut-être pourriez-vous commencer une nouvelle question avec votre Problème "Impossible de démarrer la base de données", car il s'agit d'un problème différent de votre problème initial. –

+0

Je l'ai mentionné dans edit. Impossible de démarrer la base de données 'some-db; create = true' est survenu en raison de la propriété 'create = true'. Il n'était pas supposé être envoyé avec l'URL db mais avec l'objet Properties. Je ne l'ai pas trouvé n'importe où plutôt trouvé en regardant les propriétés de base de données derby dans Netbeans et comment il a créé la base de données. Dois-je commencer une nouvelle question pour ce problème et y répondre? – vp131