2014-05-30 16 views
6

Tôi chỉ nâng cấp lên trình điều khiển jdbc mới từ classes12.jar lên ojdbc7.jarjava.sql.SQLException: Không thể cam kết với tự động cam kết đặt tại oracle.jdbc.driver.PhysicalConnection.commit (PhysicalConnection.java:4443)

ứng dụng của tôi đã ném một ngoại lệ khi đang chạy với ojdbc7.jar:

java.sql.SQLException: Could not commit with auto-commit set on 
    at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4443) 
    at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:4490) 
    at oracle.jdbc.driver.T4CConnection.doSetAutoCommit(T4CConnection.java:943) 
    at oracle.jdbc.driver.PhysicalConnection.setAutoCommit(PhysicalConnection.java:4 

ứng dụng của tôi vẫn chạy bình thường với classes12.jar.

tôi nghiên cứu trên oracle:

ngoại lệ này được nâng lên đối với bất kỳ một trong các trường hợp sau:

  • Khi cam kết tự động trạng thái được thiết lập là true và cam kết hoặc phương pháp rollback được gọi
  • Khi trạng thái mặc định của tự động cam kết không được thay đổi và phương thức cam kết hoặc quay lại được gọi là
  • Khi giá trị của thuộc tính COMMIT_ON_ACCEPT_CHANGES là đúng và phương thức cam kết hoặc quay vòng được gọi sau khi gọi phương thức acceptChanges trên một rowset

Nhưng tôi không thể tìm thấy sai lầm trong nguồn của mình. Xin hãy giúp tôi giải thích thêm về lỗi này.

+1

Hãy thử thiết lập 'connection.setAutoCommit (false); ' – user432

+1

Hãy chắc chắn rằng bạn đang sử dụng JDK7: đó là những gì các "7" có nghĩa là trong "ojdbc7" . Các classes12.jar là JDK 1.2 vintage - bạn nên đã thay đổi năm trước. Đừng để bị lừa bởi "ứng dụng của tôi vẫn chạy bình thường với classes12.jar". Bạn không nên sử dụng điều đó một lần nữa. – duffymo

+0

Cho callstack tôi nghi ngờ một lỗi trong trình điều khiển. Khi chuyển đổi giữa autocommit 'true' và' false' (và ngược lại), trình điều khiển phải cam kết giao dịch đang hoạt động và có vẻ như cam kết này không thành công vì trình điều khiển ở chế độ tự động. Mặt khác, tôi hy vọng Oracle sẽ kiểm tra kỹ lưỡng trình điều khiển của họ cho các loại công tắc trạng thái cơ bản này. –

Trả lời

12

Trình điều khiển OJDBC mới nhất tuân thủ nhiều hơn thì chúng ở đâu. Bạn có thể tắt hành vi này cho mã cũ:

-Doracle.jdbc.autoCommitSpecCompliant=false 

Đó là tùy chọn JVM.

4

Loại ngoại lệ này xảy ra khi Trình điều khiển JDBC Oracle (ojdbc6.jar) phiên bản 12 trở lên sẽ được sử dụng. Phiên bản 12 trở lên của trình điều khiển là nghiêm ngặt hơn so với phiên bản trình điều khiển trước đó.

Bạn có thể giải quyết vấn đề, bạn có vài lựa chọn:

  1. Thay đổi file jar lên phiên bản cũ (Dưới 12; thường vấn đề xảy ra trong khi chuyển sang máy chủ mới)
  2. Override hành vi của jar mới. phiên bản (ojdbc6.jar) với cài đặt bên dưới các đối số JVM.

    -Doracle.jdbc.autoCommitSpecCompliant = false

    IBM WS người dùng, tham khảo this link:

  3. Set Auto Commit tắt trong Java/SQL:

    Java:

    conn.setAutoCommit (sai);

    Oracle:

    SET Autocommit OFF

Các vấn đề liên quan