Как правильно настроить путь к базе данных sqlite для моих сервлетов? - PullRequest
1 голос
/ 08 июня 2010

Я использую SQLite в качестве базы данных, и меня немного смущает, как я могу настроить путь к нему.По сути, у меня есть статическая строка в одном из моих классов (которая после инициализации превращается в нечто подобное):

private static String DATABASE = "db/my.db";

Папка db расположена непосредственно под WebContent, поэтому, чтобы получитьдоступ к нему, мне нужно использовать метод ServletContext getRealPath.Чтобы использовать это, мне нужен доступ к сервлету, и, поскольку я не уверен, какой сервлет будет вызываться первым, мне нужно выполнить проверку всех моих запросов, чтобы увидеть, установлена ​​ли база данных, иесли это не так, то установите его.Я думаю, что должен быть лучший способ сделать это.На данный момент я создал абстрактный класс, который наследуется от HttpServlet, добавляет 2 метода, 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);
        }

И мой метод checkDatabase реализован так:

public static void checkDatabase(HttpServlet servlet)
{
    if(App.DATABASE == null) {
        App.DATABASE = "jdbc:sqlite:"+servlet.getServletContext().getRealPath(
            servlet.getServletContext().getInitParameter("DATABASE")
        );
    }
}

То, как я сейчас что-то делаю, не так.Конечно, должен быть лучший способ.

Ответы [ 2 ]

2 голосов
/ 08 июня 2010

Вы хотели бы использовать ServletContextListener, чтобы зацепить запуск веб-приложения и инициализировать параметры приложения. Вот пример запуска, предполагающий, что вы действительно определили путь как <context-param> с <context-name> из DATABASE:

public class Config implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
        String database = event.getServletContext().getInitParameter("DATABASE");
        // ...
    }

    // ...

}

Что вы затем отобразите в web.xml следующим образом:

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

При необходимости вы можете хранить контекстные переменные в ServletContext, чтобы любой сервлет в свою очередь мог получить к ним доступ.

event.getServletContext().setAttribute("database", database);

...

Database database = (Database) getServletContext().getAttribute("database");

Как Паскаль намекнул в своем ответе, вы хотели бы использовать для этого каждый JNDI. В этом случае вы можете сохранить имя JNDI как <context-param> и таким образом получить / инициализировать DataSource (косвенно) ServletContextListener.

Для получения дополнительных советов вы можете найти этот базовый пример полезным.

2 голосов
/ 08 июня 2010

Правильным способом было бы настроить пул соединений на уровне сервера и использовать источник данных (либо внедренный, либо полученный через JNDI) в вашем коде для получения соединения из источника данных.

Если вы добавите более подробную информацию о вашем сервере, я мог бы предоставить дополнительные рекомендации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...