我们在 Windows Server 2008 R2 Enterprise x64 机器上安装了 Sonar 3.6.2,并使用嵌入式 H2 数据库将其作为 Windows 服务成功启动。当尝试将数据库切换到 Microsoft SQL Server 2008 实例时,我们的问题就开始了。
我们正在使用提供的 jtds 数据库驱动程序 (v1.2.7),在 sonar.properties 文件中未注释以下设置:
#----- Microsoft SQLServer
sonar.jdbc.username: <user>
sonar.jdbc.password: ***********
sonar.jdbc.url: jdbc:jtds:sqlserver://<host>:<port>/sonar;domain=<domain>;useNTLMv2=true
sonar.jdbc.driverClassName: net.sourceforge.jtds.jdbc.Driver
#----- Connection pool settings
sonar.jdbc.maxActive: 20
sonar.jdbc.maxIdle: 5
sonar.jdbc.minIdle: 2
sonar.jdbc.maxWait: 5000
sonar.jdbc.minEvictableIdleTimeMillis: 600000
sonar.jdbc.timeBetweenEvictionRunsMillis: 30000
# Delay (in seconds) between processing of notification queue
sonar.notifications.delay=60
最初启动声纳时,我们可以看到它正在创建所有必要的表。但是,当它进入初始化 Hibernate 的阶段时,我们会看到以下错误:
2013.09.03 14:24:58 INFO o.s.j.s.AbstractDatabaseConnector Initializing Hibernate
2013.09.03 14:25:00 ERROR o.s.s.p.Platform Missing column: id in sonar.GLOBALTEST\AUSonardsa.active_rule_changes
org.hibernate.HibernateException: Missing column: id in sonar.GLOBALTEST\AUSonardsa.active_rule_changes
通过 DBVisualizer 与同一个 AUsonardsa 用户连接到同一个数据库,我可以看到表 'active_rule_changes' 在那里,我可以执行一个简单的 sql 语句 'select id from active_rule_changes',它返回一个带有单个 id 列的空表。
Google 搜索类似的问题(即,在 Hibernate 初始化期间表中缺少列)都表明需要设置“sonar.jdbc.schema”值。但是,当我们设置此值(例如,设置为 'dbo')时,错误会略有变化:
2013-09-03 16:14:33.436:WARN:oejw.WebAppContext:Failed startup of context o.e.j.w.WebAppContext{/,file:/D:/devtools/Sonar/install/sonar-3.6.2/war/sonar-server/},file:/D:/devtools/Sonar/install/sonar-3.6.2/war/sonar-server
org.hibernate.HibernateException: Missing table: active_rule_changes
即使我们让 dba 手动将表移动到 dbo 模式,sonar 仍然无法看到 active_rule_changes 表,无论我们是否设置了 sonar.jdbc.schema 属性。
我们甚至尝试删除整个声纳数据库,重新创建一个新的,并将架构属性设置为“dbo”并再次启动声纳。在这种情况下,它继续并重新创建所有表,进入休眠初始化并再次抱怨找不到 active_rule_changes 表。在这种情况下,即使架构属性设置为“dbo”,表似乎仍然是在 AUsonardsa 用户的架构下创建的。
有人可以帮助我们找出导致这些问题的原因吗?