Gno*_*upi 1 java sybase jboss ejb-3.0
我们在Sybase中有一个数据库,我们可以从Java服务器访问它.
使用,直接通过Sybase驱动程序访问数据库DriverManager.它工作正常,我们能够调用我们的存储过程.
最近,我们正在迁移到应用程序服务器(在JBoss 5上),现在通过JNDI连接器调用数据库,使用DataSource:
Properties ppt = new Properties();
ppt.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
ppt.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
ppt.put("java.naming.provider.url", "jdbc/sybase");
InitialContext ctx = new InitialContext(ppt);
DataSource ds = (DataSource) ctx.lookup(AConfig.getInstance().getDatasourceJndiName());
Connection conn = ds.getConnection();
Run Code Online (Sandbox Code Playgroud)
(使用JBoss示例中的基本设置配置DataSource )
但是,在此设置中,有几个过程失败,出现此错误:
"存储过程' ** '只能在非链接事务模式下运行."
或者这种情况,对于其他情况(失败的命令改变):
多语句事务中不允许TRUNCATE TABLE命令
从我在互联网上发现的东西来看,它看起来像是JBoss中的东西,或者连接器本身正在打开一个事务,导致这些错误.因此,我能找到的针对这些特定问题的各种解决方案过于局部化,而且似乎是一个更大的问题.
有没有办法防止这种行为(假设这是实际问题)?
我在这个特定领域的知识非常薄,这对我来说是新的.因此,此描述可能缺少重要的细节.请指出我如何改进这个问题,如有必要,我可以添加哪些细节.
小智 6
显然,在Sybase中,存储过程是以链式或非链式模式运行的.
如果您收到此错误,则表示您的SP已创建为Unchained.此Java行conn.setAutoCommit(false);被翻译为"set chained on".
您可以运行此Sybase SP以列出数据库中所有SP的事务模式:
sp_procxmode
Run Code Online (Sandbox Code Playgroud)
因此,您需要在非链接模式下调用SP并显式使用,创建事务,提交事务和回滚事务.
例如:
insert into publishers
values ("9906", null, null, null)
begin transaction
delete from publishers where pub_id = "9906"
rollback transaction
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14591 次 |
| 最近记录: |