首页 > Berkeley DB, SQL, Winnie Hu > Berkeley DB 11g Release 2 JDBC编译方法

Berkeley DB 11g Release 2 JDBC编译方法

2010年4月1日 Winnie

最新发布的Oracle Berkeley DB 11g Release 2(以下简称BDB 11gR2)提供了对SQL的支持。同时,BDB11gR2还支持通过JDBC驱动来访问BDB 11gR2数据库。在当前版本的BDB 11gR2,我们推荐用户使用Werner版的JDBC驱动程序:http://www.ch-werner.de/javasqlite/。下文如未明确指明,则JDBC缺省指的是Werner版的JDBC驱动程序,且本次发布是基于版本javasqlite-20090430。

本文演示了如何在Linux和Windows平台上,编译和配置BDB 11gR2 的JDBC访问。更多关于BDB 11gR2的信息,请参考BDB的官方文档。

什么是JDBC

根据维基百科的定义:Java数据库连接(Java Database Connectivity,简称JDBC),是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC是面向关系型数据库的。

前提条件

1. 请到Oracle官方网站:http://www.oracle.com/technology/software/products/berkeley-db/index.html 下载最新版本的Berkeley DB 11g Release 2源代码包。选择一个目录,解压缩源代码包,释放后的目录为<db-5.0.x>,其中x是具体的小版本号。

  • 备注:
    • 解压完后在<db-5.0.x>/sql/jdbc目录下会带有一份JDBC驱 动程序的源代码;
    • 注意本次附在Oracle Berkeley DB 11g Release 2发布包中的JDBC驱动程序以开源形式提供。上述JDBC驱动程序的代码不属于Oracle Berkeley DB的知识产权,Oracle Berkeley DB组暂时不提供相关的支持和维护。

2. 请确认你的Windows/Linux机器安装了JDK(1.4及以上版本);

3. 请确认你的Windows机器安装了Visual Studio(2005及以上版本);

在Linux平台配置JDBC

1. 进入目录<db-5.0.x>/build_unix(注意:该目录是所有Unix/POSIX平台上编译生成BDB 11gR2的入口),运行如下命令来编译得到BDB 11gR2的库文件:

$ cd build_unix
$ CFLAGS="-fPIC" ../dist/configure --enable-sql_compat --disable-shared
$ make
  • 备注:
    • 选项“–disable-shared”指定目标文件为静态库,否则用户的应用程序最终需要链接两个动态库文件(一个是DB库,另一个是JDBC的JNI库);
    • 这一步骤会在<db-5.0.x>/build_unix目录下生成libdb-5.0.a。

2. 进入目录<db-5.0.x>/sql/jdbc,运行如下命令来编译得到JDBC驱动器所需要的Java类包以及JNI库文件:

$ cd ../sql/jdbc
$ CFLAGS="-DHAVE_SQLITE3_MALLOC -DHAVE_ERRNO_H \
-I../../build_unix -I../../dbinc" \
LDFLAGS="../../build_unix/libdb-5.0.a" \
./configure -with-sqlite3=../generated
$ make
  • 备注:
    • 在make步骤中,你会遇到类似于如下的Warning:
    • *** Warning: Linking the shared library libsqlite_jni.la against the
      *** static library ../../build_unix/libdb-5.0.a is not portable!

      这个Warning是由libtool产生的 ,原因是所链接的libdb-5.0.a库文件没有提供相应的libdb-5.0.la文件。此Warning可以忽略,丝毫不影响使用JDBC;

    • 这一步骤会生成两个 目标文件:一个是Java类包:<db-5.0.x>/sql/jdbc/sqlite.jar,另一个是JNI库文件:<db- 5.0.x>/sql/jdbc/.libs/libsqlite_jni.so。

3. 进入目录<db-5.0.x>/sql/jdbc,运行如下命令验证得到的目标文件是否正确:

$ javac -classpath ./sqlite.jar test3.java
$ java -Djava.library.path=./.libs -classpath ./sqlite.jar:. test3
  • 备注:
    • test3.java是JDBC驱动器自带的一个测试程序,请阅读此文件,了解大致此测试程序做了那些操作。

如果屏幕显示出如下结果,则表明JDBC已经配置成功了。

INFO: expecting {96,97,98,99} got {96,97,98,99}
TRACE: drop table TEST3
TRACE: drop table B
TRACE: select * from sqlite_master
cleaning up ...
done.
  • 备注:
    • 运行完上述示例后,你将在当前目录下能够看到一个名为db3的文件以及一个名为db3-journal的目录文件,其中db3是数据库文件,db3-journal是数据库环境的根目录;
    • 使用file命令查看db3数据库文件属性,显示如下:
      $ file db3
      db3: Berkeley DB (Btree, version 9, native byte-order)。

在Windows平台配置JDBC

1. 用Visula Studio打开<db-5.0.x>/build_windows/目录下的Berkeley_DB.sln文件;

