ORA-24757 错误处理

Cause: java.sql.SQLException: ORA-24757: 重复的事务处理标识

ORA-02063: 紧接着 line

....

今天应用管理员告诉我一张报表无法展现数据,执行后报错。

由于是单纯的用JDBC链接取数,以为是ORACLE故障,登录上进行查看后发现,alert日志正常,未报错。

查看详细的取数语句发现取数SQL取自一张试图,视图的创建语句中使用了dblink链接。

查找到远端数据库,联系远端数据库管理员后alert日志同样未见异常。

官方文档中说明如下:

ORA-24757: duplicate transaction identifier
Message:
ORA-24757: duplicate transaction identifier

Cause:
An attempt was made to start a new transaction with an identifier already in use by an existing transaction.

Action:
Verify that the identifier is not in use. 


想来应该是dblink卡住了或者异常提交导致回话异常,通知远端数据库管理员kill掉所有与我们主机通信的进程后,查看应用正常。


处理方法,此时应该是dblink卡住了,如果找到相应的进程 杀掉进程即可。

dblink连接的时候注意需要commit正常结束进程。

当遇到 `org.springframework.dao.DuplicateKeyException` 和 `org.hibernate.NonUniqueObjectException` 异常,提示 “a different object with the same identifier value was already associated with the session” 时,通常是因为不同的对象具有相同的标识符,却关联到了同一个 Hibernate 会话中。解决此问题的方法如下: #### 清空会话 在执行 `DAO` 层操作之前,清空当前的 `Hibernate` 会话。这可以确保会话中不会存在具有相同标识符的多个对象。可使用 `Session.clear()` 方法来清空会话。示例代码如下: ```java import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class YourDao { @Autowired private SessionFactory sessionFactory; public void yourMethod() { Session session = sessionFactory.getCurrentSession(); // 清空会话 session.clear(); // 后续的数据库操作 // ... } } ``` #### 避免重复使用会话 在同一个方法中多次使用 `HibernateTemplate` 或 `Session` 可能会导致会话管理问题。尽量在一个事务中只使用一个会话,或者确保在每次使用新的会话前清空旧的会话。例如,在 `DAO` 层方法中,避免多次获取 `Session` 或使用 `HibernateTemplate`: ```java import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.stereotype.Repository; @Repository public class YourDao { private HibernateTemplate hibernateTemplate; public void updateReplyCount(Informations infor) { String hql = "from Replies where infoId = " + infor.getId(); // 只使用一次 HibernateTemplate java.util.List<Replies> list = hibernateTemplate.find(hql); if (!list.isEmpty()) { infor.setReplyCount(list.size()); hibernateTemplate.update(infor); } } } ``` #### 检查事务管理 确保事务管理配置正确,避免在方法执行过程中出现会话管理问题。在 Spring 中,可使用 `@Transactional` 注解来管理事务,确保事务在方法执行期间正确处理会话。示例如下: ```java import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class YourService { @Autowired private YourDao yourDao; @Transactional public void yourServiceMethod() { yourDao.yourMethod(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值