Java 为我的servlet配置sqlite数据库路径的正确方法是什么?

Java 为我的servlet配置sqlite数据库路径的正确方法是什么?,java,servlets,initialization,Java,Servlets,Initialization,我使用SQLite作为我的数据库,对于如何配置它的路径,我有点困惑。基本上,我在我的一个类中有一个静态字符串,初始化后会变成这样: private static String DATABASE = "db/my.db"; 文件夹db直接位于WebContent下,因此,要访问它,我需要使用ServletContext的getRealPath方法。要使用它,我需要访问一个servlet,因为我不确定哪个servlet将是第一个被调用的servlet,所以我需要在所有请求中执行一次检查,以查看数据

我使用SQLite作为我的数据库,对于如何配置它的路径,我有点困惑。基本上,我在我的一个类中有一个静态字符串,初始化后会变成这样:

private static String DATABASE = "db/my.db";
文件夹db直接位于WebContent下,因此,要访问它,我需要使用ServletContext的getRealPath方法。要使用它,我需要访问一个servlet,因为我不确定哪个servlet将是第一个被调用的servlet,所以我需要在所有请求中执行一次检查,以查看数据库是否已设置,以及是否尚未设置。我认为应该有更好的办法。 目前,我创建了一个从HttpServlet继承的抽象类,添加了两个方法,一个getImpl和一个postImpl都是抽象的,我的doGet和doPost目前实现如下:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        App.checkDatabase(this);
        try {
            getImpl(request,response);
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        App.checkDatabase(this);
        try {
            postImpl(request,response);
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
public static void checkDatabase(HttpServlet servlet)
{
    if(App.DATABASE == null) {
        App.DATABASE = "jdbc:sqlite:"+servlet.getServletContext().getRealPath(
            servlet.getServletContext().getInitParameter("DATABASE")
        );
    }
}
我的checkDatabase方法是这样实现的:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        App.checkDatabase(this);
        try {
            getImpl(request,response);
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        App.checkDatabase(this);
        try {
            postImpl(request,response);
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
public static void checkDatabase(HttpServlet servlet)
{
    if(App.DATABASE == null) {
        App.DATABASE = "jdbc:sqlite:"+servlet.getServletContext().getRealPath(
            servlet.getServletContext().getInitParameter("DATABASE")
        );
    }
}

我现在做事的方式感觉不对劲。当然,一定有更好的方法。

正确的方法是在服务器级别配置连接池,并在代码中使用注入的或通过JNDI获得的数据源从数据源获取连接


如果您添加有关服务器的更多详细信息,我可以提供更多指导。

正确的方法是在服务器级别配置连接池,并在代码中使用注入的或通过JNDI获得的数据源从数据源获取连接

如果您添加有关服务器的更多详细信息,我可以提供更多指导。

您希望使用挂接webapp的启动并初始化应用程序范围的参数。下面是一个启动示例,假设您确实已将路径定义为数据库的路径:

然后将其映射到web.xml中,如下所示:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

正如Pascal在他的回答中暗示的那样,您希望在每个JNDI下使用。在这种情况下,您可以将JNDI名称存储为,并以这种方式在ServletContextListener中间接获取/初始化

有关更多提示,您可能会发现这些提示很有用。

您希望使用挂接webapp的启动并初始化应用程序范围的参数。下面是一个启动示例,假设您确实已将路径定义为数据库的路径:

然后将其映射到web.xml中,如下所示:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

正如Pascal在他的回答中暗示的那样,您希望在每个JNDI下使用。在这种情况下,您可以将JNDI名称存储为,并以这种方式在ServletContextListener中间接获取/初始化


有关更多提示,您可能会发现有用。

我使用Tomcat 6.14,作为Web开发人员的IDE Eclipse Java EE IDE。我使用Tomcat 6.14,作为Web开发人员的IDE Eclipse Java EE IDE。谢谢!这比我以前做的好多了。谢谢!这比我当时的做法好多了。