想选一种动态语言+跨平台界面组件的组合,希望大家给点意见

原来只是关注过跨平台组件的选择对比,有 GTK、wxWidgets、Qt、AWT/SWING、SWT。

GTK 是 GNOME 的实现组件

wxWidgets 对于用过 MFC 的人来说用起来很顺手

Qt 是 KDE 的实现组件

AWT/SWING 无需多说,SWT 相信也为 Java 开发人员熟知了。

曾得益于 VC 写的程序小巧且基本上拷个 EXE 文件到别人机器上就能运行,所以希望还是用 C++ 来编写界面程序,所以考虑过 wxWidgets 和 Qt。后来发现这两个组件的动态库的个头也不小,即使在客户端安装个 JRE 又何妨,何况 JAVA+SWT 的程序与 wxWidgets/Qt 的本地程序速度上差别已不大。综上,如果仅仅是跨平台的界面程序个人看重 JAVA+SWT 了,SWING 给我产生的欲望还不大。 阅读全文 >>

JDBC 连接 Oracle 时,用 rs.absolute(n) 真的不如 n 次 next() 性能好

前面写过一篇:Oracle 驱动版本引起的显示字段奇怪编码问题。讲到因 Oracle 8.0.5 不支持子查询排序,为改善原来那种每次翻页时都捋出所有数据成对象到 List 中,然后从中拣取页面实际要显示的记录的性能问题时,采用了 rs.absolute() 直接跳到起始记录游标的方法,但又引入了乱码问题,例如:"无效",变成了 "0xE697A0E69588"。

虽说,换个驱动,如 8.1.7.0.0 以上版本的驱动就能解决乱码的问题,但这一换又怕会影响到其他的应用。有朋友评论说,其实循环 next() 到某处比 absolute() 定位要好,乍一看,有些牵强,不过试试就知道了。下面就来做样一个测试,测试代码如下: 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第八章. 使用 Quartz 插件 (第五部分)

五. Quartz 工具插件

Quartz 框架包括几个你能用于你的应用中的几个插件。本节简单描述它们和它们的用途。

·JobInitializationPlugin

我们已经多次谈到过这个插件。它从一个 XML 文件中加载 Job 和 Trigger 信息(默认文件名是 quartz_jobs.xml) 。你可以通过在 quartz.properties 文件中为这个插件设定 filename 参数来配置文件名。假如你不需要数据库来存储你的 Job 或者是需要能快速测试特定 Job 的话,这个插件非常有帮助。 阅读全文 >>

碰到一个不知如何解释的 Java 控制台程序的内存问题

有一 Java 控制台程序,启动经过一段时间之后从 Windows 任务管理器里看它所占用的内存稳定在 540M 左右。

启动参数是:-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128

但只要你把那个控制台窗口最小化后,观察到的内存用瞬间下降到 100 多M,有时候甚至是几十M。然后不管是窗口保持最小化还是恢复了,它所占用的内存又以几十M几十M的上扬,直至先前的 540 M 左右。每次最小化窗口都可以观察到这种现象。

控制台窗口的参数:屏幕缓冲区大小:宽 120;高 300。窗口大小:宽 120;高 40。

不知道在控制台窗口最小化那时,JVM 做了些什么事情能让内存骤降下来,而复又升回去。

Quartz Job Scheduling Framework[翻译]第八章. 使用 Quartz 插件 (第四部分)

四. 使用多个插件

你喜欢多少个,就可以在 quartz.properties 文件中注册多少个插件。然而,加载和初始化的顺序却不能保证,因为 Quartz 加载先把所有的属性到一个 Map 中,然后按照从 Map 中取出的顺序遍历插件。

为规避这一限制,你可以创建一个 Quartz 插件作为父插件,然后以给定的顺序加载其他多个插件。代码 8.6 显示了 ParentPlugin 长什么样子。

代码 8.6. ParentPlugin 能以特定的顺序加载子插件 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第八章. 使用 Quartz 插件 (第三部分)

三. 注册你的插件

SchedulerFactory 首次初始化的时候,会从 quartz.properties 文件中搜寻你所配置的 Quartz 插件。它会通过 java.lang.ClassnewInstance() 方法创建插件的实例。你的插件必须有一个无参的构造方法,像代码中 JobLoaderPlugin 所做的那样。

要在 quartz.properties 文件中注册你的插件的话,需在 quartz.properties 文件中使用如下的格式创建一个属性:

org.quartz.plugin.<pluginName>.class=<fully_qualified_class_name_of_plugin>

Quartz 找寻属性文件中所有含这个关键词的项:

org.quartz.plugin.<pluginName>.class 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第八章. 使用 Quartz 插件 (第二部分)

二. 创建 Quartz 插件

创建一个新的插件很简单。你所有要做的就是创建一个 Java 类(或重用一个现有的类),让它实现 org.quartz.spi.SchedulerPlugin 接口。Scheduler 将会在启动期间创建这个插件的实例。这个插必须有一个无参的构造方法,很显然它不能是抽象的。

·JobInitializationPlugin

Quartz 框架有一个用来从 XML 文件中加载 Job 和 Trigger 信息的插件。这个插件就是 org.quartz.plugins.xml.JobInitializationPlugin,并且它在前面第三章 "Hello, Quartz" 中简略的讨论过。当你使用这个插件的时候,Quartz 框架就会搜寻一个叫做 quartz_jobs.xml 的文件并试图从中加载 Job 和 Trigger 信息。 阅读全文 >>

Quartz Job Scheduling Framework[翻译]第八章. 使用 Quartz 插件 (第一部分)

第八章. 使用 Quartz 插件

Quartz 框架提供了几种用于扩展平台能力的方式。通过使用各种 "钩子" (通常指的就是扩展点),Quartz 变得很容易被扩展和定制化来适应你的需要。其中一个最简单的扩展框架的方法就是使用 Quartz 插件。本章就来看看如何使用插件机制让 Quartz 进入到之前 Quartz 用户没去过的领域。

一. 什么是插件?

假如你使用过其他的开源框架,例如 Apache Struts,你应该已经熟悉了插件的概念和它们的用法。非常简单,一个 Quartz 插件就是一个实现了 org.quartz.spi.SchedulerPlugin 接口的 Java 类,并且被作为插件注册给了 Scheduler。这个插件接口包含了三个方法,显示在代码 8.1 中。 阅读全文 >>

Oracle 驱动版本引起的显示字段奇怪编码问题

开门见山把产生问题的原因的解决办法列出来。

我们一般获取 Statement 都是通过 conn.createStatement() 方法,很少传递参数给它的,所以其内置属性都取默认值的,取记录只用 while(rs.next()) 逐个取即可。然而有一个需求(Oracle 8i 之前的版本不支持子查询排序,所以无法用 rownum 取分页记录) 是通过如下代码来得到 Statement:

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

由它获得的结果集可以 rs.absolute(n) 直接跳到第 n 行记录来获得值,但就这个用法出问题了,取出来的中文出现乱码了,如 "无效",变成了 "0xE697A0E69588" 阅读全文 >>