Cara pendekatan "Punya minus satu dari baca call" kesalahan saat menghubungkan ke Amazon RDS Oracle instance

I'm menjalankan Oracle 11GR2 on Amazon RDS contoh. kadang-kadang saya mendapatkan sebuah Kesalahan IO: Punya minus satu dari baca sebut ketika membuat panggilan untuk DriverManager.getConnection(getUrl()) dan I'm tidak yakin mengapa. Aplikasi bekerja dengan benar.

Untuk lebih membingungkan hal, kesalahan akan memperbaiki dirinya sendiri pada kesempatan (berikut iterasi berikutnya dari program).

Bagaimana saya harus pendekatan "Punya minus satu dari baca call" kesalahan?

Full jejak stack:

java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:243)
    at com.cwd.facile.db.Database.<init>(Database.java:44)
    at com.cwd.facile.ns.NetSuiteRequestBased.<init>(NetSuiteRequestBased.java:29)
    at com.cwd.facile.ns.CommonOperations.isInventoryItem(CommonOperations.java:205)
    at com.cwd.facile.ns.CommonOperations.findItemIdByName(CommonOperations.java:188)
    at com.cwd.facile.ns.CommonOperations.createSalesOrder(CommonOperations.java:970)
    at com.cwd.facile.Main.main(Main.java:47)
Caused by: oracle.net.ns.NetException: Got minus one from a read call
    at oracle.net.ns.Packet.receive(Packet.java:311)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:300)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1140)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340)
    ... 12 more

Database.java garis 44: setConn(DriverManager.getConnection(getUrl()));

Info lainnya:

  • Saya pikir itu adalah buruk JDBC url, tapi itu tidak bekerja, kadang-kadang selama berhari-hari sebelum gagal.
  • Amazon RDS yang dikelola contoh dan perubahan konfigurasi tidak mungkin menjadi mungkin
  • Saya menggunakan ojdbc6.jar untuk konektivitas
Mengomentari pertanyaan (1)
Larutan

Penyebab langsung dari masalah adalah bahwa JDBC driver telah berusaha untuk membaca dari Soket jaringan yang telah ditutup oleh "ujung yang lain".

Hal ini bisa disebabkan beberapa hal:

  • Jika remote server telah dikonfigurasi (misalnya di "SQLNET.ora" file) untuk tidak menerima koneksi dari IP anda.

  • Jika JDBC url yang salah, anda bisa mencoba untuk terhubung ke sesuatu yang isn't database.

  • Jika ada terlalu banyak membuka koneksi ke database, layanan itu bisa menolak koneksi baru.

Mengingat gejala, aku pikir "terlalu banyak koneksi" adalah skenario yang paling mungkin. Yang menunjukkan bahwa aplikasi anda bocor koneksi; yaitu menciptakan koneksi dan kemudian gagal untuk (selalu) dekat mereka.

Komentar (2)

Kita menghadapi masalah yang sama dan tetap. Di bawah ini adalah alasan dan solusi.

Masalah

Ketika kita membuat koneksi database melalui koneksi renang mekanisme maka aplikasi server (dalam kasus kami ini adalah JBOSS) membuat koneksi seperti yang disebutkan di menit-parameter koneksi. Jika anda memiliki 10 aplikasi yang berjalan dan masing-masing memiliki min-koneksi 10 jadi total 100 sesi akan dibuat di database. Juga di setiap database ada max-sesi parameter, jika total koneksi melintasi perbatasan dari yang anda akan mendapatkan "Punya minus satu dari baca call" FYI: Gunakan query di bawah ini untuk melihat total sesi

SELECT username, count(username) FROM v$session 
WHERE username IS NOT NULL group by username

Solusi: Dengan bantuan dari kami DBA kita meningkat bahwa max-sesi sehingga semua aplikasi kami min-koneksi dapat menampung.

Komentar (1)

Saya ingin menambah Stephen C's jawaban, kasus saya berada di titik pertama. Jadi karena kita memiliki DHCP untuk mengalokasikan alamat IP di perusahaan, DHCP mengubah mesin's anda, tanpa tentu saja meminta baik saya maupun Oracle. Begitu keluar dari biru oracle menolak untuk melakukan sesuatu dan memberi minus satu ditakuti terkecuali. Jadi jika anda ingin solusi masalah ini sekali dan untuk selama-lamanya, dan sejak TCP.INVITED_NODES dari SQLNET.ora file tidak menerima wildcard seperti yang dinyatakan di sini, anda dapat menambahkan anda mesin's hostname bukan alamat IP.

Komentar (3)