我们正在使用缓存的PreparedStatement来查询DataStax Cassandra。但是,如果我们需要向表中添加新列,我们需要重新启动应用程序服务器以重新计算准备好的语句。
我在cassandra中遇到了这个错误,这解释了解决方案 https://datastax-oss.atlassian.net/browse/JAVA-420
它基本上可以解决不使用" SELECT * FROM table"在查询中,但使用" SELECT column_names FROM table"
但现在我们遇到了与Delete语句相同的问题。向表中添加新列后,Delete prepared语句不会删除记录。
我认为我们不能使用Select语句的票据中提到的相同工作,因为*或column_names对删除行没有意义。
任何帮助将不胜感激。我们基本上希望避免为数据库表的任何添加重新启动应用程序服务器
答案 0 :(得分:1)
我们基本上希望避免为数据库表的任何添加而重新启动应用程序服务器
需要一点编码的简单解决方案:使用 JMX
让我解释一下。
在您的应用程序代码中,保留所有预准备语句的缓存(例如,您可以使用Guava缓存实现)。访问缓存的关键可以是,例如,查询字符串。
现在,将JMX方法公开给清除缓存,并强制应用程序再次重新准备查询。
每次更新架构时,只需调用适当的方法来清理缓存,就不需要重新启动应用程序