0

最近、データベース Oracle RAC 11g を使用したアプリケーション JPA/Hibernate で次のエラーが発生しました。

このエラーは、ストレージがいっぱいで、DBA が接続を閉じたり、アクティブなセッションを強制終了したり、「接続が閉じられました」のようなものを必要としたときに発生しました (何が起こったのかわかりました。彼は解雇されました....)

javax.persistence.RollbackException: Error while commiting the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
at com.cgmp.ValePedagioSite.comprarViagemPorPlaca(ValePedagioSite.java:473)
at sun.reflect.GeneratedMethodAccessor1719.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
        (...)
Caused by: org.hibernate.exception.JDBCConnectionException: could not insert: [com.cgmp.model.entity.PedagioPracaViagem]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2295)
        (...)
Caused by: java.sql.SQLRecoverableException: Connection closed
at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3331)
at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:47)
at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3232)
at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:47)
at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:213)
        (...)

他のエンティティは問題なく挿入されました...

--- 編集 ---

詳細情報

構成 c3p0

<Resource auth="Container"
description=""
driverClass="oracle.jdbc.driver.OracleDriver"
acquireIncrement="1"
initialPoolSize="5"
maxPoolSize="300"
minPoolSize="5"
maxIdleTime="600"
maxIdleTimeExcessConnections="300"
unreturnedConnectionTimeout="900"
numHelperThreads="20"
name=""
user=""
password=" "
factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
jdbcUrl="jdbc:oracle:oci:" />

他の DBA と話すと、彼は、Oracleの 1 つのインスタンスのディスクがいっぱいになり、部分的にコミットされたレジスタがこの瞬間に作成されたが、トレース ファイルを削除しただけで、db を停止せず、セッションを強制終了しなかったと言いました。

4

1 に答える 1

1

確かに言うには十分な情報がありませんが、あなたが見ているのは未完了のトランザクション処理のようです。JDBC 仕様は、未完了のトランザクションの場合に何が起こるべきかという問題について黙って言及しています。オラクルは、そのような状況で作業をコミットすることが最善の行動であると判断した唯一のベンダーです。

于 2012-05-31T05:49:09.413 に答える