Исключение не найден при чтении файла .sql в grails-app / conf / sql - PullRequest
0 голосов
/ 11 октября 2010

У меня есть запрос sql в моем действии контроллера (выберите * из таблицы .... где ..... и др.). Этот запрос запускается, когда пользователь отправляет страницу.

Это код из 50 строк, который принимает 3 параметра. Например: выберите * у сотрудника, где empDate = 'params.empDt' и empNum = params.empNum, упорядочены по params.sort asc.

В указанном выше случае запрос динамически принимает 3 параметра (params.empDt, params.empNum и params.sort) и выполняется. Так как это огромный запрос, я смотрю на вывод запроса в файл sql. Полученный таким образом файл будет вызван в службе, и запрос будет выполнен.

Итак, я создал файл .sql в grails-app / conf / sql / read_date.sql.

Когда я читаю этот файл и запускаю приложение, используя run-app, оно работает нормально. Я могу прочитать файл и выполнить запрос.

Однако, когда я создаю войну и развертываю ее на tomcat, appn не читает файл, и я получаю исключение FileNotFound.

java.io.FileNotFoundException: grails-app / conf / sql / read_date.sql (такого файла или каталога нет) в java.io.FileInputStream.open (собственный метод) at java.io.FileInputStream. (FileInputStream.java:106)

Входы ??

Ответы [ 2 ]

0 голосов
/ 11 октября 2010

Я не вижу смысла помещать фактический SQL во внешний файл. Просто поместите операторы SQL в класс обслуживания, все будет хорошо. Вероятно, увеличение скорости не будет, если у вас есть операторы SQL во внешнем файле (который нужно читать с диска каждый раз, когда нужно выполнить запрос). Если вам нужно часто менять инструкцию SQL (что было бы хорошей причиной для экстернализации оператора), вы можете оценить возможность чтения его из самой базы данных (например, из текстового поля или чего-то еще) ...

Если вы действительно хотите использовать подход внешнего текстового файла из службы или контроллера, возможно, самый простой способ - использовать ServletContext.getResource, чтобы получить ссылку на данные, упакованные в вашем веб-приложении. Поскольку getResource принимает контекстно-зависимый URL, вы можете использовать getResource("/someSQLstatements.txt") и доверьте его работе независимо от расположения вашего веб-приложения в локальной файловой системе сервера ИЛИ пути, по которому оно отображается через контейнер сервлета. Это должно работать хорошо. (см. также: http://www.velocityreviews.com/forums/t131134-specifying-path-for-file-to-be-read-by-servlet-with-tomcat.html)

веселись.

0 голосов
/ 11 октября 2010

Ну, вы видите, дело в том, что структура grails-app / conf не существует во время войны.Если вы используете что-то вроде 7-zip, чтобы открыть войну и осмотреть ее, вы увидите, что все классы в conf теперь находятся в классах Web-Inf /.Структура каталогов гарантируется только при разработке.Если вы создали файл Sql в web-app / sql, это может решить эту проблему для вас, так как каталоги в веб-приложении соблюдаются во время генерации War.Web-приложение содержит такие вещи, как файлы javascript, которые требуются приложению и затем доступны через http://myhost:port/AppName/sql/my.sql.. На вашем месте я бы создал базу данных sql.

Надеюсь, это поможетJohn

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