本篇文章主要介绍了"B/S技术开发桌面应用",主要涉及到方面的内容,对于SQLite感兴趣的同学可以参考一下:
B/S技术开发桌面应用随着HTML5规范的越来越完善,其功能也越来越强大,用来构建界面的代价远远小于传统桌面程序。笔者从事web开发多年,对B/S开发技术积累比...
我就是用的ikvm将所有jar包转成了dll,跑在了.net framework上,由于win7以上系统都自带.net framework,因此也算是脱离了jre,减小了程序体积。
3、数据库
原本B/S架构的数据库服务器是SQLServer,移植到单机版,优选Access,Java连接Access有两种方式:
(1)jdbc-odbc桥
这种方式依赖于操作系统的JET引擎,我测试了一下,在XP上打不开Access2007以上创建的.accdb数据库文件,只能连接.mdb数据库文件
(2)纯jdbc
①HXTT MS Access JDBC Drivers
http://www.hxtt.com/access.html
收费,未注册版,程序运行一次不能查询超过50次,一次不能超过1000条,使用过程中发现连接Access2010创建的有密码.accdb数据库文件好像有问题
②UCanAccess
https://sourceforge.net/projects/ucanaccess/
开源Access数据库JDBC驱动,完美支持.accdb数据库,不过要想支持有密码的数据库文件,得依赖于jackcess解密库,并且自己实现调用用解密库打开加密文件的类,下面贴上示例代码:
public static Connection getConnection(String dbpath) throws Exception {
Connection conn = null;
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String dbur1 = "jdbc:ucanaccess:///" + dbpath
+ ";jackcessOpener=com.test.utils.CryptCodecOpener";
conn = DriverManager.getConnection(dbur1, "admin", "密码");
return conn;
}
com.ytest.utils.CryptCodecOpener 类如下
public class CryptCodecOpener implements JackcessOpenerInterface {
public Database open(File fl, String pwd) throws IOException {
DatabaseBuilder dbd = new DatabaseBuilder(fl);
dbd.setAutoSync(false);
dbd.setCodecProvider(new CryptCodecProvider(pwd));
dbd.setReadOnly(false);
return dbd.open();
}
}
到此为止,一切问题似乎都已经解决,就等着打包了。然而,最终boss还是出现了。
这个得从UCanAccess的实现机制来讲,它是启动一个hsql内存数据库,(从他依赖于hsqldb.jar也可以看出来),然后把Access数据库表加载进入hsql数据库里面去,(所以UCanAccess很占内存,刚打开数据库文件时能飙到200M),本来在标准jre下,这一切都没有问题,但是我把服务端程序打成jar,用ikvm.net转换成dll放在.net环境上运行时,.net表示无法创建hsqldb内存数据库。于是,一朝回到解放前。
痛定思痛,我决定更换数据库,换成sqlite,本身小、不占内存、查询据说还比Access快。但是开源版的sqlite是没有加密数据库功能的,作者只是预留了sqlite3_key和sqlite3_rekey接口,并未实现,有加密数据库功能的sqlite3作者是收费的,而且就算我买了也没用啊,提供的是dll,我java还得用jna去调用dll,好麻烦的说的。但是我又实在不想裸奔,还是得寻找jdbc方面的sqlite解决方案。
①纯java实现的sqlite
sqlitejdbc-v033-nested.jar
纯java实现的读取sqlite创建的db的jdbc jar包,不用想了,这jar包都不知道你的db怎么加密的,肯定是解不开加密的db文件,只能打开没有加密的db,因为不同公司有自己的sqlite3_key实现。