我正在构建一个将数据存储在 H2 数据库文件中的应用程序,因此我的保存文件的扩展名为.h2.db
.
打开应用程序时,用户必须选择应加载哪个保存文件。为了更容易识别这些文件,是否可以告诉 H2 使用自定义文件扩展名?
看H2的Database URL概览,我只能指定数据库的名称。我更喜欢像.save
默认.h2.db
. 有没有合理的方法来实现这一目标?
解决方法是将*.save
-file链接到临时文件夹,将其重命名为正确的后缀。如果这是唯一的解决方案,我想我会使用默认扩展名。
小智 6
H2 数据库支持可插拔文件系统,因此您可以使用一些额外的代码来使用您想要的任何扩展。您只需要创建一个包装器,注册它并使用您自己的数据库 URL。包装器可能如下所示:
package my.test;
import org.h2.store.fs.FilePath;
import org.h2.store.fs.FilePathWrapper;
public class FilePathTestWrapper extends FilePathWrapper {
private static final String[][] MAPPING = {
{".h2.db", ".save"},
{".lock.db", ".save.lock"}
};
@Override
public String getScheme() {
return "save";
}
@Override
public FilePathWrapper wrap(FilePath base) {
// base.toString() returns base.name
FilePathTestWrapper wrapper = (FilePathTestWrapper) super.wrap(base);
wrapper.name = getPrefix() + wrapExtension(base.toString());
return wrapper;
}
@Override
protected FilePath unwrap(String path) {
String newName = path.substring(getScheme().length() + 1);
newName = unwrapExtension(newName);
return FilePath.get(newName);
}
protected static String wrapExtension(String fileName) {
for (String[] pair : MAPPING) {
if (fileName.endsWith(pair[1])) {
fileName = fileName.substring(0, fileName.length() - pair[1].length()) + pair[0];
break;
}
}
return fileName;
}
protected static String unwrapExtension(String fileName) {
for (String[] pair : MAPPING) {
if (fileName.endsWith(pair[0])) {
fileName = fileName.substring(0, fileName.length() - pair[0].length()) + pair[1];
break;
}
}
return fileName;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你需要注册它:
FilePathTestWrapper wrapper = new FilePathTestWrapper();
FilePath.register(wrapper);
Run Code Online (Sandbox Code Playgroud)
并像这样使用数据库 URL:
"jdbc:h2:save:./mydatabase"
Run Code Online (Sandbox Code Playgroud)
注意“save:”前缀,它应该匹配 getScheme() 方法返回的字符串。我在这里放了更多细节:http : //shuvikov.net/blog/renaming-h2-database-files
归档时间: |
|
查看次数: |
3241 次 |
最近记录: |