主题:怎么同一连接操作SQL

jAmEs_ 2018年09月05日 144

某个操作函数,调用多次SQL,怎么保证多次都是调用同一连接?

闲大赋 2018年09月05日

这个是数据源保证的,数据源在同一线程调用,都提供同一个数据源,否则就没办法谈事物了,本论坛只回答关于beetl和beetlsql问题

  • jAmEs_ :我说的场景是ibeetlsql调用SQL 问题是,我在一个方法连续调用了两次SQL,第一生成临时表,第二次获取临时表数据,发现MSSQL的临时表在第二次调用时提示不存在了(2018年09月05日)
jAmEs_ 2018年09月05日

而出现这样的情况无非有两种:

1. 连接换了

2.连接断了

jAmEs_ 2018年09月05日

所以才咨询这个问题

jAmEs_ 2018年09月05日

我用SQLManager连续分别调用了update和pageQuery/getList

jAmEs_ 2018年09月05日

declare @p1 int 

exec sp_prepare @p1 output,N'',N' SELECT * INTO #bs_location FROM bs_location WHERE 1=1',1 

select @p1

GO 

declare @p1 int 

set @p1=NULL 

exec sp_prepare @p1 output,N'',N' SELECTcount(1) FROM #bs_location',1 

select @p1

GO

jAmEs_ 2018年09月05日

刚刚跟踪看到是跟调用SQL的方式有关,都用了sp_prepare去调用SQL,怎么样才避开?

闲大赋 2018年09月05日

如果你没有考虑到一个事务里,那每次都是不同链接。同一个事物,肯定是提供同一个链接


另外,不太了解mysql的临时表,这个是对当前会话临时表?那也可能链接断掉就没了

  • jAmEs_ :你所谓的在一个事务里是指Spring的@Transactional注解?我理解不关事,因为在查询分析器都出现问题,连接没有断开(2018年09月05日)
  • jAmEs_ :是MSSQL,我所知MSSQL在sp_prepare好像是SQL自身会调用新的连接,所以就会跟刚刚那个连接不一样了(2018年09月05日)
  • jAmEs_ :不对哦,我搞错了脚本,查询分析器是正常的~~~看不出ibeetlsql有什么问题,实际看到连接是没有发生变化的(2018年09月05日)
  • jAmEs_ :https://blog.csdn.net/u014108439/article/details/77866321?locationNum=10&fps=1 我搞错了,确实是MSSQL的机制问题(2018年09月05日)
jAmEs_ 2018年09月05日

简单的说,采用下面的方式来执行语句,MSSQL在下一次执行(同一连接),临时表就会没掉,目前只能采用全局临时表处理。。。

conn = this.sm.getDs().getConn(this.id, true, sql, objs);

ps = conn.prepareStatement(sql);

this.setPreparedStatementPara(ps, objs);

rs = ps.executeUpdate();

闲大赋 2018年09月05日

这下清楚了,如果你没有在事务管理里,beetlsql默认是执行一条语句,提交,关闭,你可以使用beetlsql的自带事务管理或者spring等事务管理

参考官网文档 25.6. 事务管理

  • jAmEs_ :这个还是跟事务无关。。。 只是prepare这种执行方式,在MSSQL翻译的语句,会出现这个问题,数据库处理机制问题。(2018年09月06日)