我有一个已建立的软件产品,它使用HSQLDB作为其内部设置数据库.客户项目存储在此数据库中.多年来,HSQLDB已经为我们提供了相当好的服务,但它有一些稳定性/腐败问题,我们必须围绕这些问题进行编码,即便如此,我们也似乎无法完全保护自己.
我正在考虑更改内部数据库.从开发的角度来看,这样做会相当痛苦,但是向客户解释损坏的数据库(和丢失的数据)并不好玩.
所以我的问题是:有没有人有足够的经验来衡量Apache Derby的长期稳定性?我发现谷歌的一篇帖子抱怨德比不稳定,但是从2006年开始,所以我觉得它在过去的4年里得到了改善.或者,是否存在我可以使用的另一个纯Java嵌入式(进程中)数据库(商业或开源).性能对我来说不是很重要.稳定是王道.断电时的数据完整性,良好的BLOB支持和热备份都是必须的.
请不要建议不是基于SQL的关系数据库.我正在尝试改造现有产品,而不是从头开始,谢谢.
编辑:似乎我的测试,以确定原始JVM是否已退出是有缺陷的开始(见接受答案的评论).对不起噪音.
我需要有一个正在运行的JVM启动另一个JVM然后退出.我正在尝试这样做Runtime.getRuntime().exec().另一个JVM启动,但我的原始JVM将不会退出,直到"子"JVM进程停止.似乎使用Runtime.getRuntime().exec()在进程之间创建父子关系.是否有某种方法可以解除生成的进程以使父进程死亡,或者某种其他机制来生成进程而与创建进程没有任何关系?
请注意,这看起来与此问题完全相同:使用Java生成进程并在父进程退出后继续运行,但是接受的答案实际上并不起作用,至少在我的系统上没有(Windows 7,Java 5和6).似乎这可能是一个依赖于平台的行为.我正在寻找一种独立于平台的方法来可靠地调用其他进程并让我的原始进程死掉.
例如,假设我有一个jar文件,C:\myjar.jar我想运行该com.example.RunMejar中的类.假设该类弹出一个JOptionPane,然后在用户点击OK后退出.
现在,以下是在JVM#1中运行的程序:
public static void main(String[] args) {
String javaHome = System.getProperty("java.home");
String os = System.getProperty("os.name");
String javawBin = javaHome + File.separator + "bin" + File.separator + "javaw";
if (os.toLowerCase().contains("win")) {
javawBin += ".exe";
}
List<String> cmd = new ArrayList<String>();
cmd.add("\"" + javawBin + "\"");
cmd.add("-cp");
cmd.add("\"C:\\myjar.jar\"");
cmd.add("com.example.RunMe");
System.out.println("Running: " + cmd);
try {
System.out.println("Launching...");
Process p = Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()]));
new Thread(new …Run Code Online (Sandbox Code Playgroud) 我需要将Log4j登录为二进制格式,以便日志可以轻松地进行机器解释.我知道我可以为此目的使用XML,但不希望关联的文件大小膨胀或解析开销.
整个布局系统似乎本质上是基于字符串的,这意味着我不能使用漂亮的文件滚动appender.LoggingEvent是可序列化的,所以我想自己编写一个二进制文件appender,但我觉得我不应该在这里开辟新的领域.
我错过了一些明显的东西吗