零、回顾

这部分先来回顾一下上一篇博客中的主要内容。上一篇博客中主要简单介绍了Derby数据的历史,特点,安装以及使用的两种模式。这篇文章主要介绍这两种模式中的一种模式

一、启动服务端程序

第一部分主要来启动Derby数据库的服务端程序来接收客户端过来的请求。启动服务端程序有两种情况,一种是本机作为服务端,一种是远程的某台主机作为服务端程序。下面将对这两种情况分别介绍。(说明,我使用的是Linux环境,使用Windodws环境的类似,可自行查阅使用手册)

先来介绍第一种情况,即本机当做服务器端。首先打开一个终端,切换到一个位置。需要特别注意的是这个位置非常重要,它将作为数据库访问时根目录对待。如我现在切换到一个叫Testdata的文件夹下面,那么我之后用于指定数据库路径的根目录即为Testdata,Derby将从Testdata开始递归的查找数据库所在的目录。我下的bin版本的Derby数据库,所以里面有很多编译好的脚本文件可以使用,位置在DERBY_HOME/bin/文件夹下面。该文件夹下的内容如下图:

从上图中可以看出,bin文件大多都是两两对应的,即一个是用于Linux/Unix系统的脚本文件(无文件扩展名),一个是用于Windodws系统下的脚本文件(文件扩展名为.bat)。我这里使用的是Linux系统,但是不会介绍所有的脚本文件,只介绍其中的一部分。

我们现在的目标是把本机当做服务端,并启动服务。Step1:需要做的事情是先把启动服务端需要的jar文件添加到CLASSPATH环境变量中,这里可以用终端执行命令

setNetworkServerCP

该脚本会自动帮助把需要的jar文件(derbytools.jar, derbynet.jar)添加到CLASSPATH环境变量中。当然也可以自己手动完成,即执行命令:

export CLASSPATH=$DERBY_HOME/lib/derbytools.jar:$DERBY_HOME\lib\derbynet.jar:

接下来就可以启动服务端的数据库程序了。Step2:启动服务端程序,执行命令:

startNetworkServer

或者手动开启服务端进程,执行命令:

java -jar derbyrun.jar server start

这样我们就可以对从客户端对数据库进行访问了,运行后终端提示内容如下:

接下来介绍第二种情况,即远程主机做为数据库的服务进程。启动需要运行数据库的主机一个终端按照第一种情况的Step1完成配置环境变量CLASSPATH的操作。但是Setp2会有所不同。首先先来解释一些,第一种情况的默认启动的方式,默认启动时数据库服务进程只监听本机客户端发来的请求,拒绝接受其他主机客户端发来的请求,所以对于第二种情况我们不能够使用这种默认的启动服务端的模式。我们使用脚本文件NetworkServerControl。执行命令:

NetworkServerControl start -h MASTER_IP_ADDRESS -p MASTER_PORT_NUMBER

或者手动执行命令:

java org.apache.derby.drda.NetworkServerControl  start -h MASTER_IP_ADDRESS -p MASTER_PORT_NUMBER

上述的MASTER_IP_ADDRESS时主机的ip地址,MASTER_PORT_NUMBER是主机用来监听的端口号,根据自己的需求自行指定。终端出现类似上图的提示即说明服务进程已启动,可以接收来自不同客户端的服务请求了。

二、客户端访问本地服务

启动好本机的服务进程后在打开一个终端。先配置好CLASSPATH的环境变量,输入命令:

setNetworkClientCP

或者使用命令:

export CLASSPATH=$DERBY_HOME/lib/derbytools.jar:$DERBY_HOME\lib\ derbyclient.jar:

在这里先插一句,Derby提供了3个工具:

  • sysinfo:显示你的Java环境信息和Derby的版本信息。
  • ij:进行数据库交互,执行SQL脚本,如查询、增删改、创建表等等。
  • dblook:可以将全部或者部分数据库的DDL定义导出到控制台或者文件中。(使用时需要指定一下参数,请自行查阅)

从上面三个工具的简单介绍可知,我们要使用的工具是ij,在终端中输入ij或者命令java -jar $DERBY_HOME/lib/derbyrun.jar ij会显示以下信息:

这样我们就可以使用这个工具来链接数据库,并且可以用SQL语句完成数据库的操作了。首先先要链接数据库,输入命令:

connect 'jdbc:derby:myDB;create=true';

简单解释一下,connect是连接的命令,前面的jdbc:derby是使用的协议,myDB是数据库的路径和名称,这里需要注意以下,查找数据库路径的位置是以当前启动ij的文件夹作为根目录进行查找。后面的create=true代表了数据库如果不存在就创建。完成这个命令后会发现对应的路径位置上多了一myDB的文件夹,这里面存放的就是数据。

