2017-09-17 118 views
0

我正尝试在spring框架中使用嵌入式数据库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 
); 

SOLUTION: 接受的答案中指出正确的方向,但错误是一些数据库;克雷阿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; 
} 

脚本创建-db.sql如果已经存在的表,因为没有IF EXISTS可以给错误在德比这样包裹在试试看。

Bean datasourceInitializer被显式命名为'Application.dataSourceInitializer',因为spring自动配置往往会覆盖它。检查它here.

+0

因为它是嵌入式的。嵌入式数据库与不需要服务器的数据库一样,嵌入在应用程序中。这意味着一切都由应用程序管理。如果你关闭你的应用程序,你的数据库也会关闭。 –

+0

好吧,如果我需要数据来坚持,但不想在客户端计算机上安装任何服务器,并且数据对于制作Web服务并不那么重要,那么该怎么办 – vp131

+0

请尝试通过以下方式学习Derby的基础知识: Derby教程:http://db.apache.org/derby/docs/10.13/getstart/ –

回答

0

这是你的问题的核心:jdbc:derby:memory:some-db;create=true

当你说你的德比JDBC连接URL“记忆”,你告诉德比明确地做出非持久数据库。

如果从JDBC Connectino URL中删除'memory:',Derby将在硬盘上的'some-db'目录中创建持久耐用的数据库。

+0

如何用jdbc:embedded-database创建非内存数据库?我正在尝试使用数据源bean的传统方式,并将它传递给jdbc:initialize-database,但它说未能启动数据库C:\ some-db?create = true – vp131

+0

也许你可以在你的问题开始一个新的问题“未能启动数据库”问题,因为它与您最初的问题不同。 –

+0

我在编辑中提到过这个。 由于'create = true'属性而导致无法启动数据库'some-db; create = true'。它不应该与数据库URL一起发送,而是使用Properties对象。我无法在任何地方找到它,而是通过查看Netbeans中的derby数据库属性以及它如何创建数据库来找出它。我应该为这个问题开始一个新的问题并回答它吗? – vp131

相关问题