读取grails-app / conf / sql中存在的.sql文件时找不到文件异常

时间:2010-10-11 12:10:55

标签: sql grails

我的控制器操作中有一个sql查询(select * from table .... where ..... et al)。用户提交页面时会触发此查询。

这是一个包含3个参数的50行代码。 例如:select * from employee其中empDate ='params.empDt'和empNum = params.empNum order by params.sort asc。

在上面的例子中,查询动态地接受3个参数(params.empDt,params.empNum和params.sort)并执行。 由于这是一个巨大的查询,我期待将查询外部化到一个sql文件。这样外化的文件将在服务中被调用,并且将执行查询。

所以我在grails-app / conf / sql / read_date.sql中创建了.sql文件。

当我阅读此文件并使用run-app运行应用程序时,它很好。我能够读取文件并执行查询。

但是,当我创建一个war并将其部署在tomcat上时,appn不会读取该文件而我会收到FileNotFound异常。

java.io.FileNotFoundException:grails-app / conf / sql / read_date.sql(没有这样的文件或目录)         at java.io.FileInputStream.open(Native Method)         在java.io.FileInputStream。(FileInputStream.java:106)

输入??

2 个答案:

答案 0 :(得分:0)

嗯,你看到的是,战争中不存在grails-app / conf结构。如果你使用类似7-zip的东西打开战争并浏览它,你会发现conf中的所有类现在都在Web-Inf / classes中。只有通过开发才能真正保证目录结构。如果您在web-app / sql中创建了一个Sql文件,这可能会解决您的问题,因为在战争生成期间会遵守web-app下的目录。 Web应用程序包含应用程序所需的javascript文件之类的内容,然后可以通过http://myhost:port/AppName/sql/my.sql访问。如果我是你,我会为sql编译数据库。

希望这会有所帮助。 约翰

答案 1 :(得分:0)

我无法真正看到将实际SQL放在外部文件中的重点。只需将SQL语句放在服务类中,事情就可以了。如果在外部文件中有SQL语句(每次需要执行查询时需要从磁盘读取),速度可能没有增加。如果你需要经常更改SQL语句(这是将语句外部化的一个很好的理由),你可以评估从数据库本身读取它的可能性(比如从文本字段或其他东西)......

如果您真的想要从服务或控制器使用外部文本文件方法,最简单的方法可能是使用ServletContext.getResource来获取对Web应用程序中打包的数据的引用。由于getResource确实采用了与上下文相关的URL,因此您可以使用 getResource("/someSQLstatements.txt")并且信任它可以工作,无论您的Web应用程序在服务器的本地文件系统上的位置或它通过servlet容器映射到的路径。这应该运作良好。 (另见:http://www.velocityreviews.com/forums/t131134-specifying-path-for-file-to-be-read-by-servlet-with-tomcat.html

玩得开心。