it-swarm-id.com

Tidak ada lagi data untuk dibaca dari kesalahan soket

Kami menggunakan Oracle sebagai basis data untuk aplikasi Web kami. Sebagian besar aplikasi berjalan dengan baik, tetapi kami mendapatkan kesalahan "Tidak ada lagi data untuk dibaca dari soket".

Caused by: Java.sql.SQLRecoverableException: No more data to read from socket
    at Oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.Java:1142)
    at Oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.Java:1099)
    at Oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.Java:288)
    at Oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.Java:191)
    at Oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.Java:523)
    at Oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.Java:207)
    at Oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.Java:863)
    at Oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.Java:1153)
    at Oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.Java:1275)
    at Oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.Java:3576)
    at Oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.Java:3620)
    at Oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.Java:1491)
    at org.Apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.Java:93)
    at org.Apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.Java:93)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.Java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.Java:1869)
    at org.hibernate.loader.Loader.doQuery(Loader.Java:718)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.Java:270)
    at org.hibernate.loader.Loader.doList(Loader.Java:2449)
    ... 63 more

Kami menggunakan pegas, hibernasi dan saya memiliki yang berikut untuk sumber data dalam file konteks aplikasi saya.

<bean class="org.Apache.commons.dbcp.BasicDataSource"
        destroy-method="close" id="dataSource">
        <property name="driverClassName" value="${database.driverClassName}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
        <property name="defaultAutoCommit" value="false" />
        <property name="initialSize" value="10" />
        <property name="maxActive" value="30" />
        <property name="validationQuery" value="select 1 from dual" />
        <property name="testOnBorrow" value="true" />
        <property name="testOnReturn" value="true" />
        <property name="poolPreparedStatements" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="logAbandoned" value="true" />
    </bean>

Saya tidak yakin apakah ini karena kesalahan aplikasi, kesalahan basis data atau kesalahan jaringan. 

Kami melihat yang berikut ini di log Oracle

Thu Oct 20 10:29:44 2011
Errors in file d:\Oracle\diag\rdbms\ads\ads\trace\ads_ora_3836.trc  (incident=31653):
ORA-03137: TTC protocol internal error : [12333] [4] [195] [3] [] [] [] []
Incident details in: d:\Oracle\diag\rdbms\ads\ads\incident\incdir_31653\ads_ora_3836_i31653.trc
Thu Oct 20 10:29:45 2011
Trace dumping is performing id=[cdmp_20111020102945]
Thu Oct 20 10:29:49 2011
Sweep [inc][31653]: completed
Sweep [inc2][31653]: completed
Thu Oct 20 10:34:20 2011
Errors in file d:\Oracle\diag\rdbms\ads\ads\trace\ads_ora_860.trc  (incident=31645):
ORA-03137: TTC protocol internal error : [12333] [4] [195] [3] [] [] [] []
Incident details in: d:\Oracle\diag\rdbms\ads\ads\incident\incdir_31645\ads_ora_860_i31645.trc
Thu Oct 20 10:34:21 2011

Versi Oracle: 11.2.0.1.0

52
Kathir

Untuk kesalahan seperti ini, Anda harus melibatkan dukungan Oracle. Sayangnya Anda tidak menyebutkan rilis Oracle apa yang Anda gunakan. Kesalahan tersebut dapat dikaitkan dengan pengoptimal mengikat pengintaian. Tergantung pada versi Oracle solusi yang berbeda berlaku.

Anda memiliki dua cara untuk mengatasi ini:

  • tingkatkan ke 11.2
  • atur parameter Oracle _optim_peek_user_binds = false

Tentu saja, garis bawah parameter hanya boleh ditetapkan jika disarankan oleh dukungan Oracle

28
steve

Kami menghadapi masalah yang sama, kami menyelesaikannya dengan meningkatkan initialSize dan maxActive ukuran koneksi pool 

Anda dapat memeriksa tautan ini

Mungkin ini membantu seseorang.

8
fyelci

Kasus lain: Jika Anda mengirim parameter tanggal ke sql berparameter, pastikan Anda mengirim Java.sql.Timestamp dan bukan Java.util.Date. Kalau tidak, Anda dapatkan 

Java.sql.SQLRecoverableException: Tidak ada lagi data untuk dibaca dari socket

Pernyataan contoh: Dalam kode Java kami, kami menggunakan org.Apache.commons.dbutils dan kami memiliki yang berikut:

final String sqlStatement = "select x from person where date_of_birth between ? and ?";
Java.util.Date dtFrom = new Date(); //<-- this will fail
Java.util.Date dtTo = new Date();   //<-- this will fail
Object[] params = new Object[]{ dtFrom , dtTo };
final List mapList = (List) query.query(conn, sqlStatement, new MapListHandler(),params); 

Hal di atas gagal hingga kami mengubah parameter tanggal menjadi Java.sql.Timestamp

Java.sql.Timestamp tFrom = new Java.sql.Timestamp (dtFrom.getTime()); //<-- this is OK
Java.sql.Timestamp tTo = new Java.sql.Timestamp(dtTo.getTime());   //<-- this is OK
Object[] params = new Object[]{ tFrom , tTo };
final List mapList = (List) query.query(conn, sqlStatement, new MapListHandler(),params); 
5
chrisl08

Coba dua hal:

  1. Ditetapkan dalam $ Oracle_HOME/network/admin/tnsnames.ora pada server server Oracle = didedikasikan untuk server = dibagi untuk memungkinkan lebih dari satu koneksi sekaligus. Mulai ulang Oracle.
  2. Jika Anda menggunakan Java, ini mungkin membantu Anda: Di Java/jdk1.6.0_31/jre/lib/security/Java.security ubah securerandom.source=file:/dev/urandom menjadi securerandom.source=file:///dev/urandom
4
Richard

Saya memiliki masalah yang sama. Saya dapat menyelesaikan masalah dari sisi aplikasi, dalam skenario berikut:

JDK8, kerangka kerja 4.2.4.RELEASE, Apache Tomcat 7.0.63, Oracle Database 11g Edisi Enterprise 11.2.0.4.0

Saya menggunakan kumpulan koneksi database Apache Tomcat-jdbc:

Anda dapat menggunakan parameter konfigurasi berikut sebagai referensi:

<Resource name="jdbc/exampleDB"
      auth="Container"
      type="javax.sql.DataSource"
      factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory"
      testWhileIdle="true"
      testOnBorrow="true"
      testOnReturn="false"
      validationQuery="SELECT 1 FROM DUAL"
      validationInterval="30000"
      timeBetweenEvictionRunsMillis="30000"
      maxActive="100"
      minIdle="10"
      maxWait="10000"
      initialSize="10"
      removeAbandonedTimeout="60"
      removeAbandoned="true"
      logAbandoned="true"
      minEvictableIdleTimeMillis="30000"
      jmxEnabled="true"
      jdbcInterceptors="org.Apache.Tomcat.jdbc.pool.interceptor.ConnectionState;
        org.Apache.Tomcat.jdbc.pool.interceptor.StatementFinalizer"
      username="your-username"
      password="your-password"
      driverClassName="Oracle.jdbc.driver.OracleDriver"
      url="jdbc:Oracle:thin:@localhost:1521:xe"/>

Konfigurasi ini cukup untuk memperbaiki kesalahan. Ini berfungsi baik bagi saya dalam skenario yang disebutkan di atas.

Untuk detail lebih lanjut tentang pengaturan Apache Tomcat-jdbc: https://Tomcat.Apache.org/Tomcat-7.0-doc/jdbc-pool.html

4

Menurunkan versi JRE dari 7 menjadi 6 memperbaiki masalah ini untuk saya.

3
johndemic

Ini adalah pengecualian tingkat yang sangat rendah, yaitu ORA-17410.

Itu dapat terjadi karena beberapa alasan:

  1. Masalah sementara pada jaringan.

  2. Versi driver JDBC salah.

  3. Beberapa masalah dengan struktur data khusus (di sisi database).

  4. Bug basis data.

Dalam kasus saya, itu adalah bug yang kami temukan di database, yang perlu ditambal.

2
devwebcl

Dalam kasus kami, kami memiliki kueri yang memuat banyak item dengan pilih * dari x di mana sesuatu berada di (...). Permintaan valid tetapi teks sangat panjang. Mempersingkat permintaan memecahkan masalah.

0
mcelikkaya

Ya, seperti yang dikatakan @ggkmath, terkadang restart lama yang baik adalah yang Anda butuhkan. Seperti ketika "hubungi penulis dan minta dia menulis ulang aplikasi, sementara itu menunggu" bukanlah suatu pilihan.

Ini terjadi ketika suatu aplikasi tidak ditulis (belum) dengan cara yang dapat menangani me-restart database yang mendasarinya.

0
Jaroslav Záruba