首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >即使在关闭连接之后,数据仍然存在于h2数据库表中。

即使在关闭连接之后,数据仍然存在于h2数据库表中。
EN

Stack Overflow用户
提问于 2017-11-27 02:09:54
回答 1查看 1K关注 0票数 1

当我浏览了许多H2数据库教程时,默认情况下,关闭到数据库的最后一个连接会关闭数据库。对于内存中的数据库,这意味着内容丢失了.

我已经创建了Employee1表,插入了记录并关闭了连接。但是,如果在某个时候重新连接相同的db,我仍然能够检索Employee1数据。为什么数据仍然存在?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Connector {

static Connection conn = null;
static Statement stmt = null;

public static void main(String[] args) {

    System.out.println("Welcome!");
    Connector connector = new Connector();
    connector.createConnection();
    connector.createTable("Employee2");
    connector.insertRecord("Employee2");
    connector.readRecord("Employee2");
    connector.readRecord("Employee1"); //Employee1 Table which is created in previous execution but still it reads the data
    connector.closeConnection();
}

public void createConnection() {
    try {
        System.out.println("Creating connection");
        // STEP 1: Register JDBC driver
        Class.forName("org.h2.Driver");
        // STEP 2: Open a connection
        System.out.println("Connecting to database...");
        conn = DriverManager.getConnection("jdbc:h2:mem/db1", "sa", "");
    } catch (SQLException se) {
        // Handle errors for JDBC
        se.printStackTrace();
    } catch (Exception e) {
        // Handle errors for Class.forName
        e.printStackTrace();
    }

}

public void createTable(String tableName) {
    try {
        // STEP 3: Execute a query
        System.out.println("Creating table in given database with the name of ..." + tableName);
        stmt = conn.createStatement();
        String sql = "CREATE TABLE " + tableName + "(id INTEGER not NULL, " + " first VARCHAR(255), "
                + " last VARCHAR(255), " + " age INTEGER, " + " PRIMARY KEY ( id ))";
        stmt.executeUpdate(sql);
        System.out.println("Created table in given database...");

    } catch (SQLException se) {
        // Handle errors for JDBC
        se.printStackTrace();
    } catch (Exception e) {
        // Handle errors for Class.forName
        e.printStackTrace();
    }
}

public void insertRecord(String tableName) {
    try {
        // STEP 3: Execute a query
        stmt = conn.createStatement();
        String sql = "INSERT INTO " + tableName + " VALUES (500, 'Zara', 'Ali', 18)";

        stmt.executeUpdate(sql);
        sql = "INSERT INTO " + tableName + " VALUES (501, 'Mahnaz', 'Fatma', 25)";

        stmt.executeUpdate(sql);
        sql = "INSERT INTO " + tableName + " VALUES (502, 'Zaid', 'Khan', 30)";

        stmt.executeUpdate(sql);
        sql = "INSERT INTO " + tableName + " VALUES(503, 'Sumit', 'Mittal', 28)";

        stmt.executeUpdate(sql);
        System.out.println("Inserted records into the table...");
    } catch (SQLException se) {
        // Handle errors for JDBC
        se.printStackTrace();
    } catch (Exception e) {
        // Handle errors for Class.forName
        e.printStackTrace();
    }
}

public void readRecord(String tableName) {
    try {
        System.out.println("Reading data from "+tableName);
        stmt = conn.createStatement();
        String sql = "SELECT id, first, last, age FROM " + tableName;
        ResultSet rs = stmt.executeQuery(sql);

        // STEP 4: Extract data from result set
        while (rs.next()) {
            // Retrieve by column name
            int id = rs.getInt("id");
            int age = rs.getInt("age");
            String first = rs.getString("first");
            String last = rs.getString("last");

            // Display values
            System.out.print("ID: " + id);
            System.out.print(", Age: " + age);
            System.out.print(", First: " + first);
            System.out.println(", Last: " + last);
        }
        // STEP 5: Clean-up environment
        rs.close();
    } catch (SQLException se) {
        // Handle errors for JDBC
        se.printStackTrace();
    } catch (Exception e) {
        // Handle errors for Class.forName
        e.printStackTrace();
    } finally {
        // finally block used to close resources
        try {
            if (stmt != null)
                stmt.close();
        } catch (SQLException se2) {
        } // nothing we can do
    } // end try
}

public void closeConnection() {
    try {
        if (conn != null) {
            conn.close();
            System.out.println("Connection Closed..");
        }
    } catch (SQLException se) {
        se.printStackTrace();
    } // end finally try
}
}

