数据库模式定义语言DDL(Data Definition Language)。
在写一个自动解析创建表的功能时,发现一个问题,就是第一次运行程序进行建表操作成功,然后通过PLSQL将该表删除,然后再通过程序建立同一张表,程序正确执行,但是在数据库里面去看,该表确没有建立成功。但重新启动应用服务器则正常。
初步估计可能是缓存问题,由于我们持久层,用的是IBATIS,于是把缓存全部关掉,问题依旧。后来没办法,自己直接用JDBC连接执行,确没有问题。觉得问题可能出在连接上。由于我们用的spring的数据连接池,其中有这样一句话
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="20"/>
<property name="maxWait" value="1000"/>
<property name="poolPreparedStatements" value="true"/>
<property name="defaultAutoCommit" value="true"/>
</bean>
<property name="poolPreparedStatements" value="true"/>
将其改为false就正常。查了一下资料这个属性的意思是:是否对已备语句进行池管理(布尔值),也就是说重复执行同一个DDL语句,因为这个选项它会有缓存。就不会去再去连接到数据库去执行,而是直接返回的缓存的结果。问题找到了。
但是连接池肯定还是要用,这个属性多数情况下,还是能够提升一些性能,所以还是单独写了一个JDBC连接来处理这个问题。不知道用应用服务器的数据源是否也会有同样的问题?
第二天用数据源尝试,不会有这个问题,另外还遇到一个问题,就是当这个属性设置为true的时候,service层在一个事务里面循环更新或者查询多次不同的数据,就会出现ORA-01000: maximum open cursors exceeded的异常,原因是因为在一个事务里面每次执行一次数据操作就会打开一个数据库游标,而一般数据库游标的大小为300,我改成了1000还是不行,因为我这个方法会操作上万条数据,而在一个方法里,他始终都没有释放游标,上万条执行完后才释放,很明显这样就会出问题。不可能把数据库的游标设成几万吧。最后解决办法就是把该属性设置为false就正常了。
另外用JBOSS的数据源测试,发现没有这个问题。所以用spring的连接池的朋友要小心了!把这个设置成false也不会影响多少性能,有兴趣的朋友可以测一下!