我正在使用Spring开发一个与Informix数据库一起工作的应用程序,该应用程序正在Tomcat上运行。数据源的配置在应用程序中完成,如下所示:
/MyApp/META-INF/context.xml
<Context path="/MyApp"
reloadable="false"
cachingAllowed="false" >
<Resource name="jdbc/MyAppDS"
auth="Container" type="javax.sql.DataSource"
driverClassName="com.informix.jdbc.IfxDriver"
url="jdbc:informix-sqli://app.prod.com:22222/prod:informixserver=prodshm;IFX_LOCK_MODE_WAIT=20;IFX_XASPEC=Y;"
username="user" password="password"
maxActive="100" maxIdle="25" maxWait="10000"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"/>
</Context>
/MyApp/WEB-INF/WEB.xml
…
<resource-ref>
<res-ref-name>jdbc/MyAppDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/applicationContext.xml
/WEB-INF/config/dataAccessContext.xml
</param-value>
</context-param>
…
/MyApp/config/dataAccessContext.xml
<beans>
<import resource="dataSource-def.xml"/>
<bean id="scriptDao" parent="txProxyTemplate">
<property name="target">
<bean class="com.myapp.script.ScriptDaoJdbc">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
</property>
</bean>
…
</beans>
/MyApp/config/dataSource def.xml
<beans>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>java:/comp/env/jdbc/MyAppDS</value></property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
</beans>
context.xml中的参数IFX_LOCK_MODE_WAIT似乎不起作用,因为我有很多锁定错误,例如:
error code [-244]; Could not do a physical-order read to fetch next row.; ISAM error: record is locked.
error code [-245]; Could not position within a file via an index.; ISAM error: key value locked
为了检查我的假设是否正确,我开始发送";将锁定模式设置为等待20";在每个有问题的查询之前显式显示,并且可以看到它工作了——不再有错误消息了。
下面列出了context.xml以前的配置,但也不起作用:
/MyApp/META-INF/context.xml(以前的版本(
<Context path="/MyApp"
reloadable="false"
cachingAllowed="false" >
<Resource name="jdbc/MyAppDS"
auth="Container" type="javax.sql.DataSource"
driverClassName="com.informix.jdbc.IfxDriver"
url="jdbc:informix-sqli://app.prod.com:22222/prod:informixserver=prodshm"
username="user" password="password"
maxActive="100" maxIdle="25" maxWait="10000"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
connectionProperties="ifxIFX_LOCK_MODE_WAIT=20;ifxIFX_XASPEC=Y;" />
</Context>
为什么context.xml中的语句IFX_LOCK_MODE_WAIT=20
可能不起作用?实现这一目标的更好方法是什么?
谢谢!
如果可以,请尝试更改隔离级别;IFX_ISOLATION_LEVEL=1
以查看是否存在差异。
也许可以在属性文件中定义informix资源,而不是在xml上下文中定义