我有一个 Spring MVC 应用程序,它使用嵌入式数据库来存储用户凭据和设置。我的问题是我决定将数据库文件动态地存储在 Tomcat 的已部署 webapp 文件夹中。今天我意识到每次重新启动Tomcat时都会删除这个文件夹(或者我认为是这样)。我的问题是,有没有办法避免Tomcat删除文件夹?如果没有,我在哪里可以存储数据库文件?如果该应用程序针对 Windows、Linux 和 MacOS,哪条路更好?
2 回答
Tomcat 不会在重启时从 webapp 中删除文件夹。如果在关闭脚本/启动脚本中配置了任何特殊内容,它将被删除。重新启动 tomcat 只是重新部署 webapp 中存在的文件。请检查您正在创建数据库文件的程序是否实际上存储了相同的文件,即请在关闭后检查文件。如果它们存在,那么您的启动脚本中可能会删除这些文件。
此外,将数据库文件存储在 tomcat webapp 中也不是一个好的选择,因为任何后续部署都会删除战争并重新部署它,从而擦除所有先前的数据。
此外,根据数据的大小,您可以选择将数据直接存储到 DB。
存储在 tomcat 目录中不是一个好主意,在部署期间可能会删除我推荐的 Redis 执行它http://www.springsource.org/spring-data/redis,或者如果您想存储在嵌入式数据库中,请创建一个目录文件在同时使用 windows 和 unix 的用户的家中
System.getProperty("user.home");
或者你可能会得到tomcat主目录如果在环境变量中设置了CATALINA_HOME
System.getProperty("catalina.base");
或者您可以使用 spring Message bundle 使用绝对路径,因此您可以添加 dir.properties 文件并添加 spring 配置:
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/dir" />
<property name="defaultEncoding" value="UTF-8" />
在文件 dir.properties 中,添加路径:
storage:/var/lib/tomcat6/
或者,如果您有兴趣动态查找 Os,可以使用此代码获取特定目录:
public class FindOS {
private static final boolean osIsMacOsX;
private static final boolean osIsWindows;
private static final boolean osIsWindowsXP;
private static final boolean osIsWindows2003;
private static final boolean osIsWindowsVista;
private static final boolean osIsLinux;
static {
String os = System.getProperty("os.name");
if (os != null)
os = os.toLowerCase();
osIsMacOsX = "mac os x".equals(os);
osIsWindows = os != null && os.indexOf("windows") != -1;
osIsWindowsXP = "windows xp".equals(os);
osIsWindows2003 = "windows 2003".equals(os);
osIsWindowsVista = "windows vista".equals(os);
osIsLinux = os != null && os.indexOf("linux") != -1;
}
public static boolean isMacOSX() {
return osIsMacOsX;
}
public static boolean isWindows() {
return osIsWindows;
}
public static boolean isWindowsXP() {
return osIsWindowsXP;
}
public static boolean isWindows2003() {
return osIsWindows2003;
}
public static boolean isWindowsVista() {
return osIsWindowsVista;
}
public static boolean isLinux() {
return osIsLinux;
}
//TODO
String getHelperDirectory(){
if(isLinux())return "~/";
if(isWindows()) return "c:/";
if(osIsWindowsVista) return "c:/";
return null;
}