上述程序的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Welcome!
Creating connection
Connecting to database...
Creating table in given database with the name of ...Employee2
Created table in given database...
Inserted records into the table...
Reading data from Employee2
ID: 500, Age: 18, First: Zara, Last: Ali
ID: 501, Age: 25, First: Mahnaz, Last: Fatma
ID: 502, Age: 30, First: Zaid, Last: Khan
ID: 503, Age: 28, First: Sumit, Last: Mittal
Reading data from Employee1
ID: 400, Age: 18, First: freeze, Last: Ali
ID: 401, Age: 25, First: dora, Last: Fatma
ID: 402, Age: 30, First: xer, Last: Khan
ID: 403, Age: 28, First: kilo, Last: Mittal
Connection Closed..
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-27 21:05:11

如您所见,这里

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jdbc:h2:mem/db1

用相对路径连接到本地数据库文件,因此数据仍然存在,因为它保存了一个文件。

对于内存中的数据库,连接字符串应该是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jdbc:h2:mem:db1

注意/:的区别

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47508375

复制
相关文章
让控件填满整个页面
一般用于左侧的Frame,比如左侧放了一个树控件。用<body onload="FillPage('FlyTreeView1')" scroll=no>调用即可。     <script language="javascript" type="text/javascript">       //将ctlid控件填充满当前的页面,多用于frame中       function FillPage(ctlid)       {         var obj=document.getElementById(ct
用户1075292
2018/01/23
9470
让ZeGraph在X方向上填满
默认的效果是 希望能够在x方向上填满,两边不留。尝试出来的方法是:用zg1.GraphPane.XAxis.Scale.Max 和Min来设置,而且必须在画完图后设置。 zg1.GraphPane.C
用户1075292
2018/01/23
4840
让ZeGraph在X方向上填满
wpf wrapPanel居中并从左到右排列
参考文章.net – WPF – 如何将WrapPanel中的所有项目居中? – Thinbug
全栈程序员站长
2022/09/15
3760
Lua游戏开发参考资料收集
List of game engines that use lua: 2D Agen (Lua; Windows) Blitwizard (Lua; Windows, Linux, Mac) Cocos2d-x (C++/Lua/JS; Windows, Linux, Mac; iOS/Android/BlackBerry) Corona (Lua; Windows, Mac; iOS/Android) EGSL (Pascal/Lua; Windows, Linux, Mac, Haiku) G
meteoric
2018/11/19
8820
Video里的poster填满窗口的方案
用Video播放视频,视频能自适应屏幕大小,但是它的Poster(海报封面)继承了原尺寸比例,无法自动缩放或拉伸,不得技巧的话,很难处理。
IT晴天
2018/08/20
2K0
VUE.DRAGGABLE实现从左到右拖拽功能
1、左边【一级、二级、三级】字样是不能拖拽的,【item1、item2…】可以拖拽
青梅煮码
2023/03/02
1.2K0
设置图片的透明度从左到右渐变
一、设置图片的透明度从左到右渐变 /** * 设置图片的透明度从左到右渐变,使右边缘平滑过渡(注意只跟着x坐标变) * * @param num 范围为0-100,0为全透明,100为不透明 */ public static Bitmap getTransAlphaBitmap(Bitmap sourceImg, float num) { if (sourceImg == null) { return null;
用户9854323
2022/06/25
1.8K0
Excel小技巧40:自动填满单元格
在Excel中,可以使用你已经输入到单元格中的数据填满整个单元格,并且会随着单元格尺寸的调整而自动填充,如下图1所示。
fanjy
2020/06/28
3K0
Excel小技巧40:自动填满单元格
15种手机游戏引擎和开发工具介绍
工欲善其事,必先利其器。对移动游戏开发者来说,高效实用的开发工具必不可少。近日,英国著名产业杂志《Develop》刊出了一篇文章,作者艾伦·李在文中推荐了15种移动游戏开发工具,从游戏引擎,到音效制作、推广等工具都有涉及。以下为原文主要内容编译。
全栈程序员站长
2022/08/31
3.3K0
15种手机游戏引擎和开发工具介绍
RPA 实战:让小姐姐填满你的硬盘(上)
首先打开另一个小网站 -- https://www.hwtelcloud.com/products/rpa,下载【设计器】,并进行使用激活;下载【执行器】,让程序自己动;此外还需下载浏览器驱动和安装浏览器插件。关于软件的下载安装等此处就不进行讲解,相信您能搞定!
胡琦
2021/09/09
2K1
7个最优秀的手机游戏引擎
随着智能手机成为主要的游戏平台,移动游戏引擎变得越来越流行。 下面将介绍7个最优秀的手机游戏引擎。
全栈程序员站长
2022/09/06
5.5K0
设计分享|基于单片机的从左到右流水灯
51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得51系列单片机为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
电子工程师成长日记
2022/08/09
1.1K0
设计分享|基于单片机的从左到右流水灯
设计分享|基于单片机的从左到右流水灯
51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
电子工程师成长日记
2022/12/14
8840
设计分享|基于单片机的从左到右流水灯
Platform SDK、Windows SDK简介
Platform SDK及Windows SDK是由微软公司出品的一个软件开发包,向在微软的Windows操作系统和.NET框架上开发软件和网站的程序员提供头文件、库文件、示例代码、开发文档和开发工具。
全栈程序员站长
2022/09/05
3.8K0
Java开发SDK详解->SDK开发
File ——》 Project Structure ——》 Project Settings ——》 Artifacts ——》 右栏左上角+ ——》JAR ——》 From Modules with dependencies——》OK
全栈程序员站长
2022/09/08
5.6K0
填满Github的绿色格子用我做的VSCode插件-Auto Commit
如果提交到其他分支,提交记录不会显示在绿色的格子里面,合并分支之后 才会显示在绿色格子里面。
OBKoro1
2020/10/27
1.4K0
填满Github的绿色格子用我做的VSCode插件-Auto Commit
SDK之我理解的SDK
这是SDK系列的倒数第二篇,其实应该是第一篇来着。最近发现写了两个月还没写完,进度有点慢,这几天抓紧时间写完。不过随即发现当时完全没想错,这部分还是最难写。先写一个成稿,后续想到更多的内容逐步补充和更新吧。 什么是SDK SDK即软件开发工具包(外语首字母缩写:SDK、外语全称:Software Development Kit)一般都是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。 ​上面这是百度百科对SDK的定义。但是现实中我们开发的SDK更多的是Seco
子勰
2018/05/22
2.7K0
[大家的项目] alipay_sdk_rust,Alipay sdk in rust 支付宝支付 SDK
alipay官方没有rust sdk,本人自己实现了一个,已经生产环境可用。基于gostd的http模块。
MikeLoveRust
2022/11/28
1.7K0
[大家的项目] alipay_sdk_rust,Alipay sdk in rust 支付宝支付 SDK
教你如何填满过去一年的Github的绿色格子-Auto Commit
如果提交到其他分支,提交记录不会显示在绿色的格子里面,合并分支之后 才会显示在绿色格子里面。
OBKoro1
2020/01/13
3.6K0
点击加载更多

相似问题

corona sdk scrollableView

12

Corona SDK旋转

11

Corona sdk + xmpp

12

ScreenShot (CORONA SDK)

22

Corona SDK SplashScreen

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文