接下来就可以执行SQL语句对当前连接的数据库进行操作了,这里就不在赘述,可以自行查阅SQL的语法规则。另外,ij工具本身还有一些自身的命令,可以输入help命令查看。

三、程序访问本地服务

注意需要选择的Driver为:org.apache.derby.jdbc.ClientDriver即可。下面附上程序:

package triangle23.derby.demo.first;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement; public class DerbyDemo {
private Connection conn = null;
private Statement stmt = null; public static void main(String[] args) {
String ipAddress = "localhost";
String portNumber = "1527";
String dbPath = "Testdata";
String dbName = "myDB";
String dbURL = "jdbc:derby://" + ipAddress + ":" + portNumber + "/"
+ dbPath + "/" + dbName + ";create=true;";
String tableName = "basicinfo";
String createTableQuery = "create table " + tableName
+ "(id int not null, name varchar(12), cityname varchar(12))";
String selectQuery = "select * from " + tableName; DerbyDemo dd = new DerbyDemo();
dd.createConnection(dbURL);
dd.createTable(createTableQuery);
dd.insert(tableName, 0, "Trianlge23", "Beijing");
dd.select(selectQuery);
dd.shutdown(dbURL);
} private void createConnection(String dbURL) {
try {
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
conn = DriverManager.getConnection(dbURL);
} catch (Exception except) {
except.printStackTrace();
}
} private void createTable(String createTableQuery) {
try {
stmt = conn.createStatement();
stmt.execute(createTableQuery);
stmt.close();
} catch (SQLException sqlExcept) {
sqlExcept.printStackTrace();
}
} private void insert(String tableName, int id, String Name, String cityName) {
try {
stmt = conn.createStatement();
stmt.execute("insert into " + tableName + " values (" + id + ",'"
+ Name + "','" + cityName + "')");
stmt.close();
} catch (SQLException sqlExcept) {
sqlExcept.printStackTrace();
}
} private void select(String selectQuery) {
try {
stmt = conn.createStatement();
ResultSet results = stmt.executeQuery(selectQuery);
ResultSetMetaData rsmd = results.getMetaData();
int numberCols = rsmd.getColumnCount();
for (int i = 1; i <= numberCols; i++) {
System.out.print(rsmd.getColumnLabel(i) + "\t\t\t");
}
System.out
.println("\n-------------------------------------------------------------");
while (results.next()) {
int id = results.getInt(1);
String Name = results.getString(2);
String cityName = results.getString(3);
System.out.println(id + "\t\t\t" + Name + "\t\t\t" + cityName);
}
results.close();
stmt.close();
} catch (SQLException sqlExcept) {
sqlExcept.printStackTrace();
}
} private void shutdown(String dbURL) {
try {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
DriverManager.getConnection(dbURL + "shutdown=true");
conn.close();
}
} catch (SQLException sqlExcept) {
// sqlExcept.printStackTrace();
}
}
}

注意到程序中故意注释掉了一行,如果取消注释会报出一个异常java.sql.SQLNonTransientConnectionException。困扰了我好半天,查一下才知道,这个并没有问题,Derby的工作方式就是这样,或者说是Derby的一个bug,详细请参考参考资料4,5

四、客户端访问远程服务

和第二部分客户端访问本地服务类似,先要启动ij工具,之后执行命令

connect 'jdbc:derby://MASTER_IP_ADDRESS:MASTER_PROT_NUMBER/DB_PATH/DB_NAME;create=true';

连接上数据库后即可用SQL语句执行命令了。上面的命令中和第二部分类似,需要指出协议,数据库的路径和名字,但是不同的时还需要指定数据库服务进程主机的ip地址和监听端口号。其实第二部分的连接命令是省略的写法,1527是Derby数据库默认指定的端口号,完整的写法如下:

connect 'jdbc:derby://localhost:1527/DB_PATH/DB_NAME;create=true';

五、程序访问远程服务

明白了第三部分的程序示例,程序远程访问的示例和气类似,只是把对应的主机ip地址和监听端口号指定好就行了,这里就不举例了。

六、后续工作

这篇博客介绍了Derby数据库作为客户机-服务器(C/S)连接的使用,并给出了两个Java程序使用JDBC连接的例子。后续将继续介绍内嵌模式(Enbedded)的使用。至于关闭数据库的服务进程,很简单,自行查阅一下文档或者根据bin文件夹下的脚本名即可,这里就不在给出。

七、参考资料

  1. Derby Network Server:http://db.apache.org/derby/papers/DerbyTut/ns_intro.html
  2. Class NetworkServerControl:
    http://db.apache.org/derby/docs/10.0/publishedapi/org/apache/derby/drda/NetworkServerControl.html
  3. ij Basics: http://db.apache.org/derby/papers/DerbyTut/ij_intro.html
  4. JavaDB/Derby Error 08006: 
    http://stackoverflow.com/questions/2723622/javadb-derby-error-08006
  5. Shutting down the system: 
    http://db.apache.org/derby/docs/10.5/devguide/tdevdvlp20349.html
  6. Creating a Java application to access a Derby database: 
    http://db.apache.org/derby/integrate/plugin_help/derby_app.html

