可重用的 Hsqldb 启动、停止之 Ant 任务脚手架

可重用的 Hsqldb 启动、停止之 Ant 任务脚手架

 

立正。。。

稍息

讲一下

坐下。。。

 

在Eclipse里用Ant来启动Hsqldb

      <!-- Start the Hsqldb database server -->

      <targetname="dbstart"description="Start the Hsqldb database server">

            <javaclassname="org.hsqldb.Server"fork="yes"classpathref="hsqldb.classpath"failonerror="true">

                  <argvalue="-database.0"/>

                  <argvalue="file:${database.dir}/db"/>

            </java>

      </target>

此时如果要停止 Hsqldb ,即点击红色按钮来 Terminate 掉它,实现上,Hsqldb的Java线程还是在后台运行的,它并没有真正结束。

 

判断的方法有四种:

1、再次运行 ant startdb 任务,会发现 db.lck 还被使用,而 <delete dir="${database.dir}"/> 删除不了,被前一个实例 Lock 住了。

Buildfile: xxx/build.xml

startdb:

   [delete] Deleting directory xxx/database

 

BUILD FAILED

xxx/build.xml:88: Unable to delete file xxx/database/db.lck

 

2、利用JDK 5.0以上的版本中的 jps 来查看,即:

%JAVA_HOME%/bin/jps -lvm

你可以看到其中有如下的信息显示

<pid> org.hsqldb.Server -database.0 file:database/db

即表明它还是在运行当中。

 

3、netstat -a | find "9001"

 TCP    XXX:9001   XXX:0 LISTENING

发现 Hsqldb 默认的服务端口 9001 还在监听中。

 

4、再次运行你的数据库连接程序,程序运行正常,还是可以连接上去,并可以完全正常进行你的数据操作。

由上面的方法可见它还是在正常运行中,Eclipse里的红色按钮并没有真正 Terminate 掉它。

 

那如何真正停止掉它呢?同样也有几种方法。

1、利用 Ant 本身提供的 sql 任务,如下发送 SHUTDOWN [COMPACT|IMMEDIATELY] 命令过去就可以了,如下:

      <!-- Shutdown the Hsqldb database server via Ant sql Task -->

      <targetname="dbshutdown"description="Shutdown the Hsqldb database server via Ant sql Task">

            <echomessage="Ignore the message:'java.sql.SQLException: Connection is broken: java.io.EOFException', Don't care about it."/>

            <sqldriver="org.hsqldb.jdbcDriver"url="jdbc:hsqldb:hsql://localhost/"userid="sa"password=""classpathref="hsqldb.classpath"onerror="stop"print="true"><![CDATA[

            shutdown;

            ]]></sql>

      </target>

 

但是虽然这个可以让 Hsqldb Server 停止掉了,但是会报错误,build出现错误我是不能接受的,不知道你是否接受?

shutdowndb:

     [echo] Ignore the message:'java.sql.SQLException: Connection is broken: java.io.EOFException', Don't care about it.

      [sql] Executing commands

      [sql] 0 rows affected

 

BUILD FAILED

xxx/build.xml:124: java.sql.SQLException: Connection is broken: java.io.EOFException

 

打开 verbose 选项看一看更加详细的信息:

shutdowndb:

     [echo] Ignore the message:'java.sql.SQLException: Connection is broken: java.io.EOFException', Don't care about it.

      [sql] connecting to jdbc:hsqldb:hsql://localhost/

      [sql] Loading org.hsqldb.jdbcDriver using AntClassLoader with classpath xxx/lib/hsqldb.jar

 

BUILD FAILED

java.sql.SQLException: socket creation error

        at org.apache.tools.ant.taskdefs.JDBCTask.getConnection(JDBCTask.java:314)

        at org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:346)

        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)

        at org.apache.tools.ant.Task.perform(Task.java:364)

        at org.apache.tools.ant.Target.execute(Target.java:341)

        at org.apache.tools.ant.Target.performTasks(Target.java:369)

        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)

        at org.apache.tools.ant.Project.executeTarget(Project.java:1185)

        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)

        at org.apache.tools.ant.Project.executeTargets(Project.java:1068)

        at org.apache.tools.ant.Main.runBuild(Main.java:668)

        at org.apache.tools.ant.Main.startAnt(Main.java:187)

        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:246)

        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:67)

Caused by: java.sql.SQLException: socket creation error

        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)

        at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)

        at org.hsqldb.jdbcDriver.getConnection(Unknown Source)

        at org.hsqldb.jdbcDriver.connect(Unknown Source)

        at org.apache.tools.ant.taskdefs.JDBCTask.getConnection(JDBCTask.java:304)

        ... 13 more

--- Nested Exception ---

java.sql.SQLException: socket creation error

        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)

        at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)

        at org.hsqldb.jdbcDriver.getConnection(Unknown Source)

        at org.hsqldb.jdbcDriver.connect(Unknown Source)

        at org.apache.tools.ant.taskdefs.JDBCTask.getConnection(JDBCTask.java:304)

        at org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:346)

        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)

        at org.apache.tools.ant.Task.perform(Task.java:364)

        at org.apache.tools.ant.Target.execute(Target.java:341)

        at org.apache.tools.ant.Target.performTasks(Target.java:369)

        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)

        at org.apache.tools.ant.Project.executeTarget(Project.java:1185)

        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)

        at org.apache.tools.ant.Project.executeTargets(Project.java:1068)

        at org.apache.tools.ant.Main.runBuild(Main.java:668)

        at org.apache.tools.ant.Main.startAnt(Main.java:187)

        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:246)

        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:67)

 

也就是说在执行 SHUTDOWN 命令后,

org.apache.tools.ant.taskdefs.JDBCTask.getConnection(JDBCTask.java:314) 还去 getConnection,那肯定就出错了。

 

2、自己写个简单的 Ant 脚本来关闭它

ShutdownTask.java

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

import org.apache.tools.ant.BuildException;

import org.apache.tools.ant.Task;

 

/**

 *ShutdownTask:AntTaskforshutdowntheHsqldbserver.

 *

 *@authorYuLimin

 */

publicclass ShutdownTask extends Task

{

      // Defaut Value

      private String msg = "ShutdownTask";

      private String driver = "org.hsqldb.jdbcDriver";

      private String url = "jdbc:hsqldb:hsql://localhost/";

      private String userid = "sa";

      private String password = "";

      private String sqlCommand = "SHUTDOWN";

 

      public ShutdownTask()

      {

            super();

      }

 

      /**

       *ForTest

       *

       *@paramargv

       *@throwsException

       */

      publicstaticvoid main(final String[] argv)

      {

            final ShutdownTask shutdownTask = new ShutdownTask();

            shutdownTask.shutdown();

      }

 

      /**

       *Themethodexecutingthetask

       */

      publicvoid execute() throws BuildException

      {

            System.out.println(msg + " Begin......");

            System.out.println("Driver=" + getDriver());

            System.out.println("URL=" + getUrl());

            System.out.println("Userid=" + getUserid());

            System.out.println("Password=" + getPassword());

            System.out.println("SqlCommand=" + getSqlCommand());

            shutdown();

            System.out.println(msg + " End......");

            System.out.println();

      }

 

      /**

       *Shutdownthedatabase

       */

      publicvoid shutdown()

      {

            Connection connection = null;

            Statement statement = null;

            try

            {

                  Class.forName(getDriver());

                  connection = DriverManager.getConnection(getUrl(),getUserid(),getPassword());

                  statement = connection.createStatement();

                  statement.execute(getSqlCommand());

                  statement.close();

                  connection.close();

            }

            catch(Exception e)

            {

                  e.printStackTrace();

                  thrownew RuntimeException(e);

            }

            finally

            {

                  if(statement != null)

                  {

                        try

                        {

                              statement.close();

                        }

                        catch(SQLException e)

                        {

                              thrownew RuntimeException(e);

                        }

                  }

                  if(connection != null)

                  {

                        try

                        {

                              connection.close();

                        }

                        catch(SQLException e)

                        {

                              thrownew RuntimeException(e);

                        }

                  }

            }

      }

 

      // More accessor method : setter & getter

      publicvoid setMsg(final String msg)

      {

            this.msg = msg;

      }

 

      publicvoid setDriver(final String driver)

      {

            this.driver = driver;

      }

 

      publicvoid setPassword(final String password)

      {

            this.password = password;

      }

 

      publicvoid setUrl(final String url)

      {

            this.url = url;

      }

 

      publicvoid setUserid(final String userid)

      {

            this.userid = userid;

      }

 

      publicvoid setSqlCommand(final String sqlCommand)

      {

            this.sqlCommand = sqlCommand;

      }

 

      public String getDriver()

      {

            returndriver;

      }

 

      public String getPassword()

      {

            returnpassword;

      }

 

      public String getUrl()

      {

            returnurl;

      }

 

      public String getUserid()

      {

            returnuserid;

      }

 

      public String getSqlCommand()

      {

            returnsqlCommand;

      }

 

      public String getMsg()

      {

            returnmsg;

      }

}

 

编译 javac -classpath %ANT_HOME%/lib/ant.jar ShutdownTask.java

打包 jar cvf ShutdownTask.jar *.*

把 ShutdownTask.jar 直接放到项目的lib目录下,下面的示例 classpath 我直接引入到 hsqldb.classpath中,可以根据需要放到项目的不同地方再进行调整引入使用等等。。。:)

 

build.xml里的调用示例,爱怎么用就怎么用,提供好几个示例。

      <!-- Classpath declaration -->

      <pathid="hsqldb.classpath">

            <filesetdir="${lib.dir}">

                  <includename="**/hsqldb.jar"/>

                  <includename="**/ShutdownTask.jar"/>

            </fileset>

      </path>

 

      <!-- Shutdown the Hsqldb database server via ShutdownTask -->

      <targetname="dbshutdownTask"description="Shutdown the Hsqldb database server via ShutdownTask">

            <!-- Define ShutdownTask -->

            <taskdefname="shutdownTask"classname="ShutdownTask"classpathref="hsqldb.classpath"/>

            <!-- Call ShutdownTask -->

            <!-- Default ShutdownTask, only like this -->

            <!-- <shutdownTask/> -->

            <!-- Sample MyShutdownTask -->

            <!-- <shutdownTask driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:hsql://localhost/" userid="sa" password="" sqlCommand="SHUTDOWN" msg="MyShutdownTask"/> -->

            <!-- Sample MyShutdownTask SHUTDOWN COMPACT -->

            <!-- <shutdownTask driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:hsql://localhost/" userid="sa" password="" sqlCommand="SHUTDOWN COMPACT" msg="MyShutdownTask"/> -->

            <!-- Sample MyShutdownTask SHUTDOWN IMMEDIATELY -->

            <shutdownTaskdriver="org.hsqldb.jdbcDriver"url="jdbc:hsqldb:hsql://localhost/"userid="sa"password=""sqlCommand="SHUTDOWN IMMEDIATELY"msg="MyShutdownTask"/>

      </target>

 

3、就在直接在命令行下运行 ant startdb ,然后 Ctrl + C 直接干掉它就可以。

            如启动时的提示:From command line, use [Ctrl]+[C] to abort abruptly

 

补充

OS:Windows 2K Pro SP4 English

ant -version

Apache Ant version 1.6.5 compiled on June 2 2005

 

JDK 1.4.2 1.5.0 1.6.0 1.7.0都可以。。。

 

最后,如何使用它呢?

在其它项目中只要相应地 import 这个 build.xml 这个文件即可达到重用,如:新项目与这个项目并行,即

<?xml version="1.0" encoding="utf-8"?>

<projectname="JPA_OtherProject"default="compile"basedir=".">

      <import file="../Common/build.xml" />

    ......

也可以建立 build.properties 资源文件来配置一些信息等等。。。

附上完整的 build.xml 与 ShutdownTask.jar 以及 Eclipse项目文件,import 到 Eclipse 中,把 build.xml 拖到Ant视图里,直接就可以用了。

下载地址:Hsqldb_Ant_Eclipse.rar

讲完了。

解散。。。
 

时间: 2024-08-18 04:31:21

可重用的 Hsqldb 启动、停止之 Ant 任务脚手架的相关文章

Nginx启动/停止/状态检查/重新启动/平滑重启脚本

默认使用源代码安装Nginx时,Ngninx需要另外配置启动/停止/状态检查/ 重新启动/平滑重启/测试配置文件等功能的脚本,风信网收集并整理了一段Nginx的功能脚本,供大家参考使用. 应用新脚本之前,需要先运行命令关闭nginx [root@localhost ~]# sudo kill `cat /usr/local/nginx/logs/nginx.pid` #请修改为你的nginx.pid文件路径 建立一个nginx启动脚本 [root@localhost ~]# vi /etc/in

C#启动停止SQL数据库服务方法

C#启动停止SQL数据库服务方法之一: 在命令行里填写命令:net start/stop mssqlserver C#启动停止SQL数据库服务方法之二: 通过C#代码实现: using System; using System.Windows.Forms; using System.ServiceProcess; class Test : Form { Test() { //启动按钮: Button btn1 = new Button(); btn1.Parent = this; btn1.Te

怎样启动 停止 重启MySQL数据库服务器

如何启动/停止/重启MySQL 一.启动方式 1.使用 service 启动:service mysqld start 2.使用 mysqld 脚本启动:/etc/inint.d/mysqld start 3.使用 safe_mysqld 启动:safe_mysqld& 二.停止 1.使用 service 启动:service mysqld stop 2.使用 mysqld 脚本启动:/etc/inint.d/mysqld stop 3.mysqladmin shutdown 三.重启 1.使用

《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——2.4 启动/停止SQL Server服务

2.4 启动/停止SQL Server服务 这个方案描述了如何启动和停止SQL Server服务. 2.4.1 准备 检查你的机器上安装了哪些SQL服务.打开"Start | Run"并输入services.msc.你将会看到类似如下屏幕. 2.4.2 如何做- 让我们按照以下步骤来切换SQL Server服务的状态. 1.通过"Start | Accessories | Windows PowerShell | Windows PowerShell ISE"打开P

Python 启动/停止脚本(后台服务)

简述 之前,用 Python/Tornado(Web 服务器框架)实现了一个 LDAP 相关的后台组件,用于客户端的用户认证. 若用命令行方式启动脚本,十分简单: # python web_server.py 但为了方便部署,想要把它做成一个服务(service),这样就可以用服务来控制它的启动/停止,而且便于在开机时自启动. 简述 启动停止脚本 实现后台服务 版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820 启动/停止脚本 启动/停止

批处理命令行CMD启动停止重启IIS的命令

原文:批处理命令行CMD启动停止重启IIS的命令 启动IIS:   net start iisadmin    (IIS的整个服务) net start w3svc       (WWW网页WEB服务) 停止IIS:   net stop iisadmin /y     (会自动停止www.ftp和smtp服务) 如果用的IIS自带FTP还可以执行 net start MSFtpsvc 命令来启动FTP 起源网 另外,还可以通过命名行使用iisreset命令加参数对IIS进行控制: C:\Doc

使用ASP启动/停止指定WEB站点_应用技巧

============================================================= '       感谢您使用ASP001工作室开发的实用函数程序 '               HTTP://WWW.ASP001.NET '=============================================================     'ASP001工作室为您提供订制程序开发.企业互联网拓展服务 'QQ:1974229 'E-Mail:

Ubuntu Server下启动/停止/重启MySQL数据库

系统环境:ubuntu server 12.10 x64(mysql为系统自带) 当我们需要修​​改MySQL的配置文件my.cnf(windows 下为 my.ini)来进行一些设置的时候,修改完之后我们需要重启MySQL. my.cnf文件位置为:/ect/mysql/my.cnf Waring:如果该文件配置错误,MySQL将无法启动. 下面介绍三种方式对MySQL进行启动/停止/重启操作: 启动mysql: 方式一:sudo /etc/init.d/mysql start 方式二:sud

Linux Systemd——在RHEL/CentOS 7中启动/停止/重启服务

Linux Systemd--在RHEL/CentOS 7中启动/停止/重启服务 RHEL/CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服务进行管理.systemd兼容SysV和Linux标准组的启动脚本. Systemd是一个Linux操作系统下的系统和服务管理器.它被设计成向后兼容SysV启动脚本,并提供了大量的特性,如开机时平行启动系统服务,按需启动守护进程,支持系统状态快照,或者基于依赖的