零、回顾

这部分先来回顾一下上一篇博客中的主要内容。上一篇博客中主要简单介绍了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. QStringRef可以提高性能,下次注意使用;QPair方便了语法,函数可以一次返回多个返回值,方便使用

    而且QPair从此与各种QMap容器联系了起来,会非常好用.甚至QList也可以成双成对的使用元素了: QList<QPair<int, double> > list;list ...

  2. ARM的NEON协处理器是什么

    ARM的NEON协处理器是什么 何谓多媒体扩展指令集?由于原理复杂坚涩,小编就简单的打个比方:厂商们分析平时处理器干哪些事情最慢.又最经常用到,然后把这些最消耗时间的事情固化成电路,做成一个额外的部分 ...

  3. IBM Rational-完整的软件工程解决方案工具集

    IBM,即国际商业机器公司,1911年创立于美国,是全球最大的信息技术和业务解决方案公司,其业务遍及全球170多个国家和地区.IBM软件分为五个部分,其中Rational系列是专门针对软件工程的软件工 ...

  4. Android开发之ListView-BaseAdapter的使用

    ListView优化原则: UI优化: listview条目与条目之间的间隙的分割内容 : android:divider="@android :color/transparent" ...

  5. [转] 网络流算法--Ford-Fulkerson方法及其多种实现

    网络流 转载自:http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html 在上一章中我们讨论的主题是图中顶点之间的最短路径,例如公 ...

  6. ActiveMQ中的安全机制 [转]

    本文简单介绍ActiveMQ通过JAAS实现的安全机制.JAAS(Java Authentication and Authorization Service)也就是java认证/授权服务.这是两种不同 ...

  7. java含多个包的命令行下执行

    C:\Users\liyang\Desktop\BAE\Baidu-BCS-SDK-Java-1.4.5>java -classpath(可以cp简写) bcs-sdk-java_1.4.5.j ...

  8. Javaweb之JavaScript结合(二)

    1.js的String对象 ** 创建String对象 *** var str = "abc"; ** 方法和属性(文档) *** 属性 length:字符串的长度 *** 方法 ...

  9. MTRR内存类型范围寄存器

    1.MTRR的概念 内存类型范围寄存器(MTRRs,翻译过来真别扭,后面都以MTRR直接来说了)提供了一种机制,这种机制其实就是确定在系统内存中物理一段内存的类型.这个类型其实是正对CPU来说的,见图 ...

  10. 【Java基础】继承的一些总结

    什么是继承 把一些类的具有共性的东西剥离出来形成一个新的类,然后各个其他类保留自己独有的特性,并用关键字extends继承这个剥离出来的新的类,可以最终达到各类原始相同效果,但是在每个类中,单用一个“ ...