目前在我们编写和分发的软件的客户QA环境中遇到问题。我无法访问他们的系统,因此我能获得的唯一信息是我能够从过度工作和过度应力的系统管理员那里收集的服务器日志。出于政治原因,我必须在第一时间做到这一点。所有的目光都集中在我身上。
在我们的内部测试环境中,我们运行SQLServer版本10.50.1600。该应用程序是使用Hibernate 3.5.5 + c3p0 0.9的Java Web应用程序。我们最近不得不添加一个数据库列来修复bug,它基本上是一个表示删除的布尔标志。这是我添加到表中的列。这个单行脚本是提供给客户端的部署包的一部分。
alter table foo.bar add expired tinyint not null default 0;
我在应用程序中添加了以下Hibernate映射:
<property name="expired" type="boolean">
<column name="expired" precision="1" scale="0" not-null="true" />
</property>
单元测试,代码审查,集成测试,QA内部接受,打包并交付给客户。客户端正确应用了更新并提供了证明此类的屏幕截图。该列存在。应用程序失败,日志中出现以下异常:
2012-03-09 14:50:18,374警告[org.hibernate.util.JDBCExceptionReporter](ajp - ####)SQL错误:207,SQLState:42S22 2012-03-09 14:50:18,374 SEVERE [org.hibernate.util.JDBCExceptionReporter](ajp - ####)无效的列名称“已过期”。
这两种环境之间唯一可辨别的区别是它们运行的是SQLServer版本10.0.4000。他们的DBA也可能以他们没有告诉我的其他方式修改它。您是否在此处看到了连接,或者对于问题可能有任何其他建议?这可能是一个字符集问题吗?
答案 0 :(得分:3)
我弄清楚问题是什么。
当我在问题中这样说时,它显然是不真实的。
该列存在。
该环境中不存在该列。 DBA正在向我提供有关错误环境的信息。
以此作为课程人员。不要构建Web应用程序以分发给客户端,以便它们在自己的服务器上托管。如果您可以提供帮助,请在您自己的服务器上托管您自己的Web应用程序,以便完全控制它。 :)