0

这可能是一个愚蠢的问题,但请告诉我,因为我对 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 中使用的会话不同吗?

4

2 回答 2

0

您的“截断日志”会截断日志文件。这会影响所有会话(显然,因为日志文件对所有会话都是通用的)。因此,您需要在每个会话中执行一次“ddl in tran”命令,除非您可以在 db 配置中找到某种方式使其保持不变。

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

于 2013-09-25T13:21:41.213 回答
0

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

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

此外,为了澄清,您截断日志的命令实际上并没有截断日志。它所做的是将 Truncate Log on Checkpoint 的值设置为 true,因此当您发出检查点时,您的日志将被截断。要手动截断日志,命令是dump tran myDB with [options]

于 2013-09-26T16:59:16.057 回答