Berkeley DB 11g Release 2 JDBC编译方法
最新发布的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:
- 这一步骤会生成两个 目标文件:一个是Java类包:<db-5.0.x>/sql/jdbc/sqlite.jar,另一个是JNI库文件:<db- 5.0.x>/sql/jdbc/.libs/libsqlite_jni.so。
*** 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;
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访问方法。在使用中若遇到任何问题,欢迎留言!
我们项目中使用到了bdb(java),使用的api访问,有什么好的 中文 的资料给我发到邮箱里吧,呵呵:)
您好,我们在项目里使用oracle.berkeleydb-3.2.43版本, 但这个版本存在句柄泄露的bug。我们希望能在源代码基础上做修改,而不是版本升级(因为不兼容)。但在官网上已经找不到这个版本的源代码。不知道哪里能找到完整的源代码,包含pom文件的。谢谢
@Dim Wang
主要以本中文博客上的资料为准,我们目前没有更多的中文文档。如果你使用中遇到问题,欢迎到Oracle BDB的论坛提问。
@cc
你好,你是使用C版本还是Java版本的BDB?为什么说是BDB的句柄泄漏bug?请给我发邮件: chao.huang @ o.com (o 换成 oracle)。
@chaohuang
我的邮箱: chjr505@qq.com
我们用的是java版本的,BDB句柄泄露的问题描述已经邮件发给你了,如果没收到,联系我!
使用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
@santafeng
找到了,是JAVA_HOME设置。
@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 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
还是老问题。
sqlite_jni.c 只有在D:\db-5.2.36\lang\sql\generated 目录下有。