Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 246|回复: 0

[默认分类] HSQLDB: java程序使用hsqldb 入门教程 java启动hsqldb (初步hsqldb效率评估)

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-15 19:15:33 | 显示全部楼层 |阅读模式
    使用java写单机小程序或者测试项目的时候,使用hsqldb是一个不错的选择。
      
    介绍可以看这里:
    http://www.javaeye.com/topic/78887
    http://hi.baidu.com/mum0532/blog/item/b08c0c6d88e0faf9431694e5.HTML
    从官网下载的压缩包,解压后的demo目录中,可以运行runManagerSwing,打开可视化管理界面(但没有可视化创建表,创建字段的功能)

      
    连接的时候,先选择server模式,然后在下图的红框处输入启动服务的端口和数据库名称。例如jdbc:hsqldb:hsql://localhost:9002/test
    这里9002是我程序启动hsqldb的时候使用的端口,test是建立的数据库名称

      
    HSQLDB创建数据库和基本的数据库访问:
    http://hi.baidu.com/Hivemind/blog/item/83873bdf36611c1462279825.html
    HSLQDB的sql语法跟MySQL的略有不同,使得很郁闷啊~~开始我都不知道怎么初始化HSQLdb的数据
      
    HSQLDB和Hibernate结合的一个小例子:
    http://hi.baidu.com/hivemind/blog/item/2c77fb00830e5a16738b6506.html
      
    我自己写的一个Java类(只需要加入hsqldb.jar即可)
      

    1.   
    2.    
    3.    /**
    4.    
    5. * 方便单机程序使用HSQL的工具类,包括启动,关闭,连接。数据库默认不加密,用户为sa,密码空
    6. *
    7.    @author
    8.     郑高强
    9.    */
    10.    
    11.    public
    12.    
    13.    class
    14.     HSQL_Util {
    15.    public
    16.    
    17.    static
    18.    
    19.    final
    20.    
    21.    int
    22.     PORT
    23.    =
    24.    
    25.    9002
    26.    ;
    27.    public
    28.    
    29.    static
    30.    
    31.    final
    32.     String DB_NAME
    33.    =
    34.    
    35.    "
    36.    kenko
    37.    "
    38.    ;
    39.    //
    40.    数据库文件名,同时也是本类中的数据库名
    41.    
    42.    
    43.    public
    44.    
    45.    static
    46.    
    47.    final
    48.     String DB_PATH
    49.    =
    50.    
    51.    "
    52.    ./db/
    53.    "
    54.    ;
    55.    public
    56.    
    57.    static
    58.    
    59.    final
    60.     String USER_NAME
    61.    =
    62.    
    63.    "
    64.    sa
    65.    "
    66.    ;
    67.    public
    68.    
    69.    static
    70.    
    71.    final
    72.     String PASSWORD
    73.    =
    74.    
    75.    ""
    76.    ;
    77.    public
    78.    
    79.    static
    80.    
    81.    final
    82.    
    83.    int
    84.     SERVER_MODE
    85.    =
    86.    
    87.    0
    88.    ;
    89.    public
    90.    
    91.    static
    92.    
    93.    final
    94.    
    95.    int
    96.     STAND_ALONE_MODE
    97.    =
    98.    
    99.    1
    100.    ;
    101.    //
    102.    In-Process
    103.    
    104.    
    105.    public
    106.    
    107.    static
    108.    
    109.    int
    110.     mode
    111.    =
    112.     SERVER_MODE;
    113.    //
    114.    记录当前用什么模式,开发时用Server,发布时用standalone
    115.    
    116.    
    117.    /**
    118.    
    119. * 启动数据库服务
    120.    */
    121.    
    122.    public
    123.    
    124.    static
    125.    
    126.    boolean
    127.     startHSQL() {
    128.    if
    129.     (mode
    130.    ==
    131.     SERVER_MODE) {
    132. Server server
    133.    =
    134.    
    135.    new
    136.     Server();
    137.    //
    138.    它可是hsqldb.jar里面的类啊。
    139.    
    140.     server.setDatabaseName(
    141.    0
    142.    , DB_NAME);
    143. server.setDatabasePath(
    144.    0
    145.    , DB_PATH
    146.    +
    147.     DB_NAME);
    148. server.setPort(PORT);
    149. server.setSilent(
    150.    true
    151.    );
    152. server.start();
    153.    //
    154.    自动多线程运行
    155.    
    156.     System.out.println(
    157.    "
    158.    hsqldb started...
    159.    "
    160.    );
    161. }
    162.    else
    163.    
    164.    if
    165.     (mode
    166.    ==
    167.     STAND_ALONE_MODE) {
    168.    //
    169.    standalone模式,打开连接就同时启动数据库,所以这里可以什么都不做
    170.    
    171.     }
    172.    try
    173.     {
    174. Thread.sleep(
    175.    800
    176.    );
    177.    //
    178.     等待Server启动
    179.    
    180.     }
    181.    catch
    182.     (InterruptedException e) {
    183. }
    184.    return
    185.    
    186.    true
    187.    ;
    188. }
    189.    /**
    190.    
    191. * 关闭数据库服务
    192.    */
    193.    
    194.    public
    195.    
    196.    static
    197.    
    198.    boolean
    199.     stopHSQL() {
    200.    try
    201.     {
    202. Statement statement
    203.    =
    204.     getConnection().createStatement();
    205. statement.executeUpdate(
    206.    "
    207.    SHUTDOWN;
    208.    "
    209.    );
    210.    return
    211.    
    212.    true
    213.    ;
    214. }
    215.    catch
    216.     (SQLException ex) {
    217. Logger.getLogger(HSQL_Util.
    218.    class
    219.    .getName()).log(Level.SEVERE,
    220.    null
    221.    , ex);
    222.    return
    223.    
    224.    false
    225.    ;
    226. }
    227. }
    228.    /**
    229.    
    230. * 获取连接
    231.    */
    232.    
    233.    public
    234.    
    235.    static
    236.     Connection getConnection() {
    237. Connection conn
    238.    =
    239.    
    240.    null
    241.    ;
    242.    try
    243.     {
    244. Class.forName(
    245.    "
    246.    org.hsqldb.jdbcDriver
    247.    "
    248.    );
    249.    if
    250.     (mode
    251.    ==
    252.     SERVER_MODE) {
    253. conn
    254.    =
    255.     DriverManager.getConnection(
    256.    "
    257.    jdbc:hsqldb:hsql://localhost:
    258.    "
    259.    
    260.    +
    261.     PORT
    262.    +
    263.    
    264.    "
    265.    /
    266.    "
    267.    
    268.    +
    269.     DB_NAME, USER_NAME, PASSWORD);
    270. }
    271.    else
    272.    
    273.    if
    274.     (mode
    275.    ==
    276.     STAND_ALONE_MODE) {
    277. conn
    278.    =
    279.     DriverManager.getConnection(
    280.    "
    281.    jdbc:hsqldb:file:
    282.    "
    283.    
    284.    +
    285.     DB_PATH
    286.    +
    287.     DB_NAME, USER_NAME, PASSWORD);
    288. }
    289. }
    290.    catch
    291.     (ClassNotFoundException ex) {
    292. Logger.getLogger(HSQL_Util.
    293.    class
    294.    .getName()).log(Level.SEVERE,
    295.    null
    296.    , ex);
    297. }
    298.    catch
    299.     (SQLException ex) {
    300. Logger.getLogger(HSQL_Util.
    301.    class
    302.    .getName()).log(Level.SEVERE,
    303.    null
    304.    , ex);
    305. }
    306.    return
    307.     conn;
    308. }
    309.    /**
    310.    
    311. * 测试
    312.    */
    313.    
    314.    public
    315.    
    316.    static
    317.    
    318.    void
    319.     main(String[] args) {
    320. HSQL_Util.mode
    321.    =
    322.     HSQL_Util.STAND_ALONE_MODE;
    323. HSQL_Util.startHSQL();
    324. Connection conn
    325.    =
    326.     HSQL_Util.getConnection();
    327.    try
    328.     {
    329. Statement statement
    330.    =
    331.     getConnection().createStatement();
    332. statement.executeUpdate(
    333.    "
    334.    create table customer(id integer not null primary key,firstname varchar,lastname varchar)
    335.    "
    336.    );
    337.    for
    338.     (
    339.    int
    340.     i
    341.    =
    342.    
    343.    10
    344.    ; i
    345.    <
    346.    
    347.    20
    348.    ; i
    349.    ++
    350.    ) {
    351. statement.executeUpdate(
    352.    "
    353.    insert into customer values(
    354.    "
    355.    
    356.    +
    357.     i
    358.    +
    359.    
    360.    "
    361.    ,"liu","zhaoyang")
    362.    "
    363.    );
    364. }
    365. statement.close();
    366. }
    367.    catch
    368.     (SQLException ex) {
    369. Logger.getLogger(HSQL_Util.
    370.    class
    371.    .getName()).log(Level.SEVERE,
    372.    null
    373.    , ex);
    374. }
    375. HSQL_Util.stopHSQL();
    376. }
    377. }
    378.   
    复制代码


      
      
    运行上述的类,在项目目录,会生成一个db文件夹,里边有数据库的一些基本文件:

      
      
    HSQL速度测试:


    1.   
    2.    
    3.     String note
    4.    =
    5.    
    6.    "
    7.    XXXX
    8.    "
    9.    ;
    10.    //
    11.    这里省略,实际是800个中文字
    12.    
    13.     System.out.println(note.length());
    14. HSQL_Util.mode
    15.    =
    16.     HSQL_Util.STAND_ALONE_MODE;
    17. HSQL_Util.startHSQL();
    18. Connection conn
    19.    =
    20.     HSQL_Util.getConnection();
    21.    try
    22.     {
    23. Statement statement
    24.    =
    25.     getConnection().createStatement();
    26. statement.executeUpdate(
    27.    "
    28.    [b]create cached table [/b]customer(id integer not null primary key,firstname varchar,lastname varchar)
    29.    "
    30.    );
    31.    for
    32.     (
    33.    int
    34.     i
    35.    =
    36.    
    37.    1
    38.    ; i
    39.    <
    40.    
    41.    60000
    42.    ; i
    43.    ++
    44.    ) {
    45.    //
    46.    插入6万条数据用了43秒,生成262M的文件
    47.    
    48.     statement.executeUpdate(
    49.    "
    50.    insert into customer values(
    51.    "
    52.    
    53.    +
    54.     i
    55.    +
    56.    
    57.    "
    58.    ,"
    59.    "
    60.    
    61.    +
    62.     note
    63.    +
    64.    
    65.    "
    66.    ","zhaoyang")
    67.    "
    68.    );
    69. }
    70. statement.executeQuery(
    71.    "
    72.    select * from customer where id = 40
    73.    "
    74.    );
    75.    //
    76.    6万条数据用了9秒
    77.    
    78.     statement.close();
    79. }
    80.    catch
    81.     (SQLException ex) {
    82. Logger.getLogger(HSQL_Util.
    83.    class
    84.    .getName()).log(Level.SEVERE,
    85.    null
    86.    , ex);
    87. }
    88. HSQL_Util.stopHSQL();
    89. }
    90.   
    复制代码


      

    使用HSQL的时候,就需要注意创建表用什么类型了!!!
    开始我不知道,使用了默认的Momery表,“create table” 测试了一下,速度慢得吐血。写6万条记录,用了五十多秒,而且只是写到3万多就崩溃了,内存溢出~~哈哈,其实也正常,十几M数据爆了~~然后从这3万个记录,select * from custemer where id = XX,用了几秒钟
      
    后来我再找方法,换成cached方法,create cached table试了一下,果然有效果,直接写6万个记录,没有爆,用了43秒。
    再select就用了9秒。相对而言,比momery表好一点。但看了一下数据文件,我~~~竟然生成了262M的数据文件!!!!!


    唉,我累了~~不玩了,HSQL没有想象中这么好用~~还是老老实实,用MySQL,或者自己写txt吧~~
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-30 04:09 , Processed in 0.409403 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表