2. 在Visula Studio中,选择File->Add->Existing Project,选中build_windows/db_sql_jdbc.vcproj工程文件并添加到Berkeley_DB.sln中,同时设置db_sql_jdbc工程依赖于db_sql工程;

3. 编译db_sql_jdbc工程,这一步骤将在目录<db-5.0.x>\build_windows\<PlatformName>\<BuildMode>\下产生如下目标文件:jdbc.jar,libdb50d.dll,libdb_sql50d.dll,sqlite_jni.dll;

4. 进入目录<db-5.0.x>\build_windows\Win32\Debug(我的测试平台是Win32,编译模式是Debug),运行如下命令来 验证你编译得到的目标文件是否正确:

javac -cp ".;jdbc.jar" -d . ..\..\..\sql\jdbc\test3.java
java -cp ".;jdbc.jar" test3
  • 备注:
    • test3.java是JDBC驱动器自带的一个测试程序,请阅读此文件,了解大致此测试程序做了那些操作。

如果屏幕显示出如下结果,则表明JDBC已经配置成功了。

INFO: expecting {96,97,98,99} got {96,97,98,99}
TRACE: drop table TEST3
TRACE: drop table B
TRACE: select * from sqlite_master
cleaning up ...
done.
  • 备注:
    • 运行完上述示例后,你将在当前目录下能够看到一个名为db3的文件以及一个名为db3-journal的目录文件,其中db3是数据库文件,db3-journal是数据库环境的根目录。

结束语

谢谢使用Berkeley DB 11g Release 2的JDBC访问方法。在使用中若遇到任何问题,欢迎留言!

分类: Berkeley DB, SQL, Winnie Hu 标签:
  1. Dim Wang
    2010年4月30日11:06 | #1

    我们项目中使用到了bdb(java),使用的api访问,有什么好的 中文 的资料给我发到邮箱里吧,呵呵:)

  2. cc
    2011年5月25日14:30 | #2

    您好,我们在项目里使用oracle.berkeleydb-3.2.43版本, 但这个版本存在句柄泄露的bug。我们希望能在源代码基础上做修改,而不是版本升级(因为不兼容)。但在官网上已经找不到这个版本的源代码。不知道哪里能找到完整的源代码,包含pom文件的。谢谢

  3. chaohuang
    2011年5月25日15:51 | #3

    @Dim Wang
    主要以本中文博客上的资料为准,我们目前没有更多的中文文档。如果你使用中遇到问题,欢迎到Oracle BDB的论坛提问。

  4. chaohuang
    2011年5月25日15:54 | #4

    @cc
    你好,你是使用C版本还是Java版本的BDB?为什么说是BDB的句柄泄漏bug?请给我发邮件: chao.huang @ o.com (o 换成 oracle)。

  5. cc
    2011年5月26日13:09 | #5

    @chaohuang
    我的邮箱: chjr505@qq.com
    我们用的是java版本的,BDB句柄泄露的问题描述已经邮件发给你了,如果没收到,联系我!

  6. santafeng
    2011年10月20日11:12 | #6

    使用db-5.0.32版本编译器 Microsoft Visual Studio 2010,win7 32,编译异常,走不下去。

    错误 9 error MSB3073: 命令“
    mkdir “./..\build_windows\Win32\Debug\jdbc_classes/”
    echo compiling JDBC classes
    javac -g -target 1.5 -d “..\build_windows\Win32\Debug\jdbc_classes” -classpath “..\build_windows\Win32\Debug\jdbc_classes” ..\sql\jdbc\SQLite\*java ..\sql\jdbc\SQLite\JDBC2z\*java
    echo Building JNI header files
    javah -o ..\sql\jdbc\native\sqlite_jni.h -classpath “..\build_windows\Win32\Debug\jdbc_classes” SQLite.Database SQLite.Vm SQLite.FunctionContext SQLite.Stmt SQLite.Blob
    echo creating jar file
    jar cf “..\build_windows\Win32\Debug\jdbc.jar” -C “..\build_windows\Win32\Debug\jdbc_classes” .
    echo JDBC build finished
    :VCEnd”已退出,代码为 9009。 C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets 103 6 db_sql_jdbc

  7. santafeng
    2011年10月20日11:23 | #7

    @santafeng
    找到了,是JAVA_HOME设置。

  8. santafeng
    2011年10月20日11:25 | #8

    @santafeng
    现在是这个异常,错误 9 error C1083: 无法打开包括文件:“jni.h”: No such file or directory d:\db-5.0.32\sql\jdbc\native\sqlite_jni.h 2 1 db_sql_jdbc

  9. santafeng
    2011年11月9日15:36 | #9

    错误 9 error C1083: 无法打开包括文件:“sqlite_jni.h”: No such file or directory D:\db-5.2.36\lang\sql\jdbc\native\sqlite_jni.c 34 1 db_sql_jdbc
    还是老问题。

  10. santafeng
    2011年11月9日15:59 | #10

    sqlite_jni.c 只有在D:\db-5.2.36\lang\sql\generated 目录下有。

本文的评论功能被关闭了.
Դ