Derby使用2—C/S模式的更多相关文章

  1. hive使用derby的服务模式(可以远程模式)

    hive默认使用的derby的嵌入模式.这个就面临着,无法多个并发hive shell共享的问题. 使用MySQL服务器也可以解决问题,但安装.配置太麻烦了. 可以使用轻量级的derby的c/s服务模 ...

  2. derby数据库的一些总结

     本文主要是针对在osgi开发过程中的一些问题进行总结,其中dbcp数据源的配置是在SpringDM下配置的.一,derby数据源的内嵌模式       该模式的主要应用是嵌入式程序,因为其小巧,且不 ...

  3. 《OD学hive》第四周0717

    一.Hive基本概念.安装部署与初步使用 1. 后续课程 Hive 项目:hadoop hive sqoop flume hbase 电商离线数据分析 CDH Storm:分布式实时计算框架 Spar ...

  4. Java SE 6 新特性: Java DB 和 JDBC 4.0

    http://www.ibm.com/developerworks/cn/java/j-lo-jse65/index.html 长久以来,由于大量(甚至几乎所有)的 Java 应用都依赖于数据库,如何 ...

  5. Hive基本原理及环境搭建

    今天我主要是在折腾这个Hive,早上看了一下书,最开始有点凌乱,后面慢慢地发现,hive其实挺简单的,以我的理解就是和数据库有关的东西,那这样的话对我来说就容易多啦,因为我对sql语法应该是比较熟悉了 ...

  6. Hive的用法

    1.Hive是Hadoop的一个子项目 利用MapReduce编程技术,实现了部分SQL语句.而且还提供SQL的编程接口.Hive推进Hadoop在数据仓库方面的发展. Hive是一个基于Hadoop ...

  7. MyEclipse使用教程:使用REST Web Services管理JPA实体

    MyEclipse 在线订购专享特惠!火爆开抢>> MyEclipse最新版下载 使用REST Web Services来管理JPA实体.在逆向工程数据库表后生成REST Web服务,下面 ...

  8. hive基本结构与数据存储

    一.Hive简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能.还可以将 SQL 语句转换为 MapReduce 任务进行运行,通过自 ...

  9. 以Server模式启动Derby服务竟然抛套接字权限异常

    以Server模式启动Derby服务竟然抛套接字权限异常:access denied ("java.net.SocketPermission" "localhost:15 ...

随机推荐

  1. PIL(Python Image Library)生成验证码

    # -*- coding: utf-8 -*-#导入三个模块import Image,ImageDraw,ImageFontimport randomimport math'''基本功能'''#图片宽 ...

  2. eclipse+tomcat7解决项目中文乱码的一个思路

    1. 在代码层面进行编码的修改操作,参考博文的方法一:http://www.cnblogs.com/longshiyVip/p/4873058.html 2. 如果项目使用了struts2等前端框架, ...

  3. 定义设置颜色的RGB值的宏

    //定义设置颜色的RGB值的宏 #define RGBA(r,g,b,a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha ...

  4. GridView使用CommandField删除列实现删除时提示确认框

    在.net2005提供的GridView中我们可以直接添加一个CommandField删除列完后在它的RowDeleting事件中完成删除 GridView在使用CommandField删除时弹出提示 ...

  5. OCR识别流程

    1.图像输入.预处理:图像输入:对于不同的图像格式,有着不同的存储格式,不同的压缩方式.预处理:主要包括二值化,噪声去除,倾斜较正等2.二值化:对摄像头拍摄的图片,大多数是彩色图像,彩色图像所含信息量 ...

  6. AVPicture、AVFrame和AVPacket

    http://blog.csdn.net/ym012/article/details/6540065 从定义上可知,AVPicture是AVFrame的一个子集,他们都是数据流在编解过程中用来保存数据 ...

  7. 基于CommentCoreLibrary简单的弹幕实现

    本文地址:http://www.cnblogs.com/liaoyu/p/ccl-demo.html 实现基于开源的 CommentCoreLibrary 最近有需求要实现一个简单的评论弹幕实现,通过 ...

  8. Understanding Memory Management(2)

    Understanding Memory Management Memory management is the process of allocating new objects and remov ...

  9. Java Memory Management(1)

    Java Memory Management, with its built-in garbage collection, is one of the language’s finest achiev ...

  10. 使用OLEDB读取不同版本Excel数据的连接字符串设置

    摘要: 用OLEDB通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的/// summary // ...