我的控制器操作中有一个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)
输入??
答案 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)
玩得开心。