java sybase setAutoCommit(false)

时间:2013-09-25 13:15:20

标签: java sybase-ase

这可能是一个愚蠢的问题,但请不要因为我对使用Java的数据库知之甚少。我正在开发一个组件,我想为用户提供一个选项,以便自动提交可以设置为false。这是为了提升性能。我正在使用JDK7u25连接到Sybase ASE。

我可以在java.sql.Connection上调用setAutoCommit(false)方法。但是,当我这样做并调用一个简单的存储过程,将记录插入表中时,我得到以下错误。我不是从我的存储过程创建一个表。

com.sybase.jdbc3.jdbc.SybSQLException: The 'CREATE TABLE' command is not allowed within a multi-statement transaction in the 'tempdb' database.

我在Sybase文档页面上阅读并了解这是已知问题,错误代码为2762.可以通过在数据库上发出以下命令来解决此问题:

sp_dboption dbName, "ddl in tran", true.

但是,当我在Interactive SQL中执行此命令并尝试运行我的程序时,我仍然会收到此错误。我应该从我的java程序中显式运行此命令吗?

另一方面:我也有以下问题:

Space available in the log segment has fallen critically low in database 'myDB'.  All future modifications to this database will be %S_MSG until the log is successfully dumped and space becomes available.
The transaction log in database myDB is almost full. Your transaction is being suspended until space is made available in the log.

我通过在Interactive SQL中发出以下命令来修复此问题:

sp_dboption myDB, "trunc log", true

如果我不必通过我的java程序显式执行此命令并且它有效,为什么应该是通过我的java程序执行带有'ddl in tran'的sp_dboption为true的原因(如果必须) ?是因为java程序创建的会话与使用Interactive SQL中的会话不同吗?

2 个答案:

答案 0 :(得分:0)

您的“trunc log”会截断日志文件。这会影响所有会话(显然,因为日志文件对所有会话都是通用的)。所以你需要在每个会话中执行一次“ddl in tran”命令,除非你能在db配置中找到一些方法使它坚持下去。

顺便说一句,自动提交不应该是性能提升,而是要保证你有适当的事务性。当然它确实影响了性能,但你的措辞让我觉得奇怪。

答案 1 :(得分:0)

为“ddl in tran”发出sp_dboption后,对于连接到该数据库的所有会话,该值都将设置为true。它不是每个值,因此在代码中发出命令可能无法解决问题。要检查每个数据库的当前选项,您可以发出sp_helpdb,它将显示为每个数据库设置的当前选项。

由于您的错误是抱怨tempdb,我建议您确保在tempdb和生产数据库上启用“ddl in tran”。

另外,为了澄清,截断日志的命令实际上并没有截断日志。它的作用是将Truncate Log on Checkpoint的值设置为true,这样在发出检查点时您的日志就会被截断。要手动截断日志,命令为dump tran myDB